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/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( 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) ======== /**