From 010a7c12342a04e36c3b091e5df9500d9a7e7428 Mon Sep 17 00:00:00 2001 From: Hajar El Moukh Date: Wed, 10 Dec 2025 16:23:42 +0100 Subject: [PATCH 1/2] Fix Process raw data by questionId --- .../controller/rest/responses/ModeController.java | 12 ++++++++++-- .../rest/responses/ResponseController.java | 1 + .../domain/ports/api/LunaticJsonRawDataApiPort.java | 1 + .../ports/spi/LunaticJsonRawDataPersistencePort.java | 1 + .../service/rawdata/LunaticJsonRawDataService.java | 7 ++++++- .../domain/service/surveyunit/SurveyUnitService.java | 10 +++++++--- .../exceptions/QuestionnaireNotFoundException.java | 7 +++++++ .../adapter/LunaticJsonRawDataMongoAdapter.java | 9 ++++++++- .../repository/LunaticJsonMongoDBRepository.java | 5 ++++- .../stubs/LunaticJsonMongoDBRepositoryStub.java | 11 ++++++++++- .../stubs/LunaticJsonRawDataPersistanceStub.java | 9 +++++++++ 11 files changed, 64 insertions(+), 9 deletions(-) create mode 100644 src/main/java/fr/insee/genesis/exceptions/QuestionnaireNotFoundException.java 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 d7fef093..9b4b8965 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 questionnaire") @GetMapping(path = "/by-questionnaire") public ResponseEntity> getModesByQuestionnaire(@RequestParam("questionnaireId") String questionnaireId) { - List modes = surveyUnitService.findModesByQuestionnaireId(questionnaireId); - return ResponseEntity.ok(modes); + try { + List modes = surveyUnitService.findModesByQuestionnaireId(questionnaireId); + 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 bf0a6dea..059546a9 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 @@ -252,6 +252,7 @@ public ResponseEntity getLatestByInterrogationOneObject(@R .campaignId(responses.getFirst().getCampaignId()) .interrogationId(responses.getFirst().getInterrogationId()) .surveyUnitId(responses.getFirst().getIdUE()) + .mode(mode) .variablesUpdate(outputVariables) .externalVariables(outputExternalVariables) .build()); 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 e8bad50c..31f0c6dd 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(); void updateProcessDates(List surveyUnitModels); 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 399fefde..96c87ffe 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 getAllUnprocessedData(); void updateProcessDates(String campaignId, Set interrogationIds); Set findDistinctQuestionnaireIds(); 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 2134f67a..7ea9240f 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 @@ -99,6 +99,11 @@ public List getRawData(String campaignName, Mode mode, return lunaticJsonRawDataPersistencePort.findRawData(campaignName, mode, interrogationIdList); } + @Override + public List getRawDataByQuestionnaireId(String questionnaireId, Mode mode, List interrogationIdList) { + return lunaticJsonRawDataPersistencePort.findRawDataByQuestionnaireId(questionnaireId, mode, interrogationIdList); + } + @Override @Deprecated(since = "1.13.0") public DataProcessResult processRawData(String campaignName, List interrogationIdList, List errors) throws GenesisException { @@ -224,7 +229,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 91b35e0c..4773a1bb 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; @@ -336,9 +337,12 @@ public List findInterrogationIdsAndModesByQuestionnaireId(Strin @Override public List findModesByQuestionnaireId(String questionnaireId) { List surveyUnitModels = surveyUnitPersistencePort.findInterrogationIdsByQuestionnaireId(questionnaireId); - List sources = new ArrayList<>(); - surveyUnitModels.forEach(surveyUnitModel -> sources.add(surveyUnitModel.getMode())); - return sources.stream().distinct().toList(); + if (surveyUnitModels == null || surveyUnitModels.isEmpty()) { + log.warn("No questionnaire found with id: {}", questionnaireId); + throw new QuestionnaireNotFoundException(questionnaireId); + } + 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 9dc510bf..a70bd12e 100644 --- a/src/main/java/fr/insee/genesis/infrastructure/adapter/LunaticJsonRawDataMongoAdapter.java +++ b/src/main/java/fr/insee/genesis/infrastructure/adapter/LunaticJsonRawDataMongoAdapter.java @@ -52,7 +52,14 @@ public List getAllUnprocessedData() { @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 58486bae..776b97c6 100644 --- a/src/main/java/fr/insee/genesis/infrastructure/repository/LunaticJsonMongoDBRepository.java +++ b/src/main/java/fr/insee/genesis/infrastructure/repository/LunaticJsonMongoDBRepository.java @@ -24,7 +24,10 @@ public interface LunaticJsonMongoDBRepository extends MongoRepository findModesByCampaignId(String campaignId); @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); Page findByCampaignIdAndRecordDateBetween(String campagneId, Instant start, Instant end, Pageable pageable); long countByQuestionnaireId(String questionnaireId); diff --git a/src/test/java/fr/insee/genesis/stubs/LunaticJsonMongoDBRepositoryStub.java b/src/test/java/fr/insee/genesis/stubs/LunaticJsonMongoDBRepositoryStub.java index 7a0017a1..48055646 100644 --- a/src/test/java/fr/insee/genesis/stubs/LunaticJsonMongoDBRepositoryStub.java +++ b/src/test/java/fr/insee/genesis/stubs/LunaticJsonMongoDBRepositoryStub.java @@ -47,7 +47,7 @@ public List findModesByCampaignId(String campaignId) { } @Override - public List findModesByCampaignIdAndByModeAndinterrogationIdIninterrogationIdList( + public List findByCampaignModeAndInterrogations( String campaignName, Mode mode, List interrogationIdList) { return documents.stream() .filter(doc -> Objects.equals(doc.campaignId(), campaignName) @@ -56,6 +56,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 Page findByCampaignIdAndRecordDateBetween(String campagneId, Instant start, Instant end, Pageable pageable){ return Page.empty(pageable); diff --git a/src/test/java/fr/insee/genesis/stubs/LunaticJsonRawDataPersistanceStub.java b/src/test/java/fr/insee/genesis/stubs/LunaticJsonRawDataPersistanceStub.java index c7244925..e16df681 100644 --- a/src/test/java/fr/insee/genesis/stubs/LunaticJsonRawDataPersistanceStub.java +++ b/src/test/java/fr/insee/genesis/stubs/LunaticJsonRawDataPersistanceStub.java @@ -52,6 +52,15 @@ 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 void updateProcessDates(String campaignId, Set interrogationIds) { From aed130c5cee4f9f1d14ba5b2bda80792ee6b72a0 Mon Sep 17 00:00:00 2001 From: QDIBYS Date: Wed, 7 Jan 2026 13:29:15 +0100 Subject: [PATCH 2/2] fix: fixes after merge --- .../insee/genesis/controller/rest/responses/ModeController.java | 2 +- .../insee/genesis/stubs/LunaticJsonMongoDBRepositoryStub.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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 a2ff1ed7..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 @@ -33,7 +33,7 @@ public ModeController(SurveyUnitApiPort surveyUnitService) { @GetMapping(path = "/by-questionnaire") public ResponseEntity> getModesByQuestionnaire(@RequestParam("questionnaireId") String collectionInstrumentId) { try { - List modes = surveyUnitService.findModesByQuestionnaireId(collectionInstrumentId); + List modes = surveyUnitService.findModesByCollectionInstrumentId(collectionInstrumentId); return ResponseEntity.ok(modes); } catch (QuestionnaireNotFoundException e) { return ResponseEntity.status(HttpStatus.NOT_FOUND) diff --git a/src/test/java/fr/insee/genesis/stubs/LunaticJsonMongoDBRepositoryStub.java b/src/test/java/fr/insee/genesis/stubs/LunaticJsonMongoDBRepositoryStub.java index 1c7cada2..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)