From 3d014197a1bcfbd85564161353e6259e8bc0f1c1 Mon Sep 17 00:00:00 2001 From: Hajarel-moukh Date: Wed, 4 Feb 2026 13:39:48 +0100 Subject: [PATCH 1/4] add new end point --- .../rest/responses/ResponseController.java | 12 ++++++++++++ .../genesis/domain/ports/api/SurveyUnitApiPort.java | 4 +++- .../domain/ports/spi/SurveyUnitPersistencePort.java | 4 +++- .../domain/service/surveyunit/SurveyUnitService.java | 5 +++++ .../adapter/SurveyUnitMongoAdapter.java | 10 +++++++++- .../repository/SurveyUnitMongoDBRepository.java | 3 +++ .../rest/responses/ResponseControllerTest.java | 11 +++++++++++ .../genesis/stubs/SurveyUnitPersistencePortStub.java | 11 +++++++++++ 8 files changed, 57 insertions(+), 3 deletions(-) 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 cb6c1f48..170cbbea 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 @@ -213,6 +213,18 @@ public ResponseEntity> findResponsesByInterrogationAndColl return ResponseEntity.ok(responses); } + //GET + @Operation(summary = "Retrieve responses for an interrogation, using usualSurveyUnitId and collectionInstrumentId (formerly questionnaireId) from Genesis Database") + @GetMapping(path = "/by-usual-SurveyUnit-and-collection-instrument") + @PreAuthorize("hasRole('ADMIN')") + public ResponseEntity> findResponsesByUsualSurveyUnitAndCollectionInstrument( + @RequestParam("usualSurveyUnitId") String usualSurveyUnitId, + @RequestParam("collectionInstrumentId") String collectionInstrumentId) + { + List responses = surveyUnitService.findByIdsUsualSurveyUnitAndCollectionInstrument(usualSurveyUnitId, collectionInstrumentId); + return ResponseEntity.ok(responses); + } + /** * @deprecated * This endpoint is deprecated because the parameter `questionnaireId` has been renamed diff --git a/src/main/java/fr/insee/genesis/domain/ports/api/SurveyUnitApiPort.java b/src/main/java/fr/insee/genesis/domain/ports/api/SurveyUnitApiPort.java index 7a65a943..d98b0886 100644 --- a/src/main/java/fr/insee/genesis/domain/ports/api/SurveyUnitApiPort.java +++ b/src/main/java/fr/insee/genesis/domain/ports/api/SurveyUnitApiPort.java @@ -19,7 +19,9 @@ public interface SurveyUnitApiPort { void saveSurveyUnits(List suList); - List findByIdsInterrogationAndCollectionInstrument(String interrogationId, String questionnaireId); + List findByIdsInterrogationAndCollectionInstrument(String interrogationId, String collectionInstrumentId); + + List findByIdsUsualSurveyUnitAndCollectionInstrument(String usualSurveyUnitId, String collectionInstrumentId); List findByInterrogationId(String interrogationId); diff --git a/src/main/java/fr/insee/genesis/domain/ports/spi/SurveyUnitPersistencePort.java b/src/main/java/fr/insee/genesis/domain/ports/spi/SurveyUnitPersistencePort.java index 21986d55..b8dd0fd4 100644 --- a/src/main/java/fr/insee/genesis/domain/ports/spi/SurveyUnitPersistencePort.java +++ b/src/main/java/fr/insee/genesis/domain/ports/spi/SurveyUnitPersistencePort.java @@ -11,7 +11,9 @@ public interface SurveyUnitPersistencePort { void saveAll(List suList); - List findByIds(String interrogationId, String questionnaireId); + List findByIds(String interrogationId, String collectionInstrumentId); + + List findByUsualSurveyUnitAndCollectionInstrumentIds(String usualSurveyUnitId, String collectionInstrumentId); //========= OPTIMISATIONS PERFS (START) ========== /** 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 160f6196..1805db60 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 @@ -64,6 +64,11 @@ public List findByIdsInterrogationAndCollectionInstrument(Strin return surveyUnitPersistencePort.findByIds(interrogationId, collectionInstrumentId); } + @Override + public List findByIdsUsualSurveyUnitAndCollectionInstrument(String usualSurveyUnitId, String collectionInstrumentId) { + return surveyUnitPersistencePort.findByUsualSurveyUnitAndCollectionInstrumentIds(usualSurveyUnitId, collectionInstrumentId); + } + @Override public List findByInterrogationId(String interrogationId) { return surveyUnitPersistencePort.findByInterrogationId(interrogationId); diff --git a/src/main/java/fr/insee/genesis/infrastructure/adapter/SurveyUnitMongoAdapter.java b/src/main/java/fr/insee/genesis/infrastructure/adapter/SurveyUnitMongoAdapter.java index 50f27f76..ad93b983 100644 --- a/src/main/java/fr/insee/genesis/infrastructure/adapter/SurveyUnitMongoAdapter.java +++ b/src/main/java/fr/insee/genesis/infrastructure/adapter/SurveyUnitMongoAdapter.java @@ -56,8 +56,16 @@ public List findByIds(String interrogationId, String collection return results.isEmpty() ? Collections.emptyList() : SurveyUnitDocumentMapper.INSTANCE.listDocumentToListModel(results); } + @Override + public List findByUsualSurveyUnitAndCollectionInstrumentIds(String usualSurveyUnitId, String collectionInstrumentId) { + List results = new ArrayList<>(); + results.addAll(mongoRepository.findByUsualSurveyUnitIdAndCollectionInstrumentId(usualSurveyUnitId, collectionInstrumentId)); + // To ensure compatibility with older documents (with questionnaireId instead of collectionInstrumentId) + results.addAll(mongoRepository.findByUsualSurveyUnitIdAndQuestionnaireId(usualSurveyUnitId, collectionInstrumentId)); + return results.isEmpty() ? Collections.emptyList() : SurveyUnitDocumentMapper.INSTANCE.listDocumentToListModel(results); } - //========= OPTIMISATIONS PERFS (START) ========== + + //========= OPTIMISATIONS PERFS (START) ========== /** * @author Adrien Marchal */ diff --git a/src/main/java/fr/insee/genesis/infrastructure/repository/SurveyUnitMongoDBRepository.java b/src/main/java/fr/insee/genesis/infrastructure/repository/SurveyUnitMongoDBRepository.java index a23283fe..f56d1a0f 100644 --- a/src/main/java/fr/insee/genesis/infrastructure/repository/SurveyUnitMongoDBRepository.java +++ b/src/main/java/fr/insee/genesis/infrastructure/repository/SurveyUnitMongoDBRepository.java @@ -20,6 +20,9 @@ public interface SurveyUnitMongoDBRepository extends MongoRepository findByInterrogationIdAndQuestionnaireId(String interrogationId, String questionnaireId); List findByInterrogationIdAndCollectionInstrumentId(String interrogationId, String collectionInstrumentId); + List findByUsualSurveyUnitIdAndCollectionInstrumentId(String usualSurveyUnitId, String collectionInstrumentId); + List findByUsualSurveyUnitIdAndQuestionnaireId(String usualSurveyUnitId, String questionnaireId); + //========= OPTIMISATIONS PERFS (START) ========== /** * @author Adrien Marchal diff --git a/src/test/java/fr/insee/genesis/controller/rest/responses/ResponseControllerTest.java b/src/test/java/fr/insee/genesis/controller/rest/responses/ResponseControllerTest.java index 30bfafe8..a6ccd3cd 100644 --- a/src/test/java/fr/insee/genesis/controller/rest/responses/ResponseControllerTest.java +++ b/src/test/java/fr/insee/genesis/controller/rest/responses/ResponseControllerTest.java @@ -160,6 +160,17 @@ void findResponsesByUEAndQuestionnaireTest() { Assertions.assertThat(response.getBody().getFirst().getCollectionInstrumentId()).isEqualTo(DEFAULT_COLLECTION_INSTRUMENT_ID); } + @Test + void findResponsesByUsualSurveyUnitAndQuestionnaireTest() { + ResponseEntity> response = responseControllerStatic.findResponsesByUsualSurveyUnitAndCollectionInstrument(DEFAULT_SURVEY_UNIT_ID, DEFAULT_COLLECTION_INSTRUMENT_ID); + + Assertions.assertThat(response.getStatusCode().is2xxSuccessful()).isTrue(); + Assertions.assertThat(response.getBody()).isNotNull().isNotEmpty(); + Assertions.assertThat(response.getBody().getFirst().getInterrogationId()).isEqualTo(DEFAULT_INTERROGATION_ID); + Assertions.assertThat(response.getBody().getFirst().getUsualSurveyUnitId()).isEqualTo(DEFAULT_SURVEY_UNIT_ID); + Assertions.assertThat(response.getBody().getFirst().getCollectionInstrumentId()).isEqualTo(DEFAULT_COLLECTION_INSTRUMENT_ID); + } + @Test void getLatestByUETest() { Utils.addAdditionalSurveyUnitModelToMongoStub(surveyUnitPersistencePortStub); diff --git a/src/test/java/fr/insee/genesis/stubs/SurveyUnitPersistencePortStub.java b/src/test/java/fr/insee/genesis/stubs/SurveyUnitPersistencePortStub.java index 0dfeda2c..a377bbe9 100644 --- a/src/test/java/fr/insee/genesis/stubs/SurveyUnitPersistencePortStub.java +++ b/src/test/java/fr/insee/genesis/stubs/SurveyUnitPersistencePortStub.java @@ -31,6 +31,17 @@ public List findByIds(String interrogationId, String collection return surveyUnitModelList; } + @Override + public List findByUsualSurveyUnitAndCollectionInstrumentIds(String usualSurveyUnitId, String collectionInstrumentId) { + List surveyUnitModelList = new ArrayList<>(); + for(SurveyUnitModel SurveyUnitModel : mongoStub){ + if(SurveyUnitModel.getUsualSurveyUnitId().equals(usualSurveyUnitId) && SurveyUnitModel.getCollectionInstrumentId().equals(collectionInstrumentId)) + surveyUnitModelList.add(SurveyUnitModel); + } + + return surveyUnitModelList; + } + //========= OPTIMISATIONS PERFS (START) ========== /** * @author Adrien Marchal From b71a34fd68470090aeba5bfa5104a73bb0e67ffb Mon Sep 17 00:00:00 2001 From: Hajarel-moukh Date: Wed, 4 Feb 2026 16:08:45 +0100 Subject: [PATCH 2/4] add a test --- .../service/surveyunit/SurveyUnitServiceTest.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/test/java/fr/insee/genesis/domain/service/surveyunit/SurveyUnitServiceTest.java b/src/test/java/fr/insee/genesis/domain/service/surveyunit/SurveyUnitServiceTest.java index b48ca352..6040c2f3 100644 --- a/src/test/java/fr/insee/genesis/domain/service/surveyunit/SurveyUnitServiceTest.java +++ b/src/test/java/fr/insee/genesis/domain/service/surveyunit/SurveyUnitServiceTest.java @@ -25,6 +25,7 @@ import static fr.insee.genesis.TestConstants.DEFAULT_COLLECTION_INSTRUMENT_ID; import static fr.insee.genesis.TestConstants.DEFAULT_INTERROGATION_ID; +import static fr.insee.genesis.TestConstants.DEFAULT_SURVEY_UNIT_ID; class SurveyUnitServiceTest { @@ -80,6 +81,7 @@ void reset(){ surveyUnitPersistencePortStub.getMongoStub().add(SurveyUnitModel.builder() .campaignId("TEST-TABLEAUX") .mode(Mode.WEB) + .usualSurveyUnitId(DEFAULT_SURVEY_UNIT_ID) .interrogationId(DEFAULT_INTERROGATION_ID) .collectionInstrumentId(DEFAULT_COLLECTION_INSTRUMENT_ID) .state(DataState.COLLECTED) @@ -133,6 +135,7 @@ void saveAllTest(){ SurveyUnitModel.builder() .campaignId("TEST-TABLEAUX") .mode(Mode.WEB) + .usualSurveyUnitId(DEFAULT_SURVEY_UNIT_ID) .interrogationId("TESTINTERROGATIONID2") .collectionInstrumentId(DEFAULT_COLLECTION_INSTRUMENT_ID) .state(DataState.COLLECTED) @@ -175,6 +178,15 @@ void findByIdsUEAndQuestionnaireTest(){ ).isNotEmpty(); } + @Test + void findByIdsUsualSurveyUnitAndCollectionInstrumentTest(){ + Assertions.assertThat(surveyUnitServiceStatic.findByIdsUsualSurveyUnitAndCollectionInstrument(DEFAULT_SURVEY_UNIT_ID, DEFAULT_COLLECTION_INSTRUMENT_ID)).filteredOn( + surveyUnitModel -> + surveyUnitModel.getUsualSurveyUnitId().equals(DEFAULT_SURVEY_UNIT_ID) + && surveyUnitModel.getCollectionInstrumentId().equals(DEFAULT_COLLECTION_INSTRUMENT_ID) + ).isNotEmpty(); + } + @Test void findByInterrogationIdTest(){ Assertions.assertThat(surveyUnitServiceStatic.findByInterrogationId(DEFAULT_INTERROGATION_ID)).filteredOn( From 13195eb34f773b235be06881dcd729fdd4e43c1c Mon Sep 17 00:00:00 2001 From: Hajarel-moukh Date: Wed, 4 Feb 2026 16:36:18 +0100 Subject: [PATCH 3/4] add unit test for findByUsualSurveyUnitAndCollectionInstrumentIds method --- .../surveyunit/SurveyUnitServiceUnitTest.java | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/test/java/fr/insee/genesis/domain/service/surveyunit/SurveyUnitServiceUnitTest.java b/src/test/java/fr/insee/genesis/domain/service/surveyunit/SurveyUnitServiceUnitTest.java index 8c4e576b..e07a50bc 100644 --- a/src/test/java/fr/insee/genesis/domain/service/surveyunit/SurveyUnitServiceUnitTest.java +++ b/src/test/java/fr/insee/genesis/domain/service/surveyunit/SurveyUnitServiceUnitTest.java @@ -141,4 +141,39 @@ void get_latest_should_return_edited(){ //THEN Assertions.assertThat(surveyUnitModels).isNotNull().hasSize(2); } + + @Test + void findByIdsUsualSurveyUnitAndCollectionInstrument_should_return_survey_units_from_persistence_port() { + //GIVEN + List surveyUnitDocuments = new ArrayList<>(); + + SurveyUnitDocument surveyUnitDocument = new SurveyUnitDocument(); + surveyUnitDocument.setMode(String.valueOf(Mode.WEB)); + surveyUnitDocument.setUsualSurveyUnitId(TestConstants.DEFAULT_SURVEY_UNIT_ID); + surveyUnitDocument.setState(DataState.COLLECTED.toString()); + surveyUnitDocument.setRecordDate(LocalDateTime.now().minusMinutes(1)); + surveyUnitDocument.setCollectedVariables(new ArrayList<>()); + surveyUnitDocument.getCollectedVariables().add(new VariableDocument()); + surveyUnitDocument.getCollectedVariables().getFirst().setVarId("VAR1"); + surveyUnitDocument.getCollectedVariables().getFirst().setIteration(1); + surveyUnitDocument.getCollectedVariables().getFirst().setValue("VAR1"); + surveyUnitDocuments.add(surveyUnitDocument); + + + doReturn(SurveyUnitDocumentMapper.INSTANCE.listDocumentToListModel(surveyUnitDocuments)) + .when(surveyUnitPersistencePortStub).findByUsualSurveyUnitAndCollectionInstrumentIds( + TestConstants.DEFAULT_SURVEY_UNIT_ID, + TestConstants.DEFAULT_COLLECTION_INSTRUMENT_ID + ); + + //WHEN + List surveyUnitModels = surveyUnitService.findByIdsUsualSurveyUnitAndCollectionInstrument( + TestConstants.DEFAULT_SURVEY_UNIT_ID, + TestConstants.DEFAULT_COLLECTION_INSTRUMENT_ID + ); + + //THEN + Assertions.assertThat(surveyUnitModels).isNotNull().hasSize(1); + Assertions.assertThat(surveyUnitModels.getFirst().getUsualSurveyUnitId()).isEqualTo(TestConstants.DEFAULT_SURVEY_UNIT_ID); + } } From 0bf9233c22f5f2338d0b0395b52da34a02e934ab Mon Sep 17 00:00:00 2001 From: Hajarel-moukh Date: Wed, 4 Feb 2026 16:39:19 +0100 Subject: [PATCH 4/4] rename endpoint path --- .../genesis/controller/rest/responses/ResponseController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 170cbbea..2d39dd13 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 @@ -215,7 +215,7 @@ public ResponseEntity> findResponsesByInterrogationAndColl //GET @Operation(summary = "Retrieve responses for an interrogation, using usualSurveyUnitId and collectionInstrumentId (formerly questionnaireId) from Genesis Database") - @GetMapping(path = "/by-usual-SurveyUnit-and-collection-instrument") + @GetMapping(path = "/by-usual-survey-unit-and-collection-instrument") @PreAuthorize("hasRole('ADMIN')") public ResponseEntity> findResponsesByUsualSurveyUnitAndCollectionInstrument( @RequestParam("usualSurveyUnitId") String usualSurveyUnitId,