-
Notifications
You must be signed in to change notification settings - Fork 4
Dev/combined rawdata #367
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Dev/combined rawdata #367
Changes from 3 commits
f89d126
8b9e84c
b850c95
d1281a0
eb544da
6acffa2
5ad43ab
c2aae1b
da809cd
15aa1cc
bfa305c
4aa5765
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,41 @@ | ||
| package fr.insee.genesis.controller.rest; | ||
|
|
||
| import fr.insee.genesis.domain.model.surveyunit.rawdata.CombinedRawData; | ||
| import fr.insee.genesis.domain.service.rawdata.CombinedRawDataService; | ||
| import fr.insee.genesis.exceptions.GenesisException; | ||
| import io.swagger.v3.oas.annotations.Operation; | ||
| import lombok.extern.slf4j.Slf4j; | ||
| import org.springframework.http.ResponseEntity; | ||
| import org.springframework.security.access.prepost.PreAuthorize; | ||
| import org.springframework.stereotype.Controller; | ||
| import org.springframework.web.bind.annotation.GetMapping; | ||
| import org.springframework.web.bind.annotation.RequestMapping; | ||
| import org.springframework.web.bind.annotation.RequestParam; | ||
|
|
||
| @Slf4j | ||
| @Controller | ||
| @RequestMapping(path = "/combined-raw-data" ) | ||
| public class CombinedRawDataController { | ||
|
|
||
| private static final String INTERROGATION_ID = "interrogationId"; | ||
| private final CombinedRawDataService combinedRawDataService; | ||
|
|
||
| public CombinedRawDataController(CombinedRawDataService combinedRawDataService) { | ||
| this.combinedRawDataService = combinedRawDataService; | ||
| } | ||
|
|
||
| @Operation(summary = "Retrieve combined raw responses and Lunatic raw data for a given interrogationId") | ||
| @GetMapping | ||
| @PreAuthorize("hasAnyRole('ADMIN', 'USER_PLATINE')") | ||
| public ResponseEntity<CombinedRawData> getCombinetRawData( | ||
| @RequestParam(INTERROGATION_ID) String interrogationId | ||
| ){CombinedRawData data = combinedRawDataService.getCombinedRawDataByInterrogationId(interrogationId); | ||
|
||
|
|
||
| if (data.rawResponses().isEmpty()) { | ||
| return ResponseEntity.notFound().build(); | ||
| } | ||
|
|
||
| return ResponseEntity.ok(data); | ||
| } | ||
|
|
||
| } | ||
|
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,7 @@ | ||
| package fr.insee.genesis.domain.model.surveyunit.rawdata; | ||
|
|
||
| import java.util.List; | ||
|
|
||
| public record CombinedRawData(List<RawResponse> rawResponses, | ||
| List<LunaticJsonRawDataModel> lunaticRawData) { | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,35 @@ | ||
| package fr.insee.genesis.domain.service.rawdata; | ||
|
|
||
| import fr.insee.genesis.domain.model.surveyunit.rawdata.CombinedRawData; | ||
| import fr.insee.genesis.domain.model.surveyunit.rawdata.LunaticJsonRawDataModel; | ||
| import fr.insee.genesis.domain.model.surveyunit.rawdata.RawResponse; | ||
| import fr.insee.genesis.domain.ports.spi.LunaticJsonRawDataPersistencePort; | ||
| import fr.insee.genesis.domain.ports.spi.RawResponsePersistencePort; | ||
| import lombok.extern.slf4j.Slf4j; | ||
| import org.springframework.beans.factory.annotation.Qualifier; | ||
| import org.springframework.stereotype.Service; | ||
|
|
||
| import java.util.List; | ||
|
|
||
| @Service | ||
| @Slf4j | ||
| public class CombinedRawDataService { | ||
|
|
||
| @Qualifier("lunaticJsonMongoAdapterNew") | ||
|
||
| private final LunaticJsonRawDataPersistencePort lunaticJsonRawDataPersistencePort; | ||
| @Qualifier("rawResponseMongoAdapter") | ||
| private final RawResponsePersistencePort rawResponsePersistencePort; | ||
|
|
||
| public CombinedRawDataService(LunaticJsonRawDataPersistencePort lunaticJsonRawDataPersistencePort, RawResponsePersistencePort rawResponsePersistencePort) { | ||
|
||
| this.lunaticJsonRawDataPersistencePort = lunaticJsonRawDataPersistencePort; | ||
| this.rawResponsePersistencePort = rawResponsePersistencePort; | ||
| } | ||
|
|
||
| public CombinedRawData getCombinedRawDataByInterrogationId(String interrogationId) { | ||
| List<RawResponse> rawResponses = rawResponsePersistencePort.findRawResponsesByInterrogationID(interrogationId); | ||
| List<LunaticJsonRawDataModel> lunaticRawData = lunaticJsonRawDataPersistencePort.findRawDataByInterrogationID(interrogationId); | ||
|
|
||
| return new CombinedRawData(rawResponses, lunaticRawData); | ||
| } | ||
|
|
||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -26,6 +26,9 @@ public interface LunaticJsonMongoDBRepository extends MongoRepository<LunaticJso | |
| @Query(value = "{ 'campaignId' : ?0, 'mode' : ?1, 'interrogationId': {$in: ?2} }") | ||
| List<LunaticJsonRawDataDocument> findModesByCampaignIdAndByModeAndinterrogationIdIninterrogationIdList(String campaignName, Mode mode, List<String> interrogationIdList); | ||
|
|
||
| @Query(value = "{ 'interrogationId': ?0}") | ||
| List<LunaticJsonRawDataDocument> findByInterrogationId(String interrogationId); | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. todo: add @indexed to interrogationId in LunaticJsonRawDataDocument |
||
|
|
||
| Page<LunaticJsonRawDataDocument> findByCampaignIdAndRecordDateBetween(String campagneId, Instant start, Instant end, Pageable pageable); | ||
| long countByQuestionnaireId(String questionnaireId); | ||
| @Aggregation(pipeline = { | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -26,4 +26,6 @@ public interface RawResponseRepository extends MongoRepository<RawResponseDocume | |
| }) | ||
| List<String> findInterrogationIdByCollectionInstrumentIdAndProcessDateIsNull(String collectionInstrumentId); | ||
|
|
||
| @Query(value = "{ 'interrogationId': ?0}") | ||
| List<RawResponseDocument> findByInterrogationId(String interrogationId); | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. todo: add "@indexed" to interrogationId in rawResponseDocument |
||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,100 @@ | ||
| package fr.insee.genesis.domain.service.rawdata; | ||
|
|
||
| import fr.insee.genesis.domain.model.surveyunit.Mode; | ||
| import fr.insee.genesis.domain.model.surveyunit.rawdata.CombinedRawData; | ||
| import fr.insee.genesis.domain.model.surveyunit.rawdata.LunaticJsonRawDataModel; | ||
| import fr.insee.genesis.domain.model.surveyunit.rawdata.RawResponse; | ||
| import fr.insee.genesis.domain.ports.spi.LunaticJsonRawDataPersistencePort; | ||
| import fr.insee.genesis.domain.ports.spi.RawResponsePersistencePort; | ||
| import org.assertj.core.api.Assertions; | ||
| import org.bson.types.ObjectId; | ||
| import org.junit.jupiter.api.Test; | ||
| import org.junit.jupiter.api.extension.ExtendWith; | ||
| import org.mockito.InjectMocks; | ||
| import org.mockito.Mock; | ||
| import org.mockito.Mockito; | ||
| import org.mockito.junit.jupiter.MockitoExtension; | ||
|
|
||
| import java.time.LocalDateTime; | ||
| import java.util.List; | ||
| import java.util.Map; | ||
|
|
||
| @ExtendWith(MockitoExtension.class) | ||
| class CombinedRawDataServiceTest { | ||
|
|
||
| @Mock | ||
| LunaticJsonRawDataPersistencePort lunaticJsonRawDataPersistencePort; | ||
|
|
||
| @Mock | ||
| RawResponsePersistencePort rawResponsePersistencePort; | ||
|
|
||
| @InjectMocks | ||
| CombinedRawDataService combinedRawDataService; | ||
|
|
||
| @Test | ||
| void getCombinedRawDataByInterrogationId_shouldReturnCombinedData() { | ||
| // GIVEN | ||
| String interrogationId = "INTERROGATION_1"; | ||
|
|
||
| // Mock des RawResponses | ||
| RawResponse response1 = new RawResponse( | ||
| new ObjectId(), | ||
| interrogationId, | ||
| "COLLECTION_1", | ||
| Mode.WEB, | ||
| Map.of("question1", "answer1"), | ||
| LocalDateTime.now(), | ||
| null | ||
| ); | ||
|
|
||
| RawResponse response2 = new RawResponse( | ||
| new ObjectId(), | ||
| interrogationId, | ||
| "COLLECTION_1", | ||
| Mode.WEB, | ||
| Map.of("question2", "answer2"), | ||
| LocalDateTime.now(), | ||
| null | ||
| ); | ||
|
|
||
| List<RawResponse> rawResponses = List.of(response1, response2); | ||
|
|
||
| // Mock des LunaticJsonRawData | ||
| LunaticJsonRawDataModel lunatic1 = LunaticJsonRawDataModel.builder() | ||
| .campaignId("CAMPAIGN") | ||
| .questionnaireId("QUESTIONNAIRE") | ||
| .interrogationId(interrogationId) | ||
| .data(Map.of("key", "value")) | ||
| .mode(Mode.WEB) | ||
| .build(); | ||
| List<LunaticJsonRawDataModel> lunaticRawData = List.of(lunatic1); | ||
|
|
||
| // WHEN | ||
| Mockito.when(rawResponsePersistencePort.findRawResponsesByInterrogationID(interrogationId)) | ||
| .thenReturn(rawResponses); | ||
|
|
||
| Mockito.when(lunaticJsonRawDataPersistencePort.findRawDataByInterrogationID(interrogationId)) | ||
| .thenReturn(lunaticRawData); | ||
|
|
||
| CombinedRawData result = combinedRawDataService.getCombinedRawDataByInterrogationId(interrogationId); | ||
|
|
||
| // THEN - assertions | ||
| Assertions.assertThat(result.rawResponses()).hasSize(2).containsExactlyInAnyOrderElementsOf(rawResponses); | ||
| Assertions.assertThat(result.lunaticRawData()).hasSize(1).containsExactlyInAnyOrderElementsOf(lunaticRawData); | ||
| } | ||
|
|
||
| @Test | ||
| void getCombinedRawData_shouldHandleEmptyLists() { | ||
| String interrogationId = "INTERROGATION_EMPTY"; | ||
|
|
||
| Mockito.when(rawResponsePersistencePort.findRawResponsesByInterrogationID(interrogationId)) | ||
| .thenReturn(List.of()); | ||
| Mockito.when(lunaticJsonRawDataPersistencePort.findRawDataByInterrogationID(interrogationId)) | ||
| .thenReturn(List.of()); | ||
| CombinedRawData result = combinedRawDataService.getCombinedRawDataByInterrogationId(interrogationId); | ||
|
|
||
| Assertions.assertThat(result.rawResponses()).isEmpty(); | ||
| Assertions.assertThat(result.lunaticRawData()).isEmpty(); | ||
| } | ||
|
|
||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Use annotation @requiredargsconstructor