diff --git a/src/main/java/fr/insee/genesis/infrastructure/document/rawdata/RawResponseDocument.java b/src/main/java/fr/insee/genesis/infrastructure/document/rawdata/RawResponseDocument.java index 5b4d705a..74632c61 100644 --- a/src/main/java/fr/insee/genesis/infrastructure/document/rawdata/RawResponseDocument.java +++ b/src/main/java/fr/insee/genesis/infrastructure/document/rawdata/RawResponseDocument.java @@ -3,6 +3,8 @@ import lombok.Builder; import org.bson.types.ObjectId; import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.index.CompoundIndex; +import org.springframework.data.mongodb.core.index.CompoundIndexes; import org.springframework.data.mongodb.core.index.IndexDirection; import org.springframework.data.mongodb.core.index.Indexed; import org.springframework.data.mongodb.core.mapping.Document; @@ -12,6 +14,9 @@ @Builder @Document(collection = "rawResponses") +@CompoundIndexes({ + @CompoundIndex(name = "payload_campaignId_index", def = "{ 'payload.campaignId': 1 }") +}) public record RawResponseDocument ( @Id ObjectId id, @@ -22,7 +27,5 @@ public record RawResponseDocument ( Map payload, LocalDateTime recordDate, @Indexed(direction = IndexDirection.DESCENDING) - LocalDateTime processDate, - @Indexed - String campaignId + LocalDateTime processDate ){} diff --git a/src/test/java/fr/insee/genesis/controller/rest/responses/RawResponseControllerTest.java b/src/test/java/fr/insee/genesis/controller/rest/responses/RawResponseControllerTest.java index 330bd624..af1fd83b 100644 --- a/src/test/java/fr/insee/genesis/controller/rest/responses/RawResponseControllerTest.java +++ b/src/test/java/fr/insee/genesis/controller/rest/responses/RawResponseControllerTest.java @@ -359,7 +359,7 @@ void getLunaticJsonRawDataModelFromJsonBody() { @Test void getRawResponsesFromJsonBody() { //GIVEN - String campaignId = "getRawResponsesFromJsonBody"; + String campaignId = "VPPI2024M05"; String questionnaireId = campaignId + "_quest"; String interrogationId = "getRawResponsesFromJsonBody_id1"; Instant recordDate = Instant.parse("2025-01-01T01:00:00.000Z"); @@ -423,12 +423,64 @@ private void addJsonRawDataDocumentToStub(String campaignId, private void addJsonRawResponseDataDocumentToStub(String campaignId, String questionnaireId, String interrogationId) { RawResponseDocument rawResponseDocument = RawResponseDocument.builder() - .campaignId(campaignId) .collectionInstrumentId(questionnaireId) .interrogationId(interrogationId) .recordDate(LocalDateTime.now()) + .payload(Map.of("campaignId", campaignId)) .build(); rawResponseDataPersistanceStub.getMongoStub().add(rawResponseDocument); } + + @Test + void getRawResponsesFromJsonBody_filterByCampaignId() { + // GIVEN + rawResponseDataPersistanceStub.getMongoStub().clear(); + + String campaignId = "CAMPAIGN_OK"; + String questionnaireId = campaignId + "_QUEST"; + String interrogationId1 = "INT_1"; + String interrogationId2 = "INT_2"; + + // document with the wanted campaignId + RawResponseDocument rawResponseDocument = RawResponseDocument.builder() + .collectionInstrumentId(questionnaireId) + .interrogationId(interrogationId1) + .recordDate(LocalDateTime.now()) + .payload(Map.of("campaignId", campaignId)) + .build(); + + // document with another campaignId + RawResponseDocument rawResponseDocument1 = RawResponseDocument.builder() + .collectionInstrumentId("OTHER_QUEST") + .interrogationId(interrogationId2) + .recordDate(LocalDateTime.now()) + .payload(Map.of("campaignId", "OTHER_CAMPAIGN")) + .build(); + + rawResponseDataPersistanceStub.getMongoStub().addAll(List.of(rawResponseDocument, rawResponseDocument1)); + + Instant startDate = Instant.now().minusSeconds(3600); + Instant endDate = Instant.now().plusSeconds(3600); + + // WHEN + ResponseEntity> response = + rawResponseController.getRawResponsesFromJsonBody( + campaignId, + startDate, + endDate, + 0, + 10 + ); + + // THEN + Assertions.assertThat(response.getStatusCode().is2xxSuccessful()).isTrue(); + Assertions.assertThat(response.getBody()).isNotNull(); + Assertions.assertThat(response.getBody().getContent()).hasSize(1); + + RawResponseModel result = response.getBody().getContent().getFirst(); + Assertions.assertThat(result.interrogationId()).isEqualTo(interrogationId1); + Assertions.assertThat(result.payload().get("campaignId")).isEqualTo(campaignId); + } + } diff --git a/src/test/java/fr/insee/genesis/stubs/RawResponseDataPersistanceStub.java b/src/test/java/fr/insee/genesis/stubs/RawResponseDataPersistanceStub.java index d24905d1..8f1c7cf0 100644 --- a/src/test/java/fr/insee/genesis/stubs/RawResponseDataPersistanceStub.java +++ b/src/test/java/fr/insee/genesis/stubs/RawResponseDataPersistanceStub.java @@ -63,13 +63,24 @@ public List findModesByCollectionInstrument(String collectionInstrument } @Override - public Page findByCampaignIdAndDate(String campaignId, Instant startDate, Instant endDate, Pageable pageable) { + public Page findByCampaignIdAndDate( + String campaignId, + Instant startDate, + Instant endDate, + Pageable pageable + ) { List foundRaws = mongoStub.stream() - .filter(rawData -> rawData.campaignId().equals(campaignId)) + .filter(rawData -> { + Object payloadCampaignId = rawData.payload().get("campaignId"); + return campaignId.equals(payloadCampaignId); + }) .toList(); - return new PageImpl<>(RawResponseDocumentMapper.INSTANCE.listDocumentToListModel(foundRaws), + + return new PageImpl<>( + RawResponseDocumentMapper.INSTANCE.listDocumentToListModel(foundRaws), pageable, - foundRaws.size()); + foundRaws.size() + ); } @Override