From ad02ea2a4579a79984dfc46f9a1d5f44e4b017b7 Mon Sep 17 00:00:00 2001 From: Hajarel-moukh Date: Wed, 11 Feb 2026 14:58:04 +0100 Subject: [PATCH 1/6] add endpoint to get interrogations with record date between --- .../rest/responses/InterrogationController.java | 13 +++++++++++++ .../domain/ports/api/SurveyUnitApiPort.java | 2 ++ .../ports/spi/SurveyUnitPersistencePort.java | 6 ++++++ .../service/surveyunit/SurveyUnitService.java | 10 ++++++++++ .../adapter/SurveyUnitMongoAdapter.java | 9 ++++++++- .../repository/SurveyUnitMongoDBRepository.java | 12 +++++++++++- .../adapter/SurveyUnitModelMongoAdapterTest.java | 1 - .../stubs/SurveyUnitPersistencePortStub.java | 14 ++++++++++++++ 8 files changed, 64 insertions(+), 3 deletions(-) diff --git a/src/main/java/fr/insee/genesis/controller/rest/responses/InterrogationController.java b/src/main/java/fr/insee/genesis/controller/rest/responses/InterrogationController.java index 2754adae..9cd03827 100644 --- a/src/main/java/fr/insee/genesis/controller/rest/responses/InterrogationController.java +++ b/src/main/java/fr/insee/genesis/controller/rest/responses/InterrogationController.java @@ -46,6 +46,19 @@ public ResponseEntity> getAllInterrogationIdsByQuestionnai return ResponseEntity.ok(responses); } + @Operation(summary = "Retrieve interrogations recorded between two dates for a given collection instrument") + @GetMapping(path = "/by-collection-instrument-and-between-datetime") + public ResponseEntity> getAllInterrogationIdsByCollectionInstrumentIdAndDate( + @RequestParam("collectionInstrumentId") String collectionInstrumentId, + @RequestParam("start") + @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime start, + @RequestParam("end") + @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime end) { + List responses = surveyUnitService.findDistinctInterrogationIdsByCollectionInstrumentIdAndRecordDateBetween(collectionInstrumentId, start,end); + return ResponseEntity.ok(responses); + } + + //========= OPTIMISATIONS PERFS (START) ========== /** 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 ea169f25..d26e88f8 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 @@ -37,6 +37,8 @@ public interface SurveyUnitApiPort { List findDistinctInterrogationIdsByQuestionnaireIdAndDateAfter(String questionnaireId, LocalDateTime since); + List findDistinctInterrogationIdsByCollectionInstrumentIdAndRecordDateBetween(String collectionInstrumentId, LocalDateTime start, LocalDateTime end); + //========= OPTIMISATIONS PERFS (START) ========== long countResponsesByCollectionInstrumentId(String questionnaireId); 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 500ad793..9b958d2b 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 @@ -30,6 +30,12 @@ public interface SurveyUnitPersistencePort { List findInterrogationIdsByQuestionnaireIdAndDateAfter(String questionnaireId, LocalDateTime since); + List findInterrogationIdsByCollectionInstrumentIdAndRecordDateBetween( + String collectionInstrumentId, + LocalDateTime start, + LocalDateTime end + ); + //======== OPTIMISATIONS PERFS (START) ======== long countByCollectionInstrumentId(String collectionInstrumentId); 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 0be2644e..af8fb5d6 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 @@ -282,6 +282,16 @@ public List findDistinctInterrogationIdsByQuestionnaireIdAndDat .toList(); } + @Override + public List findDistinctInterrogationIdsByCollectionInstrumentIdAndRecordDateBetween(String collectionInstrumentId, LocalDateTime start, LocalDateTime end) { + return surveyUnitPersistencePort + .findInterrogationIdsByCollectionInstrumentIdAndRecordDateBetween(collectionInstrumentId,start,end) + .stream() + .map(su -> new InterrogationId(su.getInterrogationId())) + .distinct() + .toList(); + } + //============ OPTIMISATIONS PERFS (START) ============ /** 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 cf47cb67..1b0a7856 100644 --- a/src/main/java/fr/insee/genesis/infrastructure/adapter/SurveyUnitMongoAdapter.java +++ b/src/main/java/fr/insee/genesis/infrastructure/adapter/SurveyUnitMongoAdapter.java @@ -167,7 +167,14 @@ public List findInterrogationIdsByQuestionnaireIdAndDateAfter(S return results.isEmpty() ? Collections.emptyList() : SurveyUnitDocumentMapper.INSTANCE.listDocumentToListModel(results); } - //========== OPTIMISATIONS PERFS (START) =========== + @Override + public List findInterrogationIdsByCollectionInstrumentIdAndRecordDateBetween(String collectionInstrumentId, LocalDateTime start, LocalDateTime end) { + List results = new ArrayList<>(); + results.addAll(mongoRepository.findInterrogationIdsByCollectionInstrumentIdAndRecordDateBetween(collectionInstrumentId,start,end)); + return results.isEmpty() ? Collections.emptyList() : SurveyUnitDocumentMapper.INSTANCE.listDocumentToListModel(results); + } + + //========== OPTIMISATIONS PERFS (START) =========== @Override public long countByCollectionInstrumentId(String collectionInstrumentId) { return mongoRepository.countByCollectionInstrumentId(collectionInstrumentId); 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 2f38477d..9f3bef77 100644 --- a/src/main/java/fr/insee/genesis/infrastructure/repository/SurveyUnitMongoDBRepository.java +++ b/src/main/java/fr/insee/genesis/infrastructure/repository/SurveyUnitMongoDBRepository.java @@ -40,7 +40,17 @@ public interface SurveyUnitMongoDBRepository extends MongoRepository findInterrogationIdsByCollectionInstrumentIdAndDateAfter(String collectionInstrumentId, LocalDateTime since); - /** + @Query( + value = "{ 'collectionInstrumentId' : ?0, 'recordDate': { $gte: ?1, $lt: ?2 } }", + fields = "{ 'interrogationId' : 1, 'mode' : 1 }" + ) + List findInterrogationIdsByCollectionInstrumentIdAndRecordDateBetween( + String collectionInstrumentId, + LocalDateTime start, + LocalDateTime end + ); + + /** * @author Adrien Marchal */ @Query(value = "{ 'questionnaireId' : ?0 }", count = true) diff --git a/src/test/java/fr/insee/genesis/infrastructure/adapter/SurveyUnitModelMongoAdapterTest.java b/src/test/java/fr/insee/genesis/infrastructure/adapter/SurveyUnitModelMongoAdapterTest.java index b72de546..bd13784f 100644 --- a/src/test/java/fr/insee/genesis/infrastructure/adapter/SurveyUnitModelMongoAdapterTest.java +++ b/src/test/java/fr/insee/genesis/infrastructure/adapter/SurveyUnitModelMongoAdapterTest.java @@ -5,7 +5,6 @@ import fr.insee.genesis.infrastructure.document.surveyunit.SurveyUnitDocument; import fr.insee.genesis.infrastructure.document.surveyunit.VariableDocument; import fr.insee.genesis.infrastructure.repository.SurveyUnitMongoDBRepository; -import fr.insee.modelefiliere.RawResponseDto; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; diff --git a/src/test/java/fr/insee/genesis/stubs/SurveyUnitPersistencePortStub.java b/src/test/java/fr/insee/genesis/stubs/SurveyUnitPersistencePortStub.java index c5824002..3639bb51 100644 --- a/src/test/java/fr/insee/genesis/stubs/SurveyUnitPersistencePortStub.java +++ b/src/test/java/fr/insee/genesis/stubs/SurveyUnitPersistencePortStub.java @@ -123,6 +123,20 @@ public List findInterrogationIdsByQuestionnaireIdAndDateAfter(S return surveyUnitModelList; } + @Override + public List findInterrogationIdsByCollectionInstrumentIdAndRecordDateBetween(String collectionInstrumentId, LocalDateTime start, LocalDateTime end) { + List surveyUnitModelList = new ArrayList<>(); + for(SurveyUnitModel surveyUnitModel : mongoStub){ + if(surveyUnitModel.getCollectionInstrumentId().equals(collectionInstrumentId) + && !surveyUnitModel.getRecordDate().isBefore(start) + && surveyUnitModel.getRecordDate().isBefore(end)) + surveyUnitModelList.add( + new SurveyUnitModel(surveyUnitModel.getInterrogationId(), surveyUnitModel.getMode()) + ); + } + + return surveyUnitModelList; } + //======== OPTIMISATIONS PERFS (START) ======== /** From b2d7c5d13ff75e82b8afebc9d6051deaee672017 Mon Sep 17 00:00:00 2001 From: Hajarel-moukh Date: Thu, 12 Feb 2026 14:01:58 +0100 Subject: [PATCH 2/6] add test --- .../InterrogationControllerTest.java | 2 ++ .../surveyunit/SurveyUnitServiceTest.java | 31 +++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/src/test/java/fr/insee/genesis/controller/rest/responses/InterrogationControllerTest.java b/src/test/java/fr/insee/genesis/controller/rest/responses/InterrogationControllerTest.java index 905f41f2..3ce42bff 100644 --- a/src/test/java/fr/insee/genesis/controller/rest/responses/InterrogationControllerTest.java +++ b/src/test/java/fr/insee/genesis/controller/rest/responses/InterrogationControllerTest.java @@ -63,4 +63,6 @@ void countAllInterrogationIdsByQuestionnaireOrCollectionInstrumentTest() { Assertions.assertThat(response.getBody()).isEqualTo(1L); } + + } 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..de91ff2f 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 @@ -254,6 +254,37 @@ void findDistinctInterrogationIdsByQuestionnaireIdAndDateAfterTest_doc_in_period ).isNotEmpty().hasSize(1); } + @Test + void findDistinctInterrogationIdsByCollectionInstrumentIdAndRecordDateBetweenTest_no_doc_in_period() { + addAdditionnalSurveyUnitModelToMongoStub(); + + LocalDateTime start = LocalDateTime.of(2025, 9, 1, 0, 0, 0); + LocalDateTime end = LocalDateTime.of(2025, 9, 2, 0, 0, 0); + + Assertions.assertThat( + surveyUnitServiceStatic.findDistinctInterrogationIdsByCollectionInstrumentIdAndRecordDateBetween( + DEFAULT_COLLECTION_INSTRUMENT_ID, start, end + ) + ).filteredOn(interrogationId -> interrogationId.getInterrogationId().equals(DEFAULT_INTERROGATION_ID)) + .isEmpty(); + } + + @Test + void findDistinctInterrogationIdsByCollectionInstrumentIdAndRecordDateBetweenTest_doc_in_period() { + addAdditionnalSurveyUnitModelToMongoStub(); + + LocalDateTime start = LocalDateTime.of(2022, 1, 1, 0, 0, 0); + LocalDateTime end = LocalDateTime.of(2026, 1, 1, 0, 0, 0); + + Assertions.assertThat( + surveyUnitServiceStatic.findDistinctInterrogationIdsByCollectionInstrumentIdAndRecordDateBetween( + DEFAULT_COLLECTION_INSTRUMENT_ID, start, end + ) + ).filteredOn(interrogationId -> interrogationId.getInterrogationId().equals(DEFAULT_INTERROGATION_ID)) + .isNotEmpty() + .hasSize(1); + } + @Test void findInterrogationIdsByQuestionnaireIdTest(){ Assertions.assertThat(surveyUnitServiceStatic.findModesByCollectionInstrumentId(DEFAULT_COLLECTION_INSTRUMENT_ID)).filteredOn( From f41a7ee681b734d9cccabd10fc300d47200f7540 Mon Sep 17 00:00:00 2001 From: Hajarel-moukh Date: Mon, 16 Feb 2026 10:30:26 +0100 Subject: [PATCH 3/6] add schema description to date --- .../rest/responses/InterrogationController.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/main/java/fr/insee/genesis/controller/rest/responses/InterrogationController.java b/src/main/java/fr/insee/genesis/controller/rest/responses/InterrogationController.java index 9cd03827..3bb8daa5 100644 --- a/src/main/java/fr/insee/genesis/controller/rest/responses/InterrogationController.java +++ b/src/main/java/fr/insee/genesis/controller/rest/responses/InterrogationController.java @@ -5,6 +5,7 @@ import fr.insee.genesis.domain.ports.api.SurveyUnitApiPort; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.extern.slf4j.Slf4j; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.http.ResponseEntity; @@ -51,9 +52,20 @@ public ResponseEntity> getAllInterrogationIdsByQuestionnai public ResponseEntity> getAllInterrogationIdsByCollectionInstrumentIdAndDate( @RequestParam("collectionInstrumentId") String collectionInstrumentId, @RequestParam("start") - @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime start, + @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) + @Parameter( + description = "Date de début", + schema = @Schema(type = "string", format = "date-time", example = "2026-01-01T00:00:00") + ) + LocalDateTime start, + @RequestParam("end") - @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime end) { + @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) + @Parameter( + description = "Date de fin", + schema = @Schema(type = "string", format = "date-time", example = "2026-01-31T23:59:59") + ) + LocalDateTime end) { List responses = surveyUnitService.findDistinctInterrogationIdsByCollectionInstrumentIdAndRecordDateBetween(collectionInstrumentId, start,end); return ResponseEntity.ok(responses); } From 26267aac8ff98f48f98d8da53dbee331d5f7b547 Mon Sep 17 00:00:00 2001 From: Hajarel-moukh Date: Tue, 17 Feb 2026 10:29:57 +0100 Subject: [PATCH 4/6] rename in english --- .../controller/rest/responses/InterrogationController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/fr/insee/genesis/controller/rest/responses/InterrogationController.java b/src/main/java/fr/insee/genesis/controller/rest/responses/InterrogationController.java index 3bb8daa5..b21bd447 100644 --- a/src/main/java/fr/insee/genesis/controller/rest/responses/InterrogationController.java +++ b/src/main/java/fr/insee/genesis/controller/rest/responses/InterrogationController.java @@ -54,7 +54,7 @@ public ResponseEntity> getAllInterrogationIdsByCollectionI @RequestParam("start") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) @Parameter( - description = "Date de début", + description = "Start date", schema = @Schema(type = "string", format = "date-time", example = "2026-01-01T00:00:00") ) LocalDateTime start, @@ -62,7 +62,7 @@ public ResponseEntity> getAllInterrogationIdsByCollectionI @RequestParam("end") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) @Parameter( - description = "Date de fin", + description = "End date", schema = @Schema(type = "string", format = "date-time", example = "2026-01-31T23:59:59") ) LocalDateTime end) { From 31a23c1ff63487a442ef61d3167f32b6adf07536 Mon Sep 17 00:00:00 2001 From: Hajarel-moukh Date: Tue, 17 Feb 2026 10:34:51 +0100 Subject: [PATCH 5/6] rename in english --- .../controller/rest/responses/InterrogationController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/fr/insee/genesis/controller/rest/responses/InterrogationController.java b/src/main/java/fr/insee/genesis/controller/rest/responses/InterrogationController.java index b21bd447..157d38e1 100644 --- a/src/main/java/fr/insee/genesis/controller/rest/responses/InterrogationController.java +++ b/src/main/java/fr/insee/genesis/controller/rest/responses/InterrogationController.java @@ -54,7 +54,7 @@ public ResponseEntity> getAllInterrogationIdsByCollectionI @RequestParam("start") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) @Parameter( - description = "Start date", + description = "sinceDate", schema = @Schema(type = "string", format = "date-time", example = "2026-01-01T00:00:00") ) LocalDateTime start, @@ -62,7 +62,7 @@ public ResponseEntity> getAllInterrogationIdsByCollectionI @RequestParam("end") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) @Parameter( - description = "End date", + description = "untilDate", schema = @Schema(type = "string", format = "date-time", example = "2026-01-31T23:59:59") ) LocalDateTime end) { From d1e20cb8a75ed98d27610a0b45a4e6b341ddf911 Mon Sep 17 00:00:00 2001 From: Hajarel-moukh Date: Tue, 17 Feb 2026 13:44:46 +0100 Subject: [PATCH 6/6] add method --- .../infrastructure/adapter/SurveyUnitMongoAdapter.java | 1 + .../repository/SurveyUnitMongoDBRepository.java | 10 ++++++++++ 2 files changed, 11 insertions(+) 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 1b0a7856..943a7f4a 100644 --- a/src/main/java/fr/insee/genesis/infrastructure/adapter/SurveyUnitMongoAdapter.java +++ b/src/main/java/fr/insee/genesis/infrastructure/adapter/SurveyUnitMongoAdapter.java @@ -171,6 +171,7 @@ public List findInterrogationIdsByQuestionnaireIdAndDateAfter(S public List findInterrogationIdsByCollectionInstrumentIdAndRecordDateBetween(String collectionInstrumentId, LocalDateTime start, LocalDateTime end) { List results = new ArrayList<>(); results.addAll(mongoRepository.findInterrogationIdsByCollectionInstrumentIdAndRecordDateBetween(collectionInstrumentId,start,end)); + results.addAll(mongoRepository.findInterrogationIdsQuestionnaireIdAndRecordDateBetween(collectionInstrumentId,start,end)); return results.isEmpty() ? Collections.emptyList() : SurveyUnitDocumentMapper.INSTANCE.listDocumentToListModel(results); } 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 9f3bef77..63ef838a 100644 --- a/src/main/java/fr/insee/genesis/infrastructure/repository/SurveyUnitMongoDBRepository.java +++ b/src/main/java/fr/insee/genesis/infrastructure/repository/SurveyUnitMongoDBRepository.java @@ -50,6 +50,16 @@ List findInterrogationIdsByCollectionInstrumentIdAndRecordDa LocalDateTime end ); + @Query( + value = "{ 'questionnaireId' : ?0, 'recordDate': { $gte: ?1, $lt: ?2 } }", + fields = "{ 'interrogationId' : 1, 'mode' : 1 }" + ) + List findInterrogationIdsQuestionnaireIdAndRecordDateBetween( + String questionnaireId, + LocalDateTime start, + LocalDateTime end + ); + /** * @author Adrien Marchal */