diff --git a/src/main/java/fr/insee/genesis/Constants.java b/src/main/java/fr/insee/genesis/Constants.java index f06e6ac9..25fabfbd 100644 --- a/src/main/java/fr/insee/genesis/Constants.java +++ b/src/main/java/fr/insee/genesis/Constants.java @@ -14,6 +14,7 @@ public class Constants { public static final String FILTER_RESULT_PREFIX = "FILTER_RESULT_"; public static final String MISSING_SUFFIX = "_MISSING"; public static final String MONGODB_LUNATIC_RAWDATA_COLLECTION_NAME = "lunaticjsondata"; + public static final String MONGODB_EXTRACTION_JSON_COLLECTION_NAME = "lastjsonextraction"; private static final String[] ENO_VARIABLES = {"COMMENT_QE","COMMENT_UE","HEURE_REMPL","MIN_REMPL"}; public static final String MONGODB_SCHEDULE_COLLECTION_NAME = "schedules"; diff --git a/src/main/java/fr/insee/genesis/controller/dto/LastExtractionResponseDto.java b/src/main/java/fr/insee/genesis/controller/dto/LastExtractionResponseDto.java new file mode 100644 index 00000000..422699b6 --- /dev/null +++ b/src/main/java/fr/insee/genesis/controller/dto/LastExtractionResponseDto.java @@ -0,0 +1,15 @@ +package fr.insee.genesis.controller.dto; + +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDateTime; + +@Getter +@Setter +public class LastExtractionResponseDto { + private final String lastExtractionDate; + public LastExtractionResponseDto(LocalDateTime lastExtractionDate) { + this.lastExtractionDate = lastExtractionDate != null ? lastExtractionDate.toString() : null; + } +} diff --git a/src/main/java/fr/insee/genesis/controller/mappers/DataProcessingContextMapperDto.java b/src/main/java/fr/insee/genesis/controller/mappers/DataProcessingContextMapperDto.java new file mode 100644 index 00000000..faa5caf6 --- /dev/null +++ b/src/main/java/fr/insee/genesis/controller/mappers/DataProcessingContextMapperDto.java @@ -0,0 +1,26 @@ +package fr.insee.genesis.controller.mappers; + +import fr.insee.genesis.controller.dto.ScheduleDto; +import fr.insee.genesis.domain.model.context.DataProcessingContextModel; + +import java.util.ArrayList; +import java.util.List; + +public class DataProcessingContextMapperDto { + + public ScheduleDto dataProcessingContextToScheduleDto(DataProcessingContextModel dataProcessingContext){ + return ScheduleDto.builder() + .surveyName(dataProcessingContext.getPartitionId()) + .lastExecution(dataProcessingContext.getLastExecution()) + .kraftwerkExecutionScheduleList(dataProcessingContext.getKraftwerkExecutionScheduleList()) + .build(); + } + + public List dataProcessingContextListToScheduleDtoList(List contexts){ + List dtos = new ArrayList<>(); + for(DataProcessingContextModel context : contexts){ + dtos.add(dataProcessingContextToScheduleDto(context)); + } + return dtos; + } +} diff --git a/src/main/java/fr/insee/genesis/controller/rest/JsonExtractionController.java b/src/main/java/fr/insee/genesis/controller/rest/JsonExtractionController.java new file mode 100644 index 00000000..5f159c98 --- /dev/null +++ b/src/main/java/fr/insee/genesis/controller/rest/JsonExtractionController.java @@ -0,0 +1,60 @@ +package fr.insee.genesis.controller.rest; + +import fr.insee.genesis.controller.dto.LastExtractionResponseDto; +import fr.insee.genesis.domain.model.extraction.json.LastJsonExtractionModel; +import fr.insee.genesis.domain.model.surveyunit.Mode; +import fr.insee.genesis.domain.ports.api.LastJsonExtractionApiPort; +import fr.insee.genesis.exceptions.GenesisException; +import io.swagger.v3.oas.annotations.Operation; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import java.time.LocalDateTime; + +@Slf4j +@Controller +@AllArgsConstructor +@RequestMapping(path = "/extractions") +public class JsonExtractionController { + + LastJsonExtractionApiPort lastJsonExtractionApiPort; + + @Operation(summary = "Record the date of the latest JSON data extraction in Kraftwerk") + @PutMapping(path = "/json") + @PreAuthorize("hasAnyRole('USER_KRAFTWERK','SCHEDULER')") + public ResponseEntity saveLastJsonExtractionDate( + @RequestParam("questionnaireId") String questionnaireId, + @RequestParam(value = "mode", required = false) Mode mode){ + LocalDateTime extractDate = LocalDateTime.now(); + LastJsonExtractionModel extract = LastJsonExtractionModel.builder() + .questionnaireModelId(questionnaireId) + .mode(mode) + .lastExtractionDate(extractDate) + .build(); + lastJsonExtractionApiPort.recordDate(extract); + return ResponseEntity.ok().build(); + } + + @Operation(summary = "Get the date of the latest JSON data extraction in Kraftwerk") + @GetMapping(path = "/json") + @PreAuthorize("hasAnyRole('USER_KRAFTWERK','SCHEDULER')") + public ResponseEntity getLastJsonExtractionDate( + @RequestParam("questionnaireId") String questionnaireId, + @RequestParam(value = "mode", required = false) Mode mode){ + try{ + LastJsonExtractionModel lastJsonExtraction = lastJsonExtractionApiPort.getLastExtractionDate(questionnaireId,mode); + return ResponseEntity.ok(new LastExtractionResponseDto(lastJsonExtraction.getLastExtractionDate())); + } catch (GenesisException e){ + return ResponseEntity.notFound().build(); + } + } + +} 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 a9580988..aef79a30 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 @@ -6,6 +6,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import lombok.extern.slf4j.Slf4j; +import org.springframework.format.annotation.DateTimeFormat; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @@ -13,6 +14,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; +import java.time.LocalDateTime; import java.util.List; @RequestMapping(path = "/interrogations" ) @@ -35,6 +37,15 @@ public ResponseEntity> getAllInterrogationIdsByQuestionnai return ResponseEntity.ok(responses); } + @Operation(summary = "Retrieve interrogations recorded since a specified date for a given questionnaire") + @GetMapping(path = "/by-questionnaire-and-since-datetime") + public ResponseEntity> getAllInterrogationIdsByQuestionnaire( + @RequestParam("questionnaireId") String questionnaireId, + @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime since) { + List responses = surveyUnitService.findDistinctInterrogationIdsByQuestionnaireIdAndDateAfter(questionnaireId, since); + return ResponseEntity.ok(responses); + } + //========= OPTIMISATIONS PERFS (START) ========== /** diff --git a/src/main/java/fr/insee/genesis/domain/model/extraction/json/LastJsonExtractionModel.java b/src/main/java/fr/insee/genesis/domain/model/extraction/json/LastJsonExtractionModel.java new file mode 100644 index 00000000..861d9e6e --- /dev/null +++ b/src/main/java/fr/insee/genesis/domain/model/extraction/json/LastJsonExtractionModel.java @@ -0,0 +1,22 @@ +package fr.insee.genesis.domain.model.extraction.json; + +import fr.insee.genesis.domain.model.surveyunit.Mode; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.data.annotation.Id; + +import java.time.LocalDateTime; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class LastJsonExtractionModel { + @Id + private String id; //Used to remove warning + String questionnaireModelId; + Mode mode; + LocalDateTime lastExtractionDate; +} diff --git a/src/main/java/fr/insee/genesis/domain/ports/api/LastJsonExtractionApiPort.java b/src/main/java/fr/insee/genesis/domain/ports/api/LastJsonExtractionApiPort.java new file mode 100644 index 00000000..196f3b10 --- /dev/null +++ b/src/main/java/fr/insee/genesis/domain/ports/api/LastJsonExtractionApiPort.java @@ -0,0 +1,11 @@ +package fr.insee.genesis.domain.ports.api; + +import fr.insee.genesis.domain.model.extraction.json.LastJsonExtractionModel; +import fr.insee.genesis.domain.model.surveyunit.Mode; +import fr.insee.genesis.exceptions.GenesisException; + +public interface LastJsonExtractionApiPort { + void recordDate(LastJsonExtractionModel extraction); + + LastJsonExtractionModel getLastExtractionDate(String questionnaireModelId, Mode mode) throws GenesisException; +} 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 847fba41..9465a321 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 @@ -10,6 +10,7 @@ import fr.insee.genesis.domain.model.surveyunit.SurveyUnitModel; import fr.insee.genesis.exceptions.GenesisException; +import java.time.LocalDateTime; import java.util.List; import java.util.Set; import java.util.stream.Stream; @@ -37,6 +38,8 @@ public interface SurveyUnitApiPort { List findDistinctInterrogationIdsByQuestionnaireId(String questionnaireId); + List findDistinctInterrogationIdsByQuestionnaireIdAndDateAfter(String questionnaireId, LocalDateTime since); + //========= OPTIMISATIONS PERFS (START) ========== long countInterrogationIdsByQuestionnaireId(String questionnaireId); diff --git a/src/main/java/fr/insee/genesis/domain/ports/spi/LastJsonExtractionPersistencePort.java b/src/main/java/fr/insee/genesis/domain/ports/spi/LastJsonExtractionPersistencePort.java new file mode 100644 index 00000000..39265b50 --- /dev/null +++ b/src/main/java/fr/insee/genesis/domain/ports/spi/LastJsonExtractionPersistencePort.java @@ -0,0 +1,10 @@ +package fr.insee.genesis.domain.ports.spi; + +import fr.insee.genesis.domain.model.extraction.json.LastJsonExtractionModel; +import fr.insee.genesis.domain.model.surveyunit.Mode; +import fr.insee.genesis.exceptions.GenesisException; + +public interface LastJsonExtractionPersistencePort { + void save(LastJsonExtractionModel extraction); + LastJsonExtractionModel getLastExecutionDate(String questionnaireModelId, Mode mode) throws GenesisException; +} 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 7f69b753..ae1a31b2 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 @@ -2,6 +2,7 @@ import fr.insee.genesis.domain.model.surveyunit.SurveyUnitModel; +import java.time.LocalDateTime; import java.util.List; import java.util.Set; import java.util.stream.Stream; @@ -27,6 +28,8 @@ public interface SurveyUnitPersistencePort { List findInterrogationIdsByQuestionnaireId(String questionnaireId); + List findInterrogationIdsByQuestionnaireIdAndDateAfter(String questionnaireId, LocalDateTime since); + //======== OPTIMISATIONS PERFS (START) ======== long countInterrogationIdsByQuestionnaireId(String questionnaireId); diff --git a/src/main/java/fr/insee/genesis/domain/service/extraction/LastJsonExtractionService.java b/src/main/java/fr/insee/genesis/domain/service/extraction/LastJsonExtractionService.java new file mode 100644 index 00000000..dca95323 --- /dev/null +++ b/src/main/java/fr/insee/genesis/domain/service/extraction/LastJsonExtractionService.java @@ -0,0 +1,40 @@ +package fr.insee.genesis.domain.service.extraction; + +import fr.insee.genesis.domain.model.extraction.json.LastJsonExtractionModel; +import fr.insee.genesis.domain.model.surveyunit.Mode; +import fr.insee.genesis.domain.ports.api.LastJsonExtractionApiPort; +import fr.insee.genesis.domain.ports.spi.LastJsonExtractionPersistencePort; +import fr.insee.genesis.exceptions.GenesisException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Service; + +@Service +@Slf4j +public class LastJsonExtractionService implements LastJsonExtractionApiPort { + + @Qualifier("lastJsonExtractionMongoAdapter") + LastJsonExtractionPersistencePort extractionPersistencePort; + + @Autowired + public LastJsonExtractionService(LastJsonExtractionPersistencePort extractionPersistencePort) { + this.extractionPersistencePort = extractionPersistencePort; + } + + @Override + public void recordDate(LastJsonExtractionModel extraction) { + // Create a unique ID based on the questionnaire and the mode. + extraction.setId(String.format("%s_%s",extraction.getQuestionnaireModelId(),extraction.getMode())); + + // save() does an insert if the id doesn't exist, otherwise an update + extractionPersistencePort.save(extraction); + } + + @Override + public LastJsonExtractionModel getLastExtractionDate(String questionnaireModelId, Mode mode) throws GenesisException { + return extractionPersistencePort.getLastExecutionDate(questionnaireModelId,mode); + } + + +} 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 e6613a78..e76e17ec 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 @@ -275,6 +275,16 @@ public List findDistinctInterrogationIdsByQuestionnaireId(Strin return suIds.stream().distinct().toList(); } + @Override + public List findDistinctInterrogationIdsByQuestionnaireIdAndDateAfter(String questionnaireId, LocalDateTime since) { + return surveyUnitPersistencePort + .findInterrogationIdsByQuestionnaireIdAndDateAfter(questionnaireId, since) + .stream() + .map(su -> new InterrogationId(su.getInterrogationId())) + .distinct() + .toList(); + } + //============ OPTIMISATIONS PERFS (START) ============ /** diff --git a/src/main/java/fr/insee/genesis/infrastructure/adapter/LastJsonExtractionMongoAdapter.java b/src/main/java/fr/insee/genesis/infrastructure/adapter/LastJsonExtractionMongoAdapter.java new file mode 100644 index 00000000..89635f6b --- /dev/null +++ b/src/main/java/fr/insee/genesis/infrastructure/adapter/LastJsonExtractionMongoAdapter.java @@ -0,0 +1,46 @@ +package fr.insee.genesis.infrastructure.adapter; + +import fr.insee.genesis.domain.model.extraction.json.LastJsonExtractionModel; +import fr.insee.genesis.domain.model.surveyunit.Mode; +import fr.insee.genesis.domain.ports.spi.LastJsonExtractionPersistencePort; +import fr.insee.genesis.exceptions.GenesisException; +import fr.insee.genesis.infrastructure.document.extraction.json.LastJsonExtractionDocument; +import fr.insee.genesis.infrastructure.mappers.LastJsonExtractionDocumentMapper; +import fr.insee.genesis.infrastructure.repository.LastJsonExtractionMongoDBRepository; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Service; + +import java.util.Optional; + +@Service +@Qualifier("lastJsonExtractionMongoAdapter") +@Slf4j +public class LastJsonExtractionMongoAdapter implements LastJsonExtractionPersistencePort { + + private final LastJsonExtractionMongoDBRepository extractionRepository; + + @Autowired + public LastJsonExtractionMongoAdapter(LastJsonExtractionMongoDBRepository extractionRepository) { + this.extractionRepository = extractionRepository; + } + + @Override + public void save(LastJsonExtractionModel extraction) { + extractionRepository.save(LastJsonExtractionDocumentMapper.INSTANCE.modelToDocument(extraction)); + } + + @Override + public LastJsonExtractionModel getLastExecutionDate(String questionnaireModelId, Mode mode) throws GenesisException { + String id = String.format("%s_%s",questionnaireModelId, mode); + Optional extraction = extractionRepository.findById(id); + if (extraction.isPresent()) { + return LastJsonExtractionDocumentMapper.INSTANCE.documentToModel(extraction.get()); + } else { + String message = String.format("No extraction date found for questionnaire %s and mode %s",questionnaireModelId,mode==null?null:mode.getModeName()); + throw new GenesisException(404,message); + } + } + +} 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 5eec2c2c..f4115f47 100644 --- a/src/main/java/fr/insee/genesis/infrastructure/adapter/SurveyUnitMongoAdapter.java +++ b/src/main/java/fr/insee/genesis/infrastructure/adapter/SurveyUnitMongoAdapter.java @@ -15,6 +15,7 @@ import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.stereotype.Service; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; @@ -154,6 +155,12 @@ public List findInterrogationIdsByQuestionnaireId(String questi return surveyUnits.isEmpty() ? Collections.emptyList() : SurveyUnitDocumentMapper.INSTANCE.listDocumentToListModel(surveyUnits); } + @Override + public List findInterrogationIdsByQuestionnaireIdAndDateAfter(String questionnaireId, LocalDateTime since) { + List surveyUnits = mongoRepository.findInterrogationIdsByQuestionnaireIdAndDateAfter(questionnaireId, since); + return surveyUnits.isEmpty() ? Collections.emptyList() : SurveyUnitDocumentMapper.INSTANCE.listDocumentToListModel(surveyUnits); + } + //========== OPTIMISATIONS PERFS (START) =========== @Override public long countInterrogationIdsByQuestionnaireId(String questionnaireId) { diff --git a/src/main/java/fr/insee/genesis/infrastructure/document/extraction/json/LastJsonExtractionDocument.java b/src/main/java/fr/insee/genesis/infrastructure/document/extraction/json/LastJsonExtractionDocument.java new file mode 100644 index 00000000..0e942f27 --- /dev/null +++ b/src/main/java/fr/insee/genesis/infrastructure/document/extraction/json/LastJsonExtractionDocument.java @@ -0,0 +1,21 @@ +package fr.insee.genesis.infrastructure.document.extraction.json; + +import fr.insee.genesis.Constants; +import fr.insee.genesis.domain.model.surveyunit.Mode; +import lombok.Data; +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.time.LocalDateTime; + +@Data +@Document(collection = Constants.MONGODB_EXTRACTION_JSON_COLLECTION_NAME) +public class LastJsonExtractionDocument { + + @Id + private String id; + private String questionnaireModelId; + private Mode mode; + private LocalDateTime lastExtractionDate; + +} diff --git a/src/main/java/fr/insee/genesis/infrastructure/mappers/LastJsonExtractionDocumentMapper.java b/src/main/java/fr/insee/genesis/infrastructure/mappers/LastJsonExtractionDocumentMapper.java new file mode 100644 index 00000000..9edbdbd1 --- /dev/null +++ b/src/main/java/fr/insee/genesis/infrastructure/mappers/LastJsonExtractionDocumentMapper.java @@ -0,0 +1,22 @@ +package fr.insee.genesis.infrastructure.mappers; + +import fr.insee.genesis.domain.model.extraction.json.LastJsonExtractionModel; +import fr.insee.genesis.infrastructure.document.extraction.json.LastJsonExtractionDocument; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface LastJsonExtractionDocumentMapper { + + LastJsonExtractionDocumentMapper INSTANCE = Mappers.getMapper(LastJsonExtractionDocumentMapper.class); + + LastJsonExtractionModel documentToModel(LastJsonExtractionDocument lastJsonExtractionDoc); + + LastJsonExtractionDocument modelToDocument(LastJsonExtractionModel lastJsonExtractionModel); + + List listDocumentToListModel(List lastJsonExtractionDocumentList); + + List listModelToListDocument(List lastJsonExtractionModelList); +} diff --git a/src/main/java/fr/insee/genesis/infrastructure/repository/LastJsonExtractionMongoDBRepository.java b/src/main/java/fr/insee/genesis/infrastructure/repository/LastJsonExtractionMongoDBRepository.java new file mode 100644 index 00000000..0aac2fd5 --- /dev/null +++ b/src/main/java/fr/insee/genesis/infrastructure/repository/LastJsonExtractionMongoDBRepository.java @@ -0,0 +1,10 @@ +package fr.insee.genesis.infrastructure.repository; + +import fr.insee.genesis.infrastructure.document.extraction.json.LastJsonExtractionDocument; +import org.springframework.data.mongodb.repository.MongoRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface LastJsonExtractionMongoDBRepository extends MongoRepository { + +} 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 dc915db9..d1c5841d 100644 --- a/src/main/java/fr/insee/genesis/infrastructure/repository/SurveyUnitMongoDBRepository.java +++ b/src/main/java/fr/insee/genesis/infrastructure/repository/SurveyUnitMongoDBRepository.java @@ -7,6 +7,7 @@ import org.springframework.data.mongodb.repository.Aggregation; import org.springframework.stereotype.Repository; +import java.time.LocalDateTime; import java.util.List; import java.util.Set; import java.util.stream.Stream; @@ -29,6 +30,9 @@ public interface SurveyUnitMongoDBRepository extends MongoRepository findInterrogationIdsByQuestionnaireId(String questionnaireId); + @Query(value = "{ 'questionnaireId' : ?0, 'recordDate': { $gte: ?1 } }", fields = "{ 'interrogationId' : 1, 'mode' : 1 }") + List findInterrogationIdsByQuestionnaireIdAndDateAfter(String questionnaireId, LocalDateTime since); + //========= OPTIMISATIONS PERFS (START) ========== /** * @author Adrien Marchal diff --git a/src/test/java/cucumber/functional_tests/config/CucumberSpringConfiguration.java b/src/test/java/cucumber/functional_tests/config/CucumberSpringConfiguration.java index f7304759..81c8ef3d 100644 --- a/src/test/java/cucumber/functional_tests/config/CucumberSpringConfiguration.java +++ b/src/test/java/cucumber/functional_tests/config/CucumberSpringConfiguration.java @@ -1,9 +1,10 @@ package cucumber.functional_tests.config; import fr.insee.genesis.GenesisApi; -import fr.insee.genesis.infrastructure.repository.DataProcessingContextMongoDBRepository; import fr.insee.genesis.infrastructure.repository.ContextualExternalVariableMongoDBRepository; import fr.insee.genesis.infrastructure.repository.ContextualPreviousVariableMongoDBRepository; +import fr.insee.genesis.infrastructure.repository.DataProcessingContextMongoDBRepository; +import fr.insee.genesis.infrastructure.repository.LastJsonExtractionMongoDBRepository; import fr.insee.genesis.infrastructure.repository.LunaticJsonMongoDBRepository; import fr.insee.genesis.infrastructure.repository.LunaticModelMongoDBRepository; import fr.insee.genesis.infrastructure.repository.QuestionnaireMetadataMongoDBRepository; @@ -37,6 +38,8 @@ public class CucumberSpringConfiguration { @MockitoBean private LunaticModelMongoDBRepository lunaticModelMongoDBRepository; @MockitoBean + private LastJsonExtractionMongoDBRepository lastJsonExtractionMongoDBRepository; + @MockitoBean private DataProcessingContextMongoDBRepository dataProcessingContextMongoDBRepository; @MockitoBean private ContextualPreviousVariableMongoDBRepository contextualPreviousVariableMongoDBRepository; diff --git a/src/test/java/fr/insee/genesis/controller/rest/ControllerAccessTest.java b/src/test/java/fr/insee/genesis/controller/rest/ControllerAccessTest.java index 68d07770..1d29e9fa 100644 --- a/src/test/java/fr/insee/genesis/controller/rest/ControllerAccessTest.java +++ b/src/test/java/fr/insee/genesis/controller/rest/ControllerAccessTest.java @@ -3,9 +3,10 @@ import fr.insee.genesis.domain.ports.api.DataProcessingContextApiPort; import fr.insee.genesis.domain.ports.api.LunaticJsonRawDataApiPort; import fr.insee.genesis.domain.ports.api.SurveyUnitApiPort; -import fr.insee.genesis.infrastructure.repository.DataProcessingContextMongoDBRepository; import fr.insee.genesis.infrastructure.repository.ContextualExternalVariableMongoDBRepository; import fr.insee.genesis.infrastructure.repository.ContextualPreviousVariableMongoDBRepository; +import fr.insee.genesis.infrastructure.repository.DataProcessingContextMongoDBRepository; +import fr.insee.genesis.infrastructure.repository.LastJsonExtractionMongoDBRepository; import fr.insee.genesis.infrastructure.repository.LunaticJsonMongoDBRepository; import fr.insee.genesis.infrastructure.repository.LunaticModelMongoDBRepository; import fr.insee.genesis.infrastructure.repository.QuestionnaireMetadataMongoDBRepository; @@ -78,6 +79,8 @@ class ControllerAccessTest { @MockitoBean private SurveyUnitMongoDBRepository surveyUnitMongoDBRepository; @MockitoBean + private LastJsonExtractionMongoDBRepository lastJsonExtractionMongoDBRepository; + @MockitoBean private LunaticJsonMongoDBRepository lunaticJsonMongoDBRepository; @MockitoBean private RundeckExecutionDBRepository rundeckExecutionDBRepository; diff --git a/src/test/java/fr/insee/genesis/domain/service/SurveyUnitServiceTest.java b/src/test/java/fr/insee/genesis/domain/service/surveyunit/SurveyUnitServiceTest.java similarity index 97% rename from src/test/java/fr/insee/genesis/domain/service/SurveyUnitServiceTest.java rename to src/test/java/fr/insee/genesis/domain/service/surveyunit/SurveyUnitServiceTest.java index 8e5e5eed..34c7eb69 100644 --- a/src/test/java/fr/insee/genesis/domain/service/SurveyUnitServiceTest.java +++ b/src/test/java/fr/insee/genesis/domain/service/surveyunit/SurveyUnitServiceTest.java @@ -1,4 +1,4 @@ -package fr.insee.genesis.domain.service; +package fr.insee.genesis.domain.service.surveyunit; import fr.insee.genesis.controller.dto.SurveyUnitDto; import fr.insee.genesis.controller.dto.VariableDto; @@ -7,7 +7,6 @@ import fr.insee.genesis.domain.model.surveyunit.SurveyUnitModel; import fr.insee.genesis.domain.model.surveyunit.VariableModel; import fr.insee.genesis.domain.service.metadata.QuestionnaireMetadataService; -import fr.insee.genesis.domain.service.surveyunit.SurveyUnitService; import fr.insee.genesis.infrastructure.utils.FileUtils; import fr.insee.genesis.stubs.ConfigStub; import fr.insee.genesis.stubs.QuestionnaireMetadataPersistancePortStub; @@ -243,6 +242,24 @@ void findDistinctInterrogationIdsByQuestionnaireIdTest(){ ).isNotEmpty().hasSize(1); } + @Test + void findDistinctInterrogationIdsByQuestionnaireIdAndDateAfterTest_no_doc_in_period(){ + addAdditionnalSurveyUnitModelToMongoStub(); + + Assertions.assertThat(surveyUnitServiceStatic.findDistinctInterrogationIdsByQuestionnaireIdAndDateAfter(DEFAULT_QUESTIONNAIRE_ID,LocalDateTime.of(2025,9,1,0,0,0))).filteredOn( + interrogationId -> interrogationId.getInterrogationId().equals(DEFAULT_INTERROGATION_ID) + ).isEmpty(); + } + + @Test + void findDistinctInterrogationIdsByQuestionnaireIdAndDateAfterTest_doc_in_period(){ + addAdditionnalSurveyUnitModelToMongoStub(); + + Assertions.assertThat(surveyUnitServiceStatic.findDistinctInterrogationIdsByQuestionnaireIdAndDateAfter(DEFAULT_QUESTIONNAIRE_ID,LocalDateTime.of(2022,1,1,0,0,0))).filteredOn( + interrogationId -> interrogationId.getInterrogationId().equals(DEFAULT_INTERROGATION_ID) + ).isNotEmpty().hasSize(1); + } + @Test void findInterrogationIdsByQuestionnaireIdTest(){ Assertions.assertThat(surveyUnitServiceStatic.findModesByQuestionnaireId(DEFAULT_QUESTIONNAIRE_ID)).filteredOn( diff --git a/src/test/java/fr/insee/genesis/stubs/LastJsonExtractionPersistencePortStub.java b/src/test/java/fr/insee/genesis/stubs/LastJsonExtractionPersistencePortStub.java new file mode 100644 index 00000000..15a94c46 --- /dev/null +++ b/src/test/java/fr/insee/genesis/stubs/LastJsonExtractionPersistencePortStub.java @@ -0,0 +1,31 @@ +package fr.insee.genesis.stubs; + +import fr.insee.genesis.domain.model.extraction.json.LastJsonExtractionModel; +import fr.insee.genesis.domain.model.surveyunit.Mode; +import fr.insee.genesis.domain.ports.spi.LastJsonExtractionPersistencePort; +import fr.insee.genesis.exceptions.GenesisException; +import fr.insee.genesis.infrastructure.document.extraction.json.LastJsonExtractionDocument; +import fr.insee.genesis.infrastructure.mappers.LastJsonExtractionDocumentMapper; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; + +@Getter +public class LastJsonExtractionPersistencePortStub implements LastJsonExtractionPersistencePort { + + List mongoStub = new ArrayList<>(); + @Override + public void save(LastJsonExtractionModel extraction) { + mongoStub.add(LastJsonExtractionDocumentMapper.INSTANCE.modelToDocument(extraction)); + } + + @Override + public LastJsonExtractionModel getLastExecutionDate(String questionnaireModelId, Mode mode) throws GenesisException { + LastJsonExtractionDocument extraction = mongoStub.stream() + .filter(doc -> doc.getId().equals(String.format("%s_%s",questionnaireModelId,mode))) + .findFirst() + .orElseThrow(); + return LastJsonExtractionDocumentMapper.INSTANCE.documentToModel(extraction); + } +} diff --git a/src/test/java/fr/insee/genesis/stubs/SurveyUnitPersistencePortStub.java b/src/test/java/fr/insee/genesis/stubs/SurveyUnitPersistencePortStub.java index b9d8b1c4..cf1e517f 100644 --- a/src/test/java/fr/insee/genesis/stubs/SurveyUnitPersistencePortStub.java +++ b/src/test/java/fr/insee/genesis/stubs/SurveyUnitPersistencePortStub.java @@ -4,6 +4,7 @@ import fr.insee.genesis.domain.ports.spi.SurveyUnitPersistencePort; import lombok.Getter; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.HashSet; import java.util.List; @@ -88,6 +89,19 @@ public List findInterrogationIdsByQuestionnaireId(String questi return surveyUnitModelList; } + @Override + public List findInterrogationIdsByQuestionnaireIdAndDateAfter(String questionnaireId, LocalDateTime since) { + List surveyUnitModelList = new ArrayList<>(); + for(SurveyUnitModel surveyUnitModel : mongoStub){ + if(surveyUnitModel.getQuestionnaireId().equals(questionnaireId) && surveyUnitModel.getRecordDate().isAfter(since)) + surveyUnitModelList.add( + new SurveyUnitModel(surveyUnitModel.getInterrogationId(), surveyUnitModel.getMode()) + ); + } + + return surveyUnitModelList; + } + //======== OPTIMISATIONS PERFS (START) ======== /**