diff --git a/src/main/java/fr/insee/genesis/controller/rest/responses/ModeController.java b/src/main/java/fr/insee/genesis/controller/rest/responses/ModeController.java index ac3b071d..cad33238 100644 --- a/src/main/java/fr/insee/genesis/controller/rest/responses/ModeController.java +++ b/src/main/java/fr/insee/genesis/controller/rest/responses/ModeController.java @@ -3,14 +3,17 @@ import fr.insee.genesis.controller.rest.CommonApiResponse; import fr.insee.genesis.domain.model.surveyunit.Mode; import fr.insee.genesis.domain.ports.api.SurveyUnitApiPort; +import fr.insee.genesis.exceptions.QuestionnaireNotFoundException; import io.swagger.v3.oas.annotations.Operation; import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; 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; +import java.util.Collections; import java.util.List; @RequestMapping(path = "/modes" ) @@ -29,8 +32,13 @@ public ModeController(SurveyUnitApiPort surveyUnitService) { @Operation(summary = "List sources/modes used for a given collection instrument (ex questionnaire)") @GetMapping(path = "/by-questionnaire") public ResponseEntity> getModesByQuestionnaire(@RequestParam("questionnaireId") String collectionInstrumentId) { - List modes = surveyUnitService.findModesByCollectionInstrumentId(collectionInstrumentId); - return ResponseEntity.ok(modes); + try { + List modes = surveyUnitService.findModesByCollectionInstrumentId(collectionInstrumentId); + return ResponseEntity.ok(modes); + } catch (QuestionnaireNotFoundException e) { + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(Collections.emptyList()); + } } @Operation(summary = "List sources/modes used for a given campaign") diff --git a/src/main/java/fr/insee/genesis/controller/rest/responses/ResponseController.java b/src/main/java/fr/insee/genesis/controller/rest/responses/ResponseController.java index 35068ad0..cb6c1f48 100644 --- a/src/main/java/fr/insee/genesis/controller/rest/responses/ResponseController.java +++ b/src/main/java/fr/insee/genesis/controller/rest/responses/ResponseController.java @@ -300,6 +300,7 @@ public ResponseEntity getLatestByInterrogationOneObject(@R .collectionInstrumentId(responses.getFirst().getCollectionInstrumentId()) .campaignId(responses.getFirst().getCampaignId()) .interrogationId(responses.getFirst().getInterrogationId()) + .mode(mode) .usualSurveyUnitId(responses.getFirst().getUsualSurveyUnitId()) .validationDate(validationDate) .questionnaireState(questionnaireState) diff --git a/src/main/java/fr/insee/genesis/domain/ports/api/LunaticJsonRawDataApiPort.java b/src/main/java/fr/insee/genesis/domain/ports/api/LunaticJsonRawDataApiPort.java index ba3e28a8..83ac6deb 100644 --- a/src/main/java/fr/insee/genesis/domain/ports/api/LunaticJsonRawDataApiPort.java +++ b/src/main/java/fr/insee/genesis/domain/ports/api/LunaticJsonRawDataApiPort.java @@ -21,6 +21,7 @@ public interface LunaticJsonRawDataApiPort { void save(LunaticJsonRawDataModel rawData); List getRawData(String campaignName, Mode mode, List interrogationIdList); + List getRawDataByQuestionnaireId(String questionnaireId, Mode mode, List interrogationIdList); List convertRawData(List rawData, VariablesMap variablesMap); List getUnprocessedDataIds(); Set getUnprocessedDataQuestionnaireIds(); diff --git a/src/main/java/fr/insee/genesis/domain/ports/spi/LunaticJsonRawDataPersistencePort.java b/src/main/java/fr/insee/genesis/domain/ports/spi/LunaticJsonRawDataPersistencePort.java index bbbf2951..17c7816f 100644 --- a/src/main/java/fr/insee/genesis/domain/ports/spi/LunaticJsonRawDataPersistencePort.java +++ b/src/main/java/fr/insee/genesis/domain/ports/spi/LunaticJsonRawDataPersistencePort.java @@ -15,6 +15,7 @@ public interface LunaticJsonRawDataPersistencePort { void save(LunaticJsonRawDataModel rawData); List findRawData(String campaignName, Mode mode, List interrogationIdList); + List findRawDataByQuestionnaireId(String questionnaireId, Mode mode, List interrogationIdList); List findRawDataByInterrogationID(String interrogationId); List getAllUnprocessedData(); void updateProcessDates(String campaignId, Set interrogationIds); diff --git a/src/main/java/fr/insee/genesis/domain/service/rawdata/LunaticJsonRawDataService.java b/src/main/java/fr/insee/genesis/domain/service/rawdata/LunaticJsonRawDataService.java index ad12d9b3..515cbeaf 100644 --- a/src/main/java/fr/insee/genesis/domain/service/rawdata/LunaticJsonRawDataService.java +++ b/src/main/java/fr/insee/genesis/domain/service/rawdata/LunaticJsonRawDataService.java @@ -101,6 +101,11 @@ public List getRawData(String campaignName, Mode mode, } @Override + public List getRawDataByQuestionnaireId(String questionnaireId, Mode mode, List interrogationIdList) { + return lunaticJsonRawDataPersistencePort.findRawDataByQuestionnaireId(questionnaireId, mode, interrogationIdList); + } + + @Override public List getRawDataByInterrogationId(String interrogationId) { return lunaticJsonRawDataPersistencePort.findRawDataByInterrogationID(interrogationId); } @@ -230,7 +235,7 @@ private VariablesMap getVariablesMap(String questionnaireId, Mode mode, List getConvertedSurveyUnits(String questionnaireId, Mode mode, List interrogationIdListForMode, int maxIndex, VariablesMap variablesMap) { List interrogationIdToProcess = interrogationIdListForMode.subList(0, maxIndex); - List rawData = getRawData(questionnaireId, mode, interrogationIdToProcess); + List rawData = getRawDataByQuestionnaireId(questionnaireId, mode, interrogationIdToProcess); return convertRawData( rawData, variablesMap diff --git a/src/main/java/fr/insee/genesis/domain/service/surveyunit/SurveyUnitService.java b/src/main/java/fr/insee/genesis/domain/service/surveyunit/SurveyUnitService.java index 6d6707d6..160f6196 100644 --- a/src/main/java/fr/insee/genesis/domain/service/surveyunit/SurveyUnitService.java +++ b/src/main/java/fr/insee/genesis/domain/service/surveyunit/SurveyUnitService.java @@ -20,6 +20,7 @@ import fr.insee.genesis.domain.service.metadata.QuestionnaireMetadataService; import fr.insee.genesis.domain.utils.GroupUtils; import fr.insee.genesis.exceptions.GenesisException; +import fr.insee.genesis.exceptions.QuestionnaireNotFoundException; import fr.insee.genesis.infrastructure.utils.FileUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -332,9 +333,12 @@ public List findInterrogationIdsAndModesByQuestionnaireId(Strin @Override public List findModesByCollectionInstrumentId(String collectionInstrumentId) { List surveyUnitModels = surveyUnitPersistencePort.findInterrogationIdsByCollectionInstrumentId(collectionInstrumentId); - List sources = new ArrayList<>(); - surveyUnitModels.forEach(surveyUnitModel -> sources.add(surveyUnitModel.getMode())); - return sources.stream().distinct().toList(); + if (surveyUnitModels == null || surveyUnitModels.isEmpty()) { + log.warn("No collectionInstrument found with id: {}", collectionInstrumentId); + throw new QuestionnaireNotFoundException(collectionInstrumentId); + } + List sources = surveyUnitModels.stream().map(SurveyUnitModel::getMode).distinct().toList(); + return sources; } @Override diff --git a/src/main/java/fr/insee/genesis/exceptions/QuestionnaireNotFoundException.java b/src/main/java/fr/insee/genesis/exceptions/QuestionnaireNotFoundException.java new file mode 100644 index 00000000..12d6760f --- /dev/null +++ b/src/main/java/fr/insee/genesis/exceptions/QuestionnaireNotFoundException.java @@ -0,0 +1,7 @@ +package fr.insee.genesis.exceptions; + +public class QuestionnaireNotFoundException extends RuntimeException { + public QuestionnaireNotFoundException(String questionnaireId) { + super("No questionnaire found with id: " + questionnaireId); + } +} diff --git a/src/main/java/fr/insee/genesis/infrastructure/adapter/LunaticJsonRawDataMongoAdapter.java b/src/main/java/fr/insee/genesis/infrastructure/adapter/LunaticJsonRawDataMongoAdapter.java index 5186ad27..df21dc60 100644 --- a/src/main/java/fr/insee/genesis/infrastructure/adapter/LunaticJsonRawDataMongoAdapter.java +++ b/src/main/java/fr/insee/genesis/infrastructure/adapter/LunaticJsonRawDataMongoAdapter.java @@ -61,7 +61,14 @@ public Set findModesByQuestionnaire(String questionnaireId) { @Override public List findRawData(String campaignName, Mode mode, List interrogationIdList) { - List rawDataDocs = repository.findModesByCampaignIdAndByModeAndinterrogationIdIninterrogationIdList(campaignName, mode, interrogationIdList);return LunaticJsonRawDataDocumentMapper.INSTANCE.listDocumentToListModel(rawDataDocs); + List rawDataDocs = repository.findByCampaignModeAndInterrogations(campaignName, mode, interrogationIdList); + return LunaticJsonRawDataDocumentMapper.INSTANCE.listDocumentToListModel(rawDataDocs); + } + + @Override + public List findRawDataByQuestionnaireId(String questionnaireId, Mode mode, List interrogationIdList) { + List rawDataDocs = repository.findByQuestionnaireModeAndInterrogations(questionnaireId, mode, interrogationIdList); + return LunaticJsonRawDataDocumentMapper.INSTANCE.listDocumentToListModel(rawDataDocs); } @Override diff --git a/src/main/java/fr/insee/genesis/infrastructure/repository/LunaticJsonMongoDBRepository.java b/src/main/java/fr/insee/genesis/infrastructure/repository/LunaticJsonMongoDBRepository.java index 5da38133..e069a515 100644 --- a/src/main/java/fr/insee/genesis/infrastructure/repository/LunaticJsonMongoDBRepository.java +++ b/src/main/java/fr/insee/genesis/infrastructure/repository/LunaticJsonMongoDBRepository.java @@ -37,7 +37,10 @@ public interface LunaticJsonMongoDBRepository extends MongoRepository findModesByQuestionnaireId(String questionnaireId); @Query(value = "{ 'campaignId' : ?0, 'mode' : ?1, 'interrogationId': {$in: ?2} }") - List findModesByCampaignIdAndByModeAndinterrogationIdIninterrogationIdList(String campaignName, Mode mode, List interrogationIdList); + List findByCampaignModeAndInterrogations(String campaignName, Mode mode, List interrogationIdList); + + @Query(value = "{ 'questionnaireId' : ?0, 'mode' : ?1, 'interrogationId': {$in: ?2} }") + List findByQuestionnaireModeAndInterrogations(String questionnaireId, Mode mode, List interrogationIdList); @Query(value = "{ 'interrogationId': ?0}") List findByInterrogationId(String interrogationId); diff --git a/src/test/java/fr/insee/genesis/stubs/LunaticJsonMongoDBRepositoryStub.java b/src/test/java/fr/insee/genesis/stubs/LunaticJsonMongoDBRepositoryStub.java index 27b86bd1..ff60aa74 100644 --- a/src/test/java/fr/insee/genesis/stubs/LunaticJsonMongoDBRepositoryStub.java +++ b/src/test/java/fr/insee/genesis/stubs/LunaticJsonMongoDBRepositoryStub.java @@ -61,7 +61,7 @@ public List findModesByQuestionnaireId(String questionnaireId) { } @Override - public List findModesByCampaignIdAndByModeAndinterrogationIdIninterrogationIdList( + public List findByCampaignModeAndInterrogations( String campaignName, Mode mode, List interrogationIdList) { return documents.stream() .filter(doc -> Objects.equals(doc.campaignId(), campaignName) @@ -70,6 +70,15 @@ public List findModesByCampaignIdAndByModeAndinterro .toList(); } + @Override + public List findByQuestionnaireModeAndInterrogations(String questionnaireId, Mode mode, List interrogationIdList) { + return documents.stream() + .filter(doc -> Objects.equals(doc.questionnaireId(), questionnaireId) + && Objects.equals(doc.mode(), mode) + && interrogationIdList.contains(doc.interrogationId())) + .toList(); + } + @Override public List findByInterrogationId(String interrogationId) { return documents.stream() diff --git a/src/test/java/fr/insee/genesis/stubs/LunaticJsonRawDataPersistanceStub.java b/src/test/java/fr/insee/genesis/stubs/LunaticJsonRawDataPersistanceStub.java index abaa729b..5cfa4a01 100644 --- a/src/test/java/fr/insee/genesis/stubs/LunaticJsonRawDataPersistanceStub.java +++ b/src/test/java/fr/insee/genesis/stubs/LunaticJsonRawDataPersistanceStub.java @@ -75,6 +75,16 @@ public List findRawData(String campaignName, Mode mode, return LunaticJsonRawDataDocumentMapper.INSTANCE.listDocumentToListModel(docs); } + @Override + public List findRawDataByQuestionnaireId(String questionnaireId, Mode mode, List interrogationIdList) { + List docs = mongoStub.stream().filter(lunaticJsonRawDataDocument -> + lunaticJsonRawDataDocument.questionnaireId().equals(questionnaireId) + && lunaticJsonRawDataDocument.mode().equals(mode) + && interrogationIdList.contains(lunaticJsonRawDataDocument.interrogationId()) + ).toList(); + return LunaticJsonRawDataDocumentMapper.INSTANCE.listDocumentToListModel(docs); } + + @Override public List findRawDataByInterrogationID(String interrogationId) { List docs = mongoStub.stream()