diff --git a/.gitignore b/.gitignore index f6a4090f..21e24e4c 100644 --- a/.gitignore +++ b/.gitignore @@ -50,4 +50,6 @@ src/test/resources/OUT/* /src/test/resources/IN/WEB/SAMPLETEST/ /src/test/resources/IN/WEB/TEST-EDITED-PREVIOUS/ /src/test/resources/IN/WEB/TEST-EDITED-EXTERNAL/ +/src/test/resources/IN/WEB/TEST-CONTEXTUAL-PREVIOUS/ +/src/test/resources/IN/WEB/TEST-CONTEXTUAL-EXTERNAL/ /src/main/resources/application-mbg.properties diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e7ded1f..a314acbe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,11 @@ # Changelog +## 1.9.0 [TODO] +### Added +- Authorizations for scheduled Perret calls +- Get questionnaires by review activated or not endpoint +- Save all edited previous/external files for one questionnaire endpoint +### Changed +- No more 400 if the previous/external file has no corresponding part (warn in log instead) ## 1.8.6 [2025-09-18] ### Added diff --git a/src/main/java/fr/insee/genesis/Constants.java b/src/main/java/fr/insee/genesis/Constants.java index 614bc5c3..f06e6ac9 100644 --- a/src/main/java/fr/insee/genesis/Constants.java +++ b/src/main/java/fr/insee/genesis/Constants.java @@ -18,8 +18,8 @@ public class Constants { public static final String MONGODB_SCHEDULE_COLLECTION_NAME = "schedules"; public static final String MONGODB_CONTEXT_COLLECTION_NAME = "dataProcessingContexts"; - public static final String MONGODB_EDITED_PREVIOUS_COLLECTION_NAME = "editedPrevious"; - public static final String MONGODB_EDITED_EXTERNAL_COLLECTION_NAME = "editedExternal"; + public static final String MONGODB_CONTEXTUAL_PREVIOUS_COLLECTION_NAME = "editedPrevious"; + public static final String MONGODB_CONTEXTUAL_EXTERNAL_COLLECTION_NAME = "editedExternal"; public static final String LOOP_NAME_PREFIX = "BOUCLE"; public static final String MONGODB_RESPONSE_COLLECTION_NAME = "responses"; public static final String MONGODB_RESPONSE_RAW_COLLECTION_NAME = "lunaticjsondata"; diff --git a/src/main/java/fr/insee/genesis/controller/rest/responses/EditedResponseController.java b/src/main/java/fr/insee/genesis/controller/rest/responses/ContextualVariableController.java similarity index 54% rename from src/main/java/fr/insee/genesis/controller/rest/responses/EditedResponseController.java rename to src/main/java/fr/insee/genesis/controller/rest/responses/ContextualVariableController.java index fa454aca..c3b33355 100644 --- a/src/main/java/fr/insee/genesis/controller/rest/responses/EditedResponseController.java +++ b/src/main/java/fr/insee/genesis/controller/rest/responses/ContextualVariableController.java @@ -2,9 +2,9 @@ import fr.insee.genesis.configuration.Config; import fr.insee.genesis.domain.model.surveyunit.Mode; -import fr.insee.genesis.domain.ports.api.EditedExternalResponseApiPort; -import fr.insee.genesis.domain.ports.api.EditedPreviousResponseApiPort; -import fr.insee.genesis.domain.ports.api.EditedResponseApiPort; +import fr.insee.genesis.domain.ports.api.ContextualExternalVariableApiPort; +import fr.insee.genesis.domain.ports.api.ContextualPreviousVariableApiPort; +import fr.insee.genesis.domain.ports.api.ContextualVariableApiPort; import fr.insee.genesis.exceptions.GenesisException; import fr.insee.genesis.infrastructure.utils.FileUtils; import io.swagger.v3.oas.annotations.Operation; @@ -19,39 +19,51 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; -import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.IOException; -import java.io.InputStream; import java.nio.file.Path; -@RequestMapping(path = "/edited") +@RequestMapping(path = "/contextual-variables") @Controller @Slf4j @AllArgsConstructor -public class EditedResponseController { +public class ContextualVariableController { - private final EditedPreviousResponseApiPort editedPreviousResponseApiPort; - private final EditedExternalResponseApiPort editedExternalResponseApiPort; - private final EditedResponseApiPort editedResponseApiPort; + private final ContextualPreviousVariableApiPort contextualPreviousVariableApiPort; + private final ContextualExternalVariableApiPort contextualExternalVariableApiPort; + private final ContextualVariableApiPort contextualVariableApiPort; private final Config config; - @Operation(summary = "Get edited variables (edited and previous)") + @Operation(summary = "Get contextual variables (external and previous)") @GetMapping(path = "/") - @PreAuthorize("hasRole('USER_PLATINE')") - public ResponseEntity getEditedResponses( + @PreAuthorize("hasAnyRole('USER_PLATINE','SCHEDULER')") + public ResponseEntity getContextualVariables( @RequestParam("questionnaireId") String questionnaireId, @RequestParam("interrogationId") String interrogationId ){ return ResponseEntity.ok().body( - editedResponseApiPort.getEditedResponse(questionnaireId, interrogationId) + contextualVariableApiPort.getContextualVariable(questionnaireId, interrogationId) ); } - @Operation(summary = "Add edited previous json file") + @Operation(summary = "Save all contextual variables json files (external and previous)") + @PostMapping(path = "/json") + @PreAuthorize("hasAnyRole('USER_PLATINE','SCHEDULER')") + public ResponseEntity saveContextualVariables( + @RequestParam("questionnaireId") String questionnaireId + ){ + try { + FileUtils fileUtils = new FileUtils(config); + int fileCount = contextualVariableApiPort.saveContextualVariableFiles(questionnaireId, fileUtils); + return ResponseEntity.ok("%d file(s) processed for questionnaire %s !".formatted(fileCount, questionnaireId)); + }catch (GenesisException ge){ + return ResponseEntity.status(HttpStatusCode.valueOf(ge.getStatus())).body(ge.getMessage()); + } + } + + @Operation(summary = "Add contextual previous json file") @PostMapping(path = "previous/json") @PreAuthorize("hasAnyRole('USER_PLATINE','SCHEDULER','USER_BACK_OFFICE')") - public ResponseEntity readEditedPreviousJson( + public ResponseEntity readContextualPreviousJson( @RequestParam("questionnaireId") String questionnaireId, @RequestParam("mode") Mode mode, @RequestParam(value = "sourceState", required = false) String sourceState, @@ -67,18 +79,18 @@ public ResponseEntity readEditedPreviousJson( if (!jsonFileName.toLowerCase().endsWith(".json")) { throw new GenesisException(400, "File must be a JSON file !"); } - readEditedPreviousFile(questionnaireId.toUpperCase(), sourceState, filePath); - moveFiles(questionnaireId, mode, fileUtils, filePath); - return ResponseEntity.ok("Edited previous variable file %s saved !".formatted(filePath)); + contextualPreviousVariableApiPort.readContextualPreviousFile(questionnaireId.toUpperCase(), sourceState, filePath); + moveFile(questionnaireId, mode, fileUtils, filePath); + return ResponseEntity.ok("Contextual previous variable file %s saved !".formatted(filePath)); }catch (GenesisException ge){ return ResponseEntity.status(HttpStatusCode.valueOf(ge.getStatus())).body(ge.getMessage()); } } - @Operation(summary = "Add edited external json file") + @Operation(summary = "Add contextual external json file") @PostMapping(path = "/external/json") @PreAuthorize("hasAnyRole('USER_PLATINE','SCHEDULER','USER_BACK_OFFICE')") - public ResponseEntity readEditedExternalJson( + public ResponseEntity readContextualExternalJson( @RequestParam("questionnaireId") String questionnaireId, @RequestParam("mode") Mode mode, @RequestParam(value = "jsonFileName") String jsonFileName @@ -93,35 +105,15 @@ public ResponseEntity readEditedExternalJson( if (!jsonFileName.toLowerCase().endsWith(".json")) { throw new GenesisException(400, "File must be a JSON file !"); } - readEditedExternalFile(questionnaireId.toUpperCase(), filePath); - moveFiles(questionnaireId, mode, fileUtils, filePath); - return ResponseEntity.ok("Edited external variable file %s saved !".formatted(filePath)); + contextualExternalVariableApiPort.readContextualExternalFile(questionnaireId, filePath); + moveFile(questionnaireId, mode, fileUtils, filePath); + return ResponseEntity.ok("Contextual external variable file %s saved !".formatted(filePath)); }catch (GenesisException ge){ return ResponseEntity.status(HttpStatusCode.valueOf(ge.getStatus())).body(ge.getMessage()); } } - private void readEditedPreviousFile(String questionnaireId, String sourceState, String filePath) throws GenesisException { - try (InputStream inputStream = new FileInputStream(filePath)) { - editedPreviousResponseApiPort.readEditedPreviousFile(inputStream, questionnaireId, sourceState); - } catch (FileNotFoundException e) { - throw new GenesisException(404, "File %s not found".formatted(filePath)); - } catch (IOException e) { - throw new GenesisException(500, e.toString()); - } - } - - private void readEditedExternalFile(String questionnaireId, String filePath) throws GenesisException { - try (InputStream inputStream = new FileInputStream(filePath)) { - editedExternalResponseApiPort.readEditedExternalFile(inputStream, questionnaireId); - } catch (FileNotFoundException e) { - throw new GenesisException(404, "File %s not found".formatted(filePath)); - } catch (IOException e) { - throw new GenesisException(500, e.toString()); - } - } - - private static void moveFiles(String questionnaireId, Mode mode, FileUtils fileUtils, String filePath) throws GenesisException { + private static void moveFile(String questionnaireId, Mode mode, FileUtils fileUtils, String filePath) throws GenesisException { try { fileUtils.moveFiles(Path.of(filePath), fileUtils.getDoneFolder(questionnaireId, mode.getFolder())); } catch (IOException e) { diff --git a/src/main/java/fr/insee/genesis/controller/rest/responses/QuestionnaireController.java b/src/main/java/fr/insee/genesis/controller/rest/responses/QuestionnaireController.java index 68baa76a..c0aaee42 100644 --- a/src/main/java/fr/insee/genesis/controller/rest/responses/QuestionnaireController.java +++ b/src/main/java/fr/insee/genesis/controller/rest/responses/QuestionnaireController.java @@ -2,12 +2,14 @@ import fr.insee.genesis.controller.dto.QuestionnaireWithCampaign; import fr.insee.genesis.controller.rest.CommonApiResponse; +import fr.insee.genesis.domain.ports.api.DataProcessingContextApiPort; import fr.insee.genesis.domain.ports.api.SurveyUnitApiPort; import fr.insee.genesis.exceptions.GenesisException; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; import lombok.extern.slf4j.Slf4j; 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.RequestMapping; @@ -22,21 +24,36 @@ public class QuestionnaireController implements CommonApiResponse { private final SurveyUnitApiPort surveyUnitService; + private final DataProcessingContextApiPort dataProcessingContextService; - public QuestionnaireController(SurveyUnitApiPort surveyUnitService) { + public QuestionnaireController( + SurveyUnitApiPort surveyUnitService, + DataProcessingContextApiPort dataProcessingContextService + ) { this.surveyUnitService = surveyUnitService; + this.dataProcessingContextService = dataProcessingContextService; } - @Operation(summary = "List questionnaires in database") + @Operation(summary = "List questionnaires from responses database") @GetMapping(path = "/") public ResponseEntity> getQuestionnaires() { Set questionnaires = surveyUnitService.findDistinctQuestionnaireIds(); return ResponseEntity.ok(questionnaires); } + @Operation(summary = "List questionnaires in database that have a context with a specific withReview") + @GetMapping(path = "/with-review") + @PreAuthorize("hasAnyRole('USER_PLATINE','SCHEDULER')") + public ResponseEntity> getQuestionnairesWithReview( + @RequestParam(value = "withReview") boolean withReview + ) { + List questionnaires = dataProcessingContextService.getPartitionIds(withReview); + return ResponseEntity.ok(questionnaires); + } + @Operation(summary = "List questionnaires in database with their campaigns") @GetMapping(path = "/with-campaigns") 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 ab7bce91..4de4c496 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 @@ -208,7 +208,7 @@ public ResponseEntity> findResponsesByInterrogationAndQues @Operation(summary = "Retrieve responses for an interrogation, using interrogationId and questionnaireId from Genesis Database with the latest value for each available state of every variable") @GetMapping(path = "/by-ue-and-questionnaire/latest-states", produces = MediaType.APPLICATION_JSON_VALUE) - @PreAuthorize("hasRole('USER_PLATINE')") + @PreAuthorize("hasAnyRole('USER_PLATINE','SCHEDULER')") public ResponseEntity findResponsesByInterrogationAndQuestionnaireLatestStates( @RequestParam("interrogationId") String interrogationId, @RequestParam("questionnaireId") String questionnaireId) throws GenesisException { diff --git a/src/main/java/fr/insee/genesis/domain/model/editedresponse/EditedExternalResponseModel.java b/src/main/java/fr/insee/genesis/domain/model/contextualvariable/ContextualExternalVariableModel.java similarity index 64% rename from src/main/java/fr/insee/genesis/domain/model/editedresponse/EditedExternalResponseModel.java rename to src/main/java/fr/insee/genesis/domain/model/contextualvariable/ContextualExternalVariableModel.java index 91173a03..8be579b3 100644 --- a/src/main/java/fr/insee/genesis/domain/model/editedresponse/EditedExternalResponseModel.java +++ b/src/main/java/fr/insee/genesis/domain/model/contextualvariable/ContextualExternalVariableModel.java @@ -1,4 +1,4 @@ -package fr.insee.genesis.domain.model.editedresponse; +package fr.insee.genesis.domain.model.contextualvariable; import lombok.Builder; import lombok.Data; @@ -7,7 +7,7 @@ @Builder @Data -public class EditedExternalResponseModel { +public class ContextualExternalVariableModel { String id; String questionnaireId; String interrogationId; diff --git a/src/main/java/fr/insee/genesis/domain/model/editedresponse/EditedPreviousResponseModel.java b/src/main/java/fr/insee/genesis/domain/model/contextualvariable/ContextualPreviousVariableModel.java similarity index 67% rename from src/main/java/fr/insee/genesis/domain/model/editedresponse/EditedPreviousResponseModel.java rename to src/main/java/fr/insee/genesis/domain/model/contextualvariable/ContextualPreviousVariableModel.java index 4a7892fa..4ebba43c 100644 --- a/src/main/java/fr/insee/genesis/domain/model/editedresponse/EditedPreviousResponseModel.java +++ b/src/main/java/fr/insee/genesis/domain/model/contextualvariable/ContextualPreviousVariableModel.java @@ -1,4 +1,4 @@ -package fr.insee.genesis.domain.model.editedresponse; +package fr.insee.genesis.domain.model.contextualvariable; import lombok.Builder; import lombok.Data; @@ -7,7 +7,7 @@ @Builder @Data -public class EditedPreviousResponseModel { +public class ContextualPreviousVariableModel { String id; String questionnaireId; String interrogationId; diff --git a/src/main/java/fr/insee/genesis/domain/model/contextualvariable/ContextualVariableModel.java b/src/main/java/fr/insee/genesis/domain/model/contextualvariable/ContextualVariableModel.java new file mode 100644 index 00000000..411f849a --- /dev/null +++ b/src/main/java/fr/insee/genesis/domain/model/contextualvariable/ContextualVariableModel.java @@ -0,0 +1,13 @@ +package fr.insee.genesis.domain.model.contextualvariable; + +import fr.insee.genesis.controller.dto.VariableQualityToolDto; +import lombok.Builder; + +import java.util.List; + +@Builder +public record ContextualVariableModel( + String interrogationId, + List contextualPrevious, + List contextualExternal +){} diff --git a/src/main/java/fr/insee/genesis/domain/model/editedresponse/EditedResponseModel.java b/src/main/java/fr/insee/genesis/domain/model/editedresponse/EditedResponseModel.java deleted file mode 100644 index 58e789b0..00000000 --- a/src/main/java/fr/insee/genesis/domain/model/editedresponse/EditedResponseModel.java +++ /dev/null @@ -1,13 +0,0 @@ -package fr.insee.genesis.domain.model.editedresponse; - -import fr.insee.genesis.controller.dto.VariableQualityToolDto; -import lombok.Builder; - -import java.util.List; - -@Builder -public record EditedResponseModel( - String interrogationId, - List editedPrevious, - List editedExternal -){} diff --git a/src/main/java/fr/insee/genesis/domain/ports/api/ContextualExternalVariableApiPort.java b/src/main/java/fr/insee/genesis/domain/ports/api/ContextualExternalVariableApiPort.java new file mode 100644 index 00000000..8c085834 --- /dev/null +++ b/src/main/java/fr/insee/genesis/domain/ports/api/ContextualExternalVariableApiPort.java @@ -0,0 +1,10 @@ +package fr.insee.genesis.domain.ports.api; + +import fr.insee.genesis.domain.model.contextualvariable.ContextualExternalVariableModel; +import fr.insee.genesis.exceptions.GenesisException; + +public interface ContextualExternalVariableApiPort { + boolean readContextualExternalFile(String questionnaireId, String filePath) throws GenesisException; + + ContextualExternalVariableModel findByQuestionnaireIdAndInterrogationId(String questionnaireId, String interrogationId); +} diff --git a/src/main/java/fr/insee/genesis/domain/ports/api/ContextualPreviousVariableApiPort.java b/src/main/java/fr/insee/genesis/domain/ports/api/ContextualPreviousVariableApiPort.java new file mode 100644 index 00000000..6cbf31fd --- /dev/null +++ b/src/main/java/fr/insee/genesis/domain/ports/api/ContextualPreviousVariableApiPort.java @@ -0,0 +1,12 @@ +package fr.insee.genesis.domain.ports.api; + +import fr.insee.genesis.domain.model.contextualvariable.ContextualPreviousVariableModel; +import fr.insee.genesis.exceptions.GenesisException; + +import java.io.InputStream; + +public interface ContextualPreviousVariableApiPort { + boolean readContextualPreviousFile(String questionnaireId, String sourceState, String filePath) throws GenesisException; + + ContextualPreviousVariableModel findByQuestionnaireIdAndInterrogationId(String questionnaireId, String interrogationId); +} diff --git a/src/main/java/fr/insee/genesis/domain/ports/api/ContextualVariableApiPort.java b/src/main/java/fr/insee/genesis/domain/ports/api/ContextualVariableApiPort.java new file mode 100644 index 00000000..25ce22e0 --- /dev/null +++ b/src/main/java/fr/insee/genesis/domain/ports/api/ContextualVariableApiPort.java @@ -0,0 +1,10 @@ +package fr.insee.genesis.domain.ports.api; + +import fr.insee.genesis.domain.model.contextualvariable.ContextualVariableModel; +import fr.insee.genesis.exceptions.GenesisException; +import fr.insee.genesis.infrastructure.utils.FileUtils; + +public interface ContextualVariableApiPort { + ContextualVariableModel getContextualVariable(String questionnaireId, String interrogationId); + int saveContextualVariableFiles(String questionnaireId, FileUtils fileUtils) throws GenesisException; +} \ No newline at end of file diff --git a/src/main/java/fr/insee/genesis/domain/ports/api/DataProcessingContextApiPort.java b/src/main/java/fr/insee/genesis/domain/ports/api/DataProcessingContextApiPort.java index 7b45abf8..0e08b153 100644 --- a/src/main/java/fr/insee/genesis/domain/ports/api/DataProcessingContextApiPort.java +++ b/src/main/java/fr/insee/genesis/domain/ports/api/DataProcessingContextApiPort.java @@ -32,5 +32,5 @@ void saveKraftwerkExecutionSchedule(String partitionId, DataProcessingContextModel getContext(String interrogationId) throws GenesisException; DataProcessingContextModel getContextByPartitionId(String partitionId) throws GenesisException; - + List getPartitionIds(boolean withReview); } diff --git a/src/main/java/fr/insee/genesis/domain/ports/api/EditedExternalResponseApiPort.java b/src/main/java/fr/insee/genesis/domain/ports/api/EditedExternalResponseApiPort.java deleted file mode 100644 index b9d0943e..00000000 --- a/src/main/java/fr/insee/genesis/domain/ports/api/EditedExternalResponseApiPort.java +++ /dev/null @@ -1,9 +0,0 @@ -package fr.insee.genesis.domain.ports.api; - -import fr.insee.genesis.exceptions.GenesisException; - -import java.io.InputStream; - -public interface EditedExternalResponseApiPort { - void readEditedExternalFile(InputStream inputStream, String questionnaireId) throws GenesisException; - } diff --git a/src/main/java/fr/insee/genesis/domain/ports/api/EditedPreviousResponseApiPort.java b/src/main/java/fr/insee/genesis/domain/ports/api/EditedPreviousResponseApiPort.java deleted file mode 100644 index 676f7bda..00000000 --- a/src/main/java/fr/insee/genesis/domain/ports/api/EditedPreviousResponseApiPort.java +++ /dev/null @@ -1,9 +0,0 @@ -package fr.insee.genesis.domain.ports.api; - -import fr.insee.genesis.exceptions.GenesisException; - -import java.io.InputStream; - -public interface EditedPreviousResponseApiPort { - void readEditedPreviousFile(InputStream inputStream, String questionnaireId, String sourceState) throws GenesisException; - } diff --git a/src/main/java/fr/insee/genesis/domain/ports/api/EditedResponseApiPort.java b/src/main/java/fr/insee/genesis/domain/ports/api/EditedResponseApiPort.java deleted file mode 100644 index e467a2e6..00000000 --- a/src/main/java/fr/insee/genesis/domain/ports/api/EditedResponseApiPort.java +++ /dev/null @@ -1,7 +0,0 @@ -package fr.insee.genesis.domain.ports.api; - -import fr.insee.genesis.domain.model.editedresponse.EditedResponseModel; - -public interface EditedResponseApiPort { - EditedResponseModel getEditedResponse(String questionnaireId, String interrogationId); -} \ No newline at end of file diff --git a/src/main/java/fr/insee/genesis/domain/ports/spi/ContextualExternalVariablePersistancePort.java b/src/main/java/fr/insee/genesis/domain/ports/spi/ContextualExternalVariablePersistancePort.java new file mode 100644 index 00000000..37ed1ef7 --- /dev/null +++ b/src/main/java/fr/insee/genesis/domain/ports/spi/ContextualExternalVariablePersistancePort.java @@ -0,0 +1,14 @@ +package fr.insee.genesis.domain.ports.spi; + +import fr.insee.genesis.domain.model.contextualvariable.ContextualExternalVariableModel; + +import java.util.List; + +public interface ContextualExternalVariablePersistancePort { + void backup(String questionnaireId); + void deleteBackup(String questionnaireId); + void restoreBackup(String questionnaireId); + void saveAll(List contextualPreviousVariableModelList); + void delete(String questionnaireId); + ContextualExternalVariableModel findByQuestionnaireIdAndInterrogationId(String questionnaireId, String interrogationId); +} \ No newline at end of file diff --git a/src/main/java/fr/insee/genesis/domain/ports/spi/ContextualPreviousVariablePersistancePort.java b/src/main/java/fr/insee/genesis/domain/ports/spi/ContextualPreviousVariablePersistancePort.java new file mode 100644 index 00000000..d791e91b --- /dev/null +++ b/src/main/java/fr/insee/genesis/domain/ports/spi/ContextualPreviousVariablePersistancePort.java @@ -0,0 +1,14 @@ +package fr.insee.genesis.domain.ports.spi; + +import fr.insee.genesis.domain.model.contextualvariable.ContextualPreviousVariableModel; + +import java.util.List; + +public interface ContextualPreviousVariablePersistancePort { + void backup(String questionnaireId); + void deleteBackup(String questionnaireId); + void restoreBackup(String questionnaireId); + void saveAll(List contextualPreviousVariableModelList); + void delete(String questionnaireId); + ContextualPreviousVariableModel findByQuestionnaireIdAndInterrogationId(String questionnaireId, String interrogationId); +} \ No newline at end of file diff --git a/src/main/java/fr/insee/genesis/domain/ports/spi/DataProcessingContextPersistancePort.java b/src/main/java/fr/insee/genesis/domain/ports/spi/DataProcessingContextPersistancePort.java index 210d7989..eb579253 100644 --- a/src/main/java/fr/insee/genesis/domain/ports/spi/DataProcessingContextPersistancePort.java +++ b/src/main/java/fr/insee/genesis/domain/ports/spi/DataProcessingContextPersistancePort.java @@ -22,4 +22,6 @@ public interface DataProcessingContextPersistancePort { long count(); List removeExpiredSchedules(DataProcessingContextModel dataProcessingContextModel); + + List findAllByReview(boolean withReview); } diff --git a/src/main/java/fr/insee/genesis/domain/ports/spi/EditedExternalResponsePersistancePort.java b/src/main/java/fr/insee/genesis/domain/ports/spi/EditedExternalResponsePersistancePort.java deleted file mode 100644 index fd82ac29..00000000 --- a/src/main/java/fr/insee/genesis/domain/ports/spi/EditedExternalResponsePersistancePort.java +++ /dev/null @@ -1,14 +0,0 @@ -package fr.insee.genesis.domain.ports.spi; - -import fr.insee.genesis.domain.model.editedresponse.EditedExternalResponseModel; - -import java.util.List; - -public interface EditedExternalResponsePersistancePort { - void backup(String questionnaireId); - void deleteBackup(String questionnaireId); - void restoreBackup(String questionnaireId); - void saveAll(List editedPreviousResponseModelList); - void delete(String questionnaireId); - EditedExternalResponseModel findByQuestionnaireIdAndInterrogationId(String questionnaireId, String interrogationId); -} \ No newline at end of file diff --git a/src/main/java/fr/insee/genesis/domain/ports/spi/EditedPreviousResponsePersistancePort.java b/src/main/java/fr/insee/genesis/domain/ports/spi/EditedPreviousResponsePersistancePort.java deleted file mode 100644 index 192c5d9d..00000000 --- a/src/main/java/fr/insee/genesis/domain/ports/spi/EditedPreviousResponsePersistancePort.java +++ /dev/null @@ -1,14 +0,0 @@ -package fr.insee.genesis.domain.ports.spi; - -import fr.insee.genesis.domain.model.editedresponse.EditedPreviousResponseModel; - -import java.util.List; - -public interface EditedPreviousResponsePersistancePort { - void backup(String questionnaireId); - void deleteBackup(String questionnaireId); - void restoreBackup(String questionnaireId); - void saveAll(List editedPreviousResponseModelList); - void delete(String questionnaireId); - EditedPreviousResponseModel findByQuestionnaireIdAndInterrogationId(String questionnaireId, String interrogationId); -} \ No newline at end of file diff --git a/src/main/java/fr/insee/genesis/domain/service/context/DataProcessingContextService.java b/src/main/java/fr/insee/genesis/domain/service/context/DataProcessingContextService.java index 5e1d351d..a371bbea 100644 --- a/src/main/java/fr/insee/genesis/domain/service/context/DataProcessingContextService.java +++ b/src/main/java/fr/insee/genesis/domain/service/context/DataProcessingContextService.java @@ -173,4 +173,15 @@ public DataProcessingContextModel getContextByPartitionId(String partitionId){ ); } + @Override + public List getPartitionIds(boolean withReview){ + List partitionIds = new ArrayList<>(); + for(DataProcessingContextModel dataProcessingContextModel + : DataProcessingContextMapper.INSTANCE.listDocumentToListModel( + dataProcessingContextPersistancePort.findAllByReview(withReview) + )){ + partitionIds.add(dataProcessingContextModel.getPartitionId()); + } + return partitionIds; + } } diff --git a/src/main/java/fr/insee/genesis/domain/service/contextualvariable/ContextualVariableJsonService.java b/src/main/java/fr/insee/genesis/domain/service/contextualvariable/ContextualVariableJsonService.java new file mode 100644 index 00000000..780ee420 --- /dev/null +++ b/src/main/java/fr/insee/genesis/domain/service/contextualvariable/ContextualVariableJsonService.java @@ -0,0 +1,160 @@ +package fr.insee.genesis.domain.service.contextualvariable; + +import fr.insee.genesis.controller.dto.VariableQualityToolDto; +import fr.insee.genesis.controller.dto.VariableStateDto; +import fr.insee.genesis.domain.model.contextualvariable.ContextualExternalVariableModel; +import fr.insee.genesis.domain.model.contextualvariable.ContextualPreviousVariableModel; +import fr.insee.genesis.domain.model.contextualvariable.ContextualVariableModel; +import fr.insee.genesis.domain.model.surveyunit.DataState; +import fr.insee.genesis.domain.model.surveyunit.Mode; +import fr.insee.genesis.domain.ports.api.ContextualExternalVariableApiPort; +import fr.insee.genesis.domain.ports.api.ContextualPreviousVariableApiPort; +import fr.insee.genesis.domain.ports.api.ContextualVariableApiPort; +import fr.insee.genesis.exceptions.GenesisException; +import fr.insee.genesis.infrastructure.utils.FileUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.NoSuchFileException; +import java.nio.file.Path; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.stream.Stream; + +@Service +@Slf4j +public class ContextualVariableJsonService implements ContextualVariableApiPort { + private final ContextualPreviousVariableApiPort contextualPreviousVariableApiPort; + private final ContextualExternalVariableApiPort contextualExternalVariableApiPort; + + @Autowired + public ContextualVariableJsonService(ContextualPreviousVariableApiPort contextualPreviousVariableApiPort, ContextualExternalVariableApiPort contextualExternalVariableApiPort) { + this.contextualPreviousVariableApiPort = contextualPreviousVariableApiPort; + this.contextualExternalVariableApiPort = contextualExternalVariableApiPort; + } + + @Override + public ContextualVariableModel getContextualVariable(String questionnaireId, String interrogationId) { + ContextualVariableModel contextualVariableModel = ContextualVariableModel.builder() + .interrogationId(interrogationId) + .contextualPrevious(new ArrayList<>()) + .contextualExternal(new ArrayList<>()) + .build(); + + ContextualPreviousVariableModel contextualPreviousVariableModel = + contextualPreviousVariableApiPort.findByQuestionnaireIdAndInterrogationId( + questionnaireId, + interrogationId + ); + + if(contextualPreviousVariableModel != null) { + for (Map.Entry variable : contextualPreviousVariableModel.getVariables().entrySet()) { + contextualVariableModel.contextualPrevious().addAll(extractVariables(variable.getValue(), variable.getKey())); + } + } + + ContextualExternalVariableModel contextualExternalVariableModel = + contextualExternalVariableApiPort.findByQuestionnaireIdAndInterrogationId( + questionnaireId, + interrogationId + ); + + if(contextualExternalVariableModel != null) { + for (Map.Entry variable : contextualExternalVariableModel.getVariables().entrySet()) { + contextualVariableModel.contextualExternal().addAll(extractVariables(variable.getValue(), variable.getKey())); + } + } + + return contextualVariableModel; + } + + @Override + public int saveContextualVariableFiles(String questionnaireId, FileUtils fileUtils) throws GenesisException { + int fileCount = 0; + + for (Mode mode : Mode.values()) { + try (Stream filePaths = Files.list(Path.of(fileUtils.getDataFolder(questionnaireId, + mode.getFolder() + , null)))) { + Iterator it = filePaths + .filter(path -> path.toString().endsWith(".json")) + .iterator(); + while (it.hasNext()) { + Path jsonFilePath = it.next(); + if (processContextualVariableFile(questionnaireId, jsonFilePath)) { + //If the file is indeed a contextual variables file and had been processed + moveFile(questionnaireId, mode, fileUtils, jsonFilePath.toString()); + fileCount++; + } + } + } catch (NoSuchFileException nsfe) { + log.debug(nsfe.toString()); + } catch (IOException ioe) { + log.warn(ioe.toString()); + } + } + return fileCount; + } + + private static void moveFile(String questionnaireId, Mode mode, FileUtils fileUtils, String filePath) throws GenesisException { + try { + fileUtils.moveFiles(Path.of(filePath), fileUtils.getDoneFolder(questionnaireId, mode.getFolder())); + } catch (IOException e) { + throw new GenesisException(500, "Error while moving file to done : %s".formatted(e.toString())); + } + } + + @SuppressWarnings("unchecked") + private List extractVariables(Object variable, String variableName) { + List variableQualityToolDtos = new ArrayList<>(); + + if(!(variable instanceof List)){ + variableQualityToolDtos.add(extractValue(variable, variableName, 1)); + return variableQualityToolDtos; + } + + int i = 1; + for(Object element : (List)variable){ + variableQualityToolDtos.add(extractValue(element, variableName, i)); + i++; + } + return variableQualityToolDtos; + } + + private VariableQualityToolDto extractValue(Object variable, String variableName, int iteration) { + VariableQualityToolDto variableQualityToolDto = VariableQualityToolDto.builder() + .variableName(variableName) + .iteration(iteration) + .variableStateDtoList(new ArrayList<>()) + .build(); + variableQualityToolDto.getVariableStateDtoList().add( + VariableStateDto.builder() + .state(DataState.COLLECTED) + .active(true) + .value(variable) + .date(LocalDateTime.now()) + .build() + ); + return variableQualityToolDto; + } + + /** + * @return true if any contextual variable part found in file, false otherwise + */ + private boolean processContextualVariableFile(String questionnaireId, Path jsonFilePath) throws GenesisException { + return contextualPreviousVariableApiPort.readContextualPreviousFile( + questionnaireId.toUpperCase(), + null, + jsonFilePath.toString() + ) || contextualExternalVariableApiPort.readContextualExternalFile( + questionnaireId.toUpperCase(), + jsonFilePath.toString() + ); + } +} diff --git a/src/main/java/fr/insee/genesis/domain/service/contextualvariable/external/ContextualExternalVariableJsonService.java b/src/main/java/fr/insee/genesis/domain/service/contextualvariable/external/ContextualExternalVariableJsonService.java new file mode 100644 index 00000000..cd1f1d3e --- /dev/null +++ b/src/main/java/fr/insee/genesis/domain/service/contextualvariable/external/ContextualExternalVariableJsonService.java @@ -0,0 +1,154 @@ +package fr.insee.genesis.domain.service.contextualvariable.external; + +import com.fasterxml.jackson.core.JsonFactory; +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; +import fr.insee.genesis.domain.model.contextualvariable.ContextualExternalVariableModel; +import fr.insee.genesis.domain.ports.api.ContextualExternalVariableApiPort; +import fr.insee.genesis.domain.ports.spi.ContextualExternalVariablePersistancePort; +import fr.insee.genesis.domain.utils.JsonUtils; +import fr.insee.genesis.exceptions.GenesisException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.io.FileInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +@Service +@Slf4j +public class ContextualExternalVariableJsonService implements ContextualExternalVariableApiPort { + private final ContextualExternalVariablePersistancePort contextualExternalVariablePersistancePort; + + private static final int BLOCK_SIZE = 1000; + + @Autowired + public ContextualExternalVariableJsonService(ContextualExternalVariablePersistancePort contextualExternalVariablePersistancePort) { + this.contextualExternalVariablePersistancePort = contextualExternalVariablePersistancePort; + } + + @Override + public boolean readContextualExternalFile(String questionnaireId, String filePath) throws GenesisException { + try(FileInputStream inputStream = new FileInputStream(filePath)){ + JsonFactory jsonFactory = new JsonFactory(); + moveCollectionToBackup(questionnaireId); + try(JsonParser jsonParser = jsonFactory.createParser(inputStream)){ + List toSave = new ArrayList<>(); + goToContextualExternalToken(jsonParser); + long savedCount = 0; + Set savedInterrogationIds = new HashSet<>(); + if(jsonParser.nextToken() == null){ //skip field name, stop if end of file + log.warn("Reached end of file, found no contextualExternal part."); + return false; + } + jsonParser.nextToken(); //skip [ + while (jsonParser.currentToken() != JsonToken.END_ARRAY) { + ContextualExternalVariableModel contextualExternalVariableModel = readNextContextualExternal( + jsonParser, + questionnaireId + ); + + checkModel(contextualExternalVariableModel, jsonParser, savedInterrogationIds); + + toSave.add(contextualExternalVariableModel); + savedInterrogationIds.add(contextualExternalVariableModel.getInterrogationId()); + + if(toSave.size() >= BLOCK_SIZE){ + savedCount = saveBlock(toSave, savedCount); + } + jsonParser.nextToken(); + } + contextualExternalVariablePersistancePort.saveAll(toSave); + savedCount += toSave.size(); + log.info("Reached end of contextual external file, saved %d interrogations".formatted(savedCount)); + contextualExternalVariablePersistancePort.deleteBackup(questionnaireId); + return true; + } + }catch (JsonParseException jpe){ + contextualExternalVariablePersistancePort.restoreBackup(questionnaireId); + throw new GenesisException(400, "JSON Parsing exception : %s".formatted(jpe.toString())); + }catch (IOException ioe){ + contextualExternalVariablePersistancePort.restoreBackup(questionnaireId); + throw new GenesisException(500, ioe.toString()); + } + } + + @Override + public ContextualExternalVariableModel findByQuestionnaireIdAndInterrogationId(String questionnaireId, String interrogationId) { + return contextualExternalVariablePersistancePort.findByQuestionnaireIdAndInterrogationId(questionnaireId, interrogationId); + } + + private static void goToContextualExternalToken(JsonParser jsonParser) throws IOException{ + boolean isTokenFound = false; + while (!isTokenFound){ + jsonParser.nextToken(); + if(jsonParser.currentToken() == null){ + return; + } + if(jsonParser.currentToken().equals(JsonToken.FIELD_NAME) + && jsonParser.currentName() != null + && jsonParser.currentName().equals("editedExternal")) { + isTokenFound = true; + } + } + } + + private void moveCollectionToBackup(String questionnaireId) { + contextualExternalVariablePersistancePort.backup(questionnaireId); + contextualExternalVariablePersistancePort.delete(questionnaireId); + } + + private long saveBlock(List toSave, long savedCount) { + contextualExternalVariablePersistancePort.saveAll(toSave); + savedCount += toSave.size(); + toSave.clear(); + return savedCount; + } + + private static void checkModel(ContextualExternalVariableModel contextualExternalVariableModel, JsonParser jsonParser, Set savedInterrogationIds) throws GenesisException { + if(contextualExternalVariableModel.getInterrogationId() == null){ + throw new GenesisException(400, + "Missing interrogationId on the object that ends on line %d" + .formatted(jsonParser.currentLocation().getLineNr()) + ); + } + if(savedInterrogationIds.contains(contextualExternalVariableModel.getInterrogationId())){ + throw new GenesisException(400, + "Double interrogationId : %s".formatted(contextualExternalVariableModel.getInterrogationId())); + } + } + + private ContextualExternalVariableModel readNextContextualExternal(JsonParser jsonParser, + String questionnaireId + ) throws IOException { + if(jsonParser.currentToken() != JsonToken.START_OBJECT){ + throw new JsonParseException("Expected { on line %d, got token %s".formatted(jsonParser.currentLocation().getLineNr(), jsonParser.currentToken())); + } + ContextualExternalVariableModel contextualExternalVariableModel = ContextualExternalVariableModel.builder() + .questionnaireId(questionnaireId) + .variables(new HashMap<>()) + .build(); + jsonParser.nextToken(); + while (!jsonParser.currentToken().equals(JsonToken.END_OBJECT)){ + if(jsonParser.currentToken().equals(JsonToken.FIELD_NAME) && jsonParser.currentName().equals("interrogationId")){ + jsonParser.nextToken(); + contextualExternalVariableModel.setInterrogationId(jsonParser.getText()); + jsonParser.nextToken(); + continue; + } + jsonParser.nextToken(); + contextualExternalVariableModel.getVariables().put( + jsonParser.currentName(), + JsonUtils.readValue(jsonParser) + ); + jsonParser.nextToken(); + } + return contextualExternalVariableModel; + } +} diff --git a/src/main/java/fr/insee/genesis/domain/service/editedresponse/editedprevious/EditedPreviousResponseJsonService.java b/src/main/java/fr/insee/genesis/domain/service/contextualvariable/previous/ContextualPreviousVariableJsonService.java similarity index 50% rename from src/main/java/fr/insee/genesis/domain/service/editedresponse/editedprevious/EditedPreviousResponseJsonService.java rename to src/main/java/fr/insee/genesis/domain/service/contextualvariable/previous/ContextualPreviousVariableJsonService.java index 903c3c18..1af94d4c 100644 --- a/src/main/java/fr/insee/genesis/domain/service/editedresponse/editedprevious/EditedPreviousResponseJsonService.java +++ b/src/main/java/fr/insee/genesis/domain/service/contextualvariable/previous/ContextualPreviousVariableJsonService.java @@ -1,20 +1,20 @@ -package fr.insee.genesis.domain.service.editedresponse.editedprevious; +package fr.insee.genesis.domain.service.contextualvariable.previous; import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonToken; -import fr.insee.genesis.domain.model.editedresponse.EditedPreviousResponseModel; -import fr.insee.genesis.domain.ports.api.EditedPreviousResponseApiPort; -import fr.insee.genesis.domain.ports.spi.EditedPreviousResponsePersistancePort; +import fr.insee.genesis.domain.model.contextualvariable.ContextualPreviousVariableModel; +import fr.insee.genesis.domain.ports.api.ContextualPreviousVariableApiPort; +import fr.insee.genesis.domain.ports.spi.ContextualPreviousVariablePersistancePort; import fr.insee.genesis.domain.utils.JsonUtils; import fr.insee.genesis.exceptions.GenesisException; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.io.FileInputStream; import java.io.IOException; -import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -23,70 +23,84 @@ @Service @Slf4j -public class EditedPreviousResponseJsonService implements EditedPreviousResponseApiPort { - private final EditedPreviousResponsePersistancePort editedPreviousResponsePersistancePort; +public class ContextualPreviousVariableJsonService implements ContextualPreviousVariableApiPort { + private final ContextualPreviousVariablePersistancePort contextualPreviousVariablePersistancePort; private static final int BLOCK_SIZE = 1000; @Autowired - public EditedPreviousResponseJsonService(EditedPreviousResponsePersistancePort editedPreviousResponsePersistancePort) { - this.editedPreviousResponsePersistancePort = editedPreviousResponsePersistancePort; + public ContextualPreviousVariableJsonService(ContextualPreviousVariablePersistancePort contextualPreviousVariablePersistancePort) { + this.contextualPreviousVariablePersistancePort = contextualPreviousVariablePersistancePort; } @Override - public void readEditedPreviousFile(InputStream inputStream, - String questionnaireId, - String sourceState) throws GenesisException { - checkSourceStateLength(sourceState); - moveCollectionToBackup(questionnaireId); - - JsonFactory jsonFactory = new JsonFactory(); - try(JsonParser jsonParser = jsonFactory.createParser(inputStream)){ - List toSave = new ArrayList<>(); - goToEditedPreviousToken(jsonParser); - long savedCount = 0; - Set savedInterrogationIds = new HashSet<>(); - jsonParser.nextToken(); //skip field name - jsonParser.nextToken(); //skip [ - while (jsonParser.currentToken() != JsonToken.END_ARRAY) { - EditedPreviousResponseModel editedPreviousResponseModel = readNextEditedPrevious( - jsonParser, - questionnaireId, - sourceState - ); - - checkModel(editedPreviousResponseModel, jsonParser, savedInterrogationIds); - - toSave.add(editedPreviousResponseModel); - savedInterrogationIds.add(editedPreviousResponseModel.getInterrogationId()); - - if(toSave.size() >= BLOCK_SIZE){ - savedCount = saveBlock(toSave, savedCount); + public boolean readContextualPreviousFile(String questionnaireId, + String sourceState, + String filePath) throws GenesisException { + try(FileInputStream inputStream = new FileInputStream(filePath)){ + checkSourceStateLength(sourceState); + moveCollectionToBackup(questionnaireId); + + JsonFactory jsonFactory = new JsonFactory(); + try (JsonParser jsonParser = jsonFactory.createParser(inputStream)) { + List toSave = new ArrayList<>(); + goToEditedPreviousToken(jsonParser); + long savedCount = 0; + Set savedInterrogationIds = new HashSet<>(); + if (jsonParser.nextToken() == null) { //skip field name, stop if end of file + log.warn("Reached end of file, found no EditedPrevious part."); + return false; } - jsonParser.nextToken(); + jsonParser.nextToken(); //skip [ + while (jsonParser.currentToken() != JsonToken.END_ARRAY) { + ContextualPreviousVariableModel contextualPreviousVariableModel = readNextContextualPrevious( + jsonParser, + questionnaireId, + sourceState + ); + + checkModel(contextualPreviousVariableModel, jsonParser, savedInterrogationIds); + + toSave.add(contextualPreviousVariableModel); + savedInterrogationIds.add(contextualPreviousVariableModel.getInterrogationId()); + + if (toSave.size() >= BLOCK_SIZE) { + savedCount = saveBlock(toSave, savedCount); + } + jsonParser.nextToken(); + } + savedCount = saveBlock(toSave, savedCount); + log.info("Reached end of contextual previous file, saved %d interrogations".formatted(savedCount)); + contextualPreviousVariablePersistancePort.deleteBackup(questionnaireId); + return true; } - savedCount = saveBlock(toSave, savedCount); - log.info("Reached end of edited previous file, saved %d interrogations".formatted(savedCount)); - editedPreviousResponsePersistancePort.deleteBackup(questionnaireId); }catch (JsonParseException jpe){ - editedPreviousResponsePersistancePort.restoreBackup(questionnaireId); + contextualPreviousVariablePersistancePort.restoreBackup(questionnaireId); throw new GenesisException(400, "JSON Parsing exception : %s".formatted(jpe.toString())); }catch (IOException ioe){ - editedPreviousResponsePersistancePort.restoreBackup(questionnaireId); + contextualPreviousVariablePersistancePort.restoreBackup(questionnaireId); throw new GenesisException(500, ioe.toString()); } } - private long saveBlock(List toSave, long savedCount) { - editedPreviousResponsePersistancePort.saveAll(toSave); + @Override + public ContextualPreviousVariableModel findByQuestionnaireIdAndInterrogationId(String questionnaireId, String interrogationId) { + return contextualPreviousVariablePersistancePort.findByQuestionnaireIdAndInterrogationId( + questionnaireId, + interrogationId + ); + } + + private long saveBlock(List toSave, long savedCount) { + contextualPreviousVariablePersistancePort.saveAll(toSave); savedCount += toSave.size(); toSave.clear(); return savedCount; } private void moveCollectionToBackup(String questionnaireId) { - editedPreviousResponsePersistancePort.backup(questionnaireId); - editedPreviousResponsePersistancePort.delete(questionnaireId); + contextualPreviousVariablePersistancePort.backup(questionnaireId); + contextualPreviousVariablePersistancePort.delete(questionnaireId); } private static void checkSourceStateLength(String sourceState) throws GenesisException { @@ -95,12 +109,12 @@ private static void checkSourceStateLength(String sourceState) throws GenesisExc } } - private static void goToEditedPreviousToken(JsonParser jsonParser) throws IOException, GenesisException { + private static void goToEditedPreviousToken(JsonParser jsonParser) throws IOException{ boolean isTokenFound = false; while (!isTokenFound){ jsonParser.nextToken(); if(jsonParser.currentToken() == null){ - throw new GenesisException(400, "editedPrevious object not found in JSON"); + return; } if(jsonParser.currentToken().equals(JsonToken.FIELD_NAME) && jsonParser.currentName() != null @@ -110,14 +124,14 @@ private static void goToEditedPreviousToken(JsonParser jsonParser) throws IOExce } } - private EditedPreviousResponseModel readNextEditedPrevious(JsonParser jsonParser, + private ContextualPreviousVariableModel readNextContextualPrevious(JsonParser jsonParser, String questionnaireId, String sourceState ) throws IOException { if(jsonParser.currentToken() != JsonToken.START_OBJECT){ throw new JsonParseException("Expected { on line %d, got token %s".formatted(jsonParser.currentLocation().getLineNr(), jsonParser.currentToken())); } - EditedPreviousResponseModel editedPreviousResponseModel = EditedPreviousResponseModel.builder() + ContextualPreviousVariableModel contextualPreviousVariableModel = ContextualPreviousVariableModel.builder() .questionnaireId(questionnaireId) .sourceState(sourceState) .variables(new HashMap<>()) @@ -126,18 +140,18 @@ private EditedPreviousResponseModel readNextEditedPrevious(JsonParser jsonParser while (!jsonParser.currentToken().equals(JsonToken.END_OBJECT)){ if(jsonParser.currentToken().equals(JsonToken.FIELD_NAME) && jsonParser.currentName().equals("interrogationId")){ jsonParser.nextToken(); - editedPreviousResponseModel.setInterrogationId(jsonParser.getText()); + contextualPreviousVariableModel.setInterrogationId(jsonParser.getText()); jsonParser.nextToken(); continue; } jsonParser.nextToken(); - editedPreviousResponseModel.getVariables().put( + contextualPreviousVariableModel.getVariables().put( jsonParser.currentName(), JsonUtils.readValue(jsonParser) ); jsonParser.nextToken(); } - return editedPreviousResponseModel; + return contextualPreviousVariableModel; } private Object readValue(JsonParser jsonParser) throws IOException{ @@ -176,16 +190,16 @@ private List readArray(JsonParser jsonParser) throws IOException { return list; } - private static void checkModel(EditedPreviousResponseModel editedPreviousResponseModel, JsonParser jsonParser, Set savedInterrogationIds) throws GenesisException { - if(editedPreviousResponseModel.getInterrogationId() == null){ + private static void checkModel(ContextualPreviousVariableModel contextualPreviousVariableModel, JsonParser jsonParser, Set savedInterrogationIds) throws GenesisException { + if(contextualPreviousVariableModel.getInterrogationId() == null){ throw new GenesisException(400, "Missing interrogationId on the object that ends on line %d" .formatted(jsonParser.currentLocation().getLineNr()) ); } - if(savedInterrogationIds.contains(editedPreviousResponseModel.getInterrogationId())){ + if(savedInterrogationIds.contains(contextualPreviousVariableModel.getInterrogationId())){ throw new GenesisException(400, - "Double interrogationId : %s".formatted(editedPreviousResponseModel.getInterrogationId())); + "Double interrogationId : %s".formatted(contextualPreviousVariableModel.getInterrogationId())); } } } diff --git a/src/main/java/fr/insee/genesis/domain/service/editedresponse/EditedResponseJsonService.java b/src/main/java/fr/insee/genesis/domain/service/editedresponse/EditedResponseJsonService.java deleted file mode 100644 index afb322e0..00000000 --- a/src/main/java/fr/insee/genesis/domain/service/editedresponse/EditedResponseJsonService.java +++ /dev/null @@ -1,100 +0,0 @@ -package fr.insee.genesis.domain.service.editedresponse; - -import fr.insee.genesis.controller.dto.VariableQualityToolDto; -import fr.insee.genesis.controller.dto.VariableStateDto; -import fr.insee.genesis.domain.model.editedresponse.EditedExternalResponseModel; -import fr.insee.genesis.domain.model.editedresponse.EditedPreviousResponseModel; -import fr.insee.genesis.domain.model.editedresponse.EditedResponseModel; -import fr.insee.genesis.domain.model.surveyunit.DataState; -import fr.insee.genesis.domain.ports.api.EditedResponseApiPort; -import fr.insee.genesis.domain.ports.spi.EditedExternalResponsePersistancePort; -import fr.insee.genesis.domain.ports.spi.EditedPreviousResponsePersistancePort; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -@Service -public class EditedResponseJsonService implements EditedResponseApiPort { - private final EditedPreviousResponsePersistancePort editedPreviousResponsePersistancePort; - private final EditedExternalResponsePersistancePort editedExternalResponsePersistancePort; - - @Autowired - public EditedResponseJsonService(EditedPreviousResponsePersistancePort editedPreviousResponsePersistancePort, EditedExternalResponsePersistancePort editedExternalResponsePersistancePort) { - this.editedPreviousResponsePersistancePort = editedPreviousResponsePersistancePort; - this.editedExternalResponsePersistancePort = editedExternalResponsePersistancePort; - } - - @Override - public EditedResponseModel getEditedResponse(String questionnaireId, String interrogationId) { - EditedResponseModel editedResponseModel = EditedResponseModel.builder() - .interrogationId(interrogationId) - .editedPrevious(new ArrayList<>()) - .editedExternal(new ArrayList<>()) - .build(); - - EditedPreviousResponseModel editedPreviousResponseModel = - editedPreviousResponsePersistancePort.findByQuestionnaireIdAndInterrogationId( - questionnaireId, - interrogationId - ); - - if(editedPreviousResponseModel != null) { - for (Map.Entry variable : editedPreviousResponseModel.getVariables().entrySet()) { - editedResponseModel.editedPrevious().addAll(extractVariables(variable.getValue(), variable.getKey())); - } - } - - EditedExternalResponseModel editedExternalResponseModel = - editedExternalResponsePersistancePort.findByQuestionnaireIdAndInterrogationId( - questionnaireId, - interrogationId - ); - - if(editedExternalResponseModel != null) { - for (Map.Entry variable : editedExternalResponseModel.getVariables().entrySet()) { - editedResponseModel.editedExternal().addAll(extractVariables(variable.getValue(), variable.getKey())); - } - } - - return editedResponseModel; - } - - @SuppressWarnings("unchecked") - private List extractVariables(Object variable, String variableName) { - List variableQualityToolDtos = new ArrayList<>(); - - if(!(variable instanceof List)){ - variableQualityToolDtos.add(extractValue(variable, variableName, 1)); - return variableQualityToolDtos; - } - - int i = 1; - for(Object element : (List)variable){ - variableQualityToolDtos.add(extractValue(element, variableName, i)); - i++; - } - return variableQualityToolDtos; - } - - private VariableQualityToolDto extractValue(Object variable, String variableName, int iteration) { - VariableQualityToolDto variableQualityToolDto = VariableQualityToolDto.builder() - .variableName(variableName) - .iteration(iteration) - .variableStateDtoList(new ArrayList<>()) - .build(); - variableQualityToolDto.getVariableStateDtoList().add( - VariableStateDto.builder() - .state(DataState.COLLECTED) - .active(true) - .value(variable) - .date(LocalDateTime.now()) - .build() - ); - return variableQualityToolDto; - } - -} diff --git a/src/main/java/fr/insee/genesis/domain/service/editedresponse/editedexternal/EditedExternalResponseJsonService.java b/src/main/java/fr/insee/genesis/domain/service/editedresponse/editedexternal/EditedExternalResponseJsonService.java deleted file mode 100644 index 9424c427..00000000 --- a/src/main/java/fr/insee/genesis/domain/service/editedresponse/editedexternal/EditedExternalResponseJsonService.java +++ /dev/null @@ -1,144 +0,0 @@ -package fr.insee.genesis.domain.service.editedresponse.editedexternal; - -import com.fasterxml.jackson.core.JsonFactory; -import com.fasterxml.jackson.core.JsonParseException; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonToken; -import fr.insee.genesis.domain.model.editedresponse.EditedExternalResponseModel; -import fr.insee.genesis.domain.ports.api.EditedExternalResponseApiPort; -import fr.insee.genesis.domain.ports.spi.EditedExternalResponsePersistancePort; -import fr.insee.genesis.domain.utils.JsonUtils; -import fr.insee.genesis.exceptions.GenesisException; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -@Service -@Slf4j -public class EditedExternalResponseJsonService implements EditedExternalResponseApiPort { - private final EditedExternalResponsePersistancePort editedExternalResponsePersistancePort; - - private static final int BLOCK_SIZE = 1000; - - @Autowired - public EditedExternalResponseJsonService(EditedExternalResponsePersistancePort editedExternalResponsePersistancePort) { - this.editedExternalResponsePersistancePort = editedExternalResponsePersistancePort; - } - - @Override - public void readEditedExternalFile(InputStream inputStream, - String questionnaireId) throws GenesisException { - JsonFactory jsonFactory = new JsonFactory(); - moveCollectionToBackup(questionnaireId); - try(JsonParser jsonParser = jsonFactory.createParser(inputStream)){ - List toSave = new ArrayList<>(); - goToEditedExternalToken(jsonParser); - long savedCount = 0; - Set savedInterrogationIds = new HashSet<>(); - jsonParser.nextToken(); //skip field name - jsonParser.nextToken(); //skip [ - while (jsonParser.currentToken() != JsonToken.END_ARRAY) { - EditedExternalResponseModel editedExternalResponseModel = readNextEditedExternal( - jsonParser, - questionnaireId - ); - - checkModel(editedExternalResponseModel, jsonParser, savedInterrogationIds); - - toSave.add(editedExternalResponseModel); - savedInterrogationIds.add(editedExternalResponseModel.getInterrogationId()); - - if(toSave.size() >= BLOCK_SIZE){ - savedCount = saveBlock(toSave, savedCount); - } - jsonParser.nextToken(); - } - editedExternalResponsePersistancePort.saveAll(toSave); - savedCount += toSave.size(); - log.info("Reached end of edited external file, saved %d interrogations".formatted(savedCount)); - editedExternalResponsePersistancePort.deleteBackup(questionnaireId); - }catch (JsonParseException jpe){ - editedExternalResponsePersistancePort.restoreBackup(questionnaireId); - throw new GenesisException(400, "JSON Parsing exception : %s".formatted(jpe.toString())); - }catch (IOException ioe){ - editedExternalResponsePersistancePort.restoreBackup(questionnaireId); - throw new GenesisException(500, ioe.toString()); - } - } - - private static void goToEditedExternalToken(JsonParser jsonParser) throws IOException, GenesisException { - boolean isTokenFound = false; - while (!isTokenFound){ - jsonParser.nextToken(); - if(jsonParser.currentToken() == null){ - throw new GenesisException(400, "editedExternal object not found in JSON"); - } - if(jsonParser.currentToken().equals(JsonToken.FIELD_NAME) - && jsonParser.currentName() != null - && jsonParser.currentName().equals("editedExternal")) { - isTokenFound = true; - } - } - } - - private void moveCollectionToBackup(String questionnaireId) { - editedExternalResponsePersistancePort.backup(questionnaireId); - editedExternalResponsePersistancePort.delete(questionnaireId); - } - - private long saveBlock(List toSave, long savedCount) { - editedExternalResponsePersistancePort.saveAll(toSave); - savedCount += toSave.size(); - toSave.clear(); - return savedCount; - } - - private static void checkModel(EditedExternalResponseModel editedExternalResponseModel, JsonParser jsonParser, Set savedInterrogationIds) throws GenesisException { - if(editedExternalResponseModel.getInterrogationId() == null){ - throw new GenesisException(400, - "Missing interrogationId on the object that ends on line %d" - .formatted(jsonParser.currentLocation().getLineNr()) - ); - } - if(savedInterrogationIds.contains(editedExternalResponseModel.getInterrogationId())){ - throw new GenesisException(400, - "Double interrogationId : %s".formatted(editedExternalResponseModel.getInterrogationId())); - } - } - - private EditedExternalResponseModel readNextEditedExternal(JsonParser jsonParser, - String questionnaireId - ) throws IOException { - if(jsonParser.currentToken() != JsonToken.START_OBJECT){ - throw new JsonParseException("Expected { on line %d, got token %s".formatted(jsonParser.currentLocation().getLineNr(), jsonParser.currentToken())); - } - EditedExternalResponseModel editedExternalResponseModel = EditedExternalResponseModel.builder() - .questionnaireId(questionnaireId) - .variables(new HashMap<>()) - .build(); - jsonParser.nextToken(); - while (!jsonParser.currentToken().equals(JsonToken.END_OBJECT)){ - if(jsonParser.currentToken().equals(JsonToken.FIELD_NAME) && jsonParser.currentName().equals("interrogationId")){ - jsonParser.nextToken(); - editedExternalResponseModel.setInterrogationId(jsonParser.getText()); - jsonParser.nextToken(); - continue; - } - jsonParser.nextToken(); - editedExternalResponseModel.getVariables().put( - jsonParser.currentName(), - JsonUtils.readValue(jsonParser) - ); - jsonParser.nextToken(); - } - return editedExternalResponseModel; - } -} diff --git a/src/main/java/fr/insee/genesis/infrastructure/adapter/EditedExternalResponseMongoAdapter.java b/src/main/java/fr/insee/genesis/infrastructure/adapter/ContextualExternalVariableMongoAdapter.java similarity index 60% rename from src/main/java/fr/insee/genesis/infrastructure/adapter/EditedExternalResponseMongoAdapter.java rename to src/main/java/fr/insee/genesis/infrastructure/adapter/ContextualExternalVariableMongoAdapter.java index bfd43782..80ca813e 100644 --- a/src/main/java/fr/insee/genesis/infrastructure/adapter/EditedExternalResponseMongoAdapter.java +++ b/src/main/java/fr/insee/genesis/infrastructure/adapter/ContextualExternalVariableMongoAdapter.java @@ -1,10 +1,10 @@ package fr.insee.genesis.infrastructure.adapter; -import fr.insee.genesis.domain.model.editedresponse.EditedExternalResponseModel; -import fr.insee.genesis.domain.ports.spi.EditedExternalResponsePersistancePort; -import fr.insee.genesis.infrastructure.document.editedexternal.EditedExternalResponseDocument; -import fr.insee.genesis.infrastructure.mappers.EditedExternalResponseDocumentMapper; -import fr.insee.genesis.infrastructure.repository.EditedExternalResponseMongoDBRepository; +import fr.insee.genesis.domain.model.contextualvariable.ContextualExternalVariableModel; +import fr.insee.genesis.domain.ports.spi.ContextualExternalVariablePersistancePort; +import fr.insee.genesis.infrastructure.document.contextualexternal.ContextualExternalVariableDocument; +import fr.insee.genesis.infrastructure.mappers.ContextualExternalVariableDocumentMapper; +import fr.insee.genesis.infrastructure.repository.ContextualExternalVariableMongoDBRepository; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.data.mongodb.core.MongoTemplate; @@ -18,12 +18,12 @@ @Slf4j @Service -@Qualifier("editedExternalResponseMongoAdapter") -public class EditedExternalResponseMongoAdapter implements EditedExternalResponsePersistancePort { +@Qualifier("contextualExternalVariableMongoAdapter") +public class ContextualExternalVariableMongoAdapter implements ContextualExternalVariablePersistancePort { private final MongoTemplate mongoTemplate; - private final EditedExternalResponseMongoDBRepository repository; + private final ContextualExternalVariableMongoDBRepository repository; - public EditedExternalResponseMongoAdapter(EditedExternalResponseMongoDBRepository repository, MongoTemplate mongoTemplate) { + public ContextualExternalVariableMongoAdapter(ContextualExternalVariableMongoDBRepository repository, MongoTemplate mongoTemplate) { this.repository = repository; this.mongoTemplate = mongoTemplate; } @@ -41,7 +41,7 @@ public void backup(String questionnaireId) { Aggregation aggregation = Aggregation.newAggregation(match, merge); - mongoTemplate.aggregate(aggregation, "editedExternalResponses", EditedExternalResponseDocument.class); + mongoTemplate.aggregate(aggregation, "editedExternalResponses", ContextualExternalVariableDocument.class); } private static String getFormattedCollection(String questionnaireId) { @@ -68,13 +68,13 @@ public void restoreBackup(String questionnaireId) { Aggregation aggregation = Aggregation.newAggregation(merge); mongoTemplate.aggregate(aggregation, getFormattedCollection(questionnaireId), - EditedExternalResponseDocument.class); + ContextualExternalVariableDocument.class); } @Override - public void saveAll(List editedExternalResponseModelList) { - repository.saveAll(EditedExternalResponseDocumentMapper.INSTANCE.listModelToListDocument( - editedExternalResponseModelList) + public void saveAll(List contextualExternalVariableModelList) { + repository.saveAll(ContextualExternalVariableDocumentMapper.INSTANCE.listModelToListDocument( + contextualExternalVariableModelList) ); } @@ -84,15 +84,15 @@ public void delete(String questionnaireId) { } @Override - public EditedExternalResponseModel findByQuestionnaireIdAndInterrogationId(String questionnaireId, String interrogationId) { - List editedExternalResponseDocumentList = + public ContextualExternalVariableModel findByQuestionnaireIdAndInterrogationId(String questionnaireId, String interrogationId) { + List contextualExternalVariableDocumentList = repository.findByQuestionnaireIdAndInterrogationId(questionnaireId, interrogationId); - if(editedExternalResponseDocumentList.isEmpty()){ + if(contextualExternalVariableDocumentList.isEmpty()){ return null; } - if(editedExternalResponseDocumentList.size() > 1){ - log.warn("More than 1 edited external response document for questionnaire {}, interrogation {}", questionnaireId, interrogationId); + if(contextualExternalVariableDocumentList.size() > 1){ + log.warn("More than 1 contextual external response document for questionnaire {}, interrogation {}", questionnaireId, interrogationId); } - return EditedExternalResponseDocumentMapper.INSTANCE.documentToModel(editedExternalResponseDocumentList.getFirst()); + return ContextualExternalVariableDocumentMapper.INSTANCE.documentToModel(contextualExternalVariableDocumentList.getFirst()); } } diff --git a/src/main/java/fr/insee/genesis/infrastructure/adapter/EditedPreviousResponseMongoAdapter.java b/src/main/java/fr/insee/genesis/infrastructure/adapter/ContextualPreviousVariableMongoAdapter.java similarity index 60% rename from src/main/java/fr/insee/genesis/infrastructure/adapter/EditedPreviousResponseMongoAdapter.java rename to src/main/java/fr/insee/genesis/infrastructure/adapter/ContextualPreviousVariableMongoAdapter.java index 8fdbf458..d8cf34f2 100644 --- a/src/main/java/fr/insee/genesis/infrastructure/adapter/EditedPreviousResponseMongoAdapter.java +++ b/src/main/java/fr/insee/genesis/infrastructure/adapter/ContextualPreviousVariableMongoAdapter.java @@ -1,10 +1,10 @@ package fr.insee.genesis.infrastructure.adapter; -import fr.insee.genesis.domain.model.editedresponse.EditedPreviousResponseModel; -import fr.insee.genesis.domain.ports.spi.EditedPreviousResponsePersistancePort; -import fr.insee.genesis.infrastructure.document.editedprevious.EditedPreviousResponseDocument; -import fr.insee.genesis.infrastructure.mappers.EditedPreviousResponseDocumentMapper; -import fr.insee.genesis.infrastructure.repository.EditedPreviousResponseMongoDBRepository; +import fr.insee.genesis.domain.model.contextualvariable.ContextualPreviousVariableModel; +import fr.insee.genesis.domain.ports.spi.ContextualPreviousVariablePersistancePort; +import fr.insee.genesis.infrastructure.document.contextualprevious.ContextualPreviousVariableDocument; +import fr.insee.genesis.infrastructure.mappers.ContextualPreviousVariableDocumentMapper; +import fr.insee.genesis.infrastructure.repository.ContextualPreviousVariableMongoDBRepository; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.data.mongodb.core.MongoTemplate; @@ -18,12 +18,12 @@ @Slf4j @Service -@Qualifier("editedPreviousResponseMongoAdapter") -public class EditedPreviousResponseMongoAdapter implements EditedPreviousResponsePersistancePort { +@Qualifier("contextualPreviousVariableMongoAdapter") +public class ContextualPreviousVariableMongoAdapter implements ContextualPreviousVariablePersistancePort { private final MongoTemplate mongoTemplate; - private final EditedPreviousResponseMongoDBRepository repository; + private final ContextualPreviousVariableMongoDBRepository repository; - public EditedPreviousResponseMongoAdapter(EditedPreviousResponseMongoDBRepository repository, MongoTemplate mongoTemplate) { + public ContextualPreviousVariableMongoAdapter(ContextualPreviousVariableMongoDBRepository repository, MongoTemplate mongoTemplate) { this.repository = repository; this.mongoTemplate = mongoTemplate; } @@ -41,7 +41,7 @@ public void backup(String questionnaireId) { Aggregation aggregation = Aggregation.newAggregation(match, merge); - mongoTemplate.aggregate(aggregation, "editedPreviousResponses", EditedPreviousResponseDocument.class); + mongoTemplate.aggregate(aggregation, "editedPreviousResponses", ContextualPreviousVariableDocument.class); } private static String getFormattedCollection(String questionnaireId) { @@ -68,13 +68,13 @@ public void restoreBackup(String questionnaireId) { Aggregation aggregation = Aggregation.newAggregation(merge); mongoTemplate.aggregate(aggregation, getFormattedCollection(questionnaireId), - EditedPreviousResponseDocument.class); + ContextualPreviousVariableDocument.class); } @Override - public void saveAll(List editedPreviousResponseModelList) { - repository.saveAll(EditedPreviousResponseDocumentMapper.INSTANCE.listModelToListDocument( - editedPreviousResponseModelList) + public void saveAll(List contextualPreviousVariableModelList) { + repository.saveAll(ContextualPreviousVariableDocumentMapper.INSTANCE.listModelToListDocument( + contextualPreviousVariableModelList) ); } @@ -84,15 +84,15 @@ public void delete(String questionnaireId) { } @Override - public EditedPreviousResponseModel findByQuestionnaireIdAndInterrogationId(String questionnaireId, String interrogationId) { - List editedPreviousResponseDocumentList = + public ContextualPreviousVariableModel findByQuestionnaireIdAndInterrogationId(String questionnaireId, String interrogationId) { + List contextualPreviousVariableDocumentList = repository.findByQuestionnaireIdAndInterrogationId(questionnaireId, interrogationId); - if(editedPreviousResponseDocumentList.isEmpty()){ + if(contextualPreviousVariableDocumentList.isEmpty()){ return null; } - if(editedPreviousResponseDocumentList.size() > 1){ - log.warn("More than 1 edited previous response document for questionnaire {}, interrogation {}", questionnaireId, interrogationId); + if(contextualPreviousVariableDocumentList.size() > 1){ + log.warn("More than 1 contextual previous response document for questionnaire {}, interrogation {}", questionnaireId, interrogationId); } - return EditedPreviousResponseDocumentMapper.INSTANCE.documentToModel(editedPreviousResponseDocumentList.getFirst()); + return ContextualPreviousVariableDocumentMapper.INSTANCE.documentToModel(contextualPreviousVariableDocumentList.getFirst()); } } diff --git a/src/main/java/fr/insee/genesis/infrastructure/adapter/DataProcessingContextMongoAdapter.java b/src/main/java/fr/insee/genesis/infrastructure/adapter/DataProcessingContextMongoAdapter.java index eeb41c0c..f104965a 100644 --- a/src/main/java/fr/insee/genesis/infrastructure/adapter/DataProcessingContextMongoAdapter.java +++ b/src/main/java/fr/insee/genesis/infrastructure/adapter/DataProcessingContextMongoAdapter.java @@ -92,4 +92,12 @@ public List removeExpiredSchedules(DataProcessingCon } return deletedKraftwerkExecutionSchedules; } + + @Override + public List findAllByReview(boolean withReview) { + return ContextDedupUtils.deduplicateContexts(dataProcessingContextMongoDBRepository.findAll()) + .stream().filter(doc -> + doc.isWithReview() == withReview + ).toList(); + } } diff --git a/src/main/java/fr/insee/genesis/infrastructure/document/editedexternal/EditedExternalResponseDocument.java b/src/main/java/fr/insee/genesis/infrastructure/document/contextualexternal/ContextualExternalVariableDocument.java similarity index 74% rename from src/main/java/fr/insee/genesis/infrastructure/document/editedexternal/EditedExternalResponseDocument.java rename to src/main/java/fr/insee/genesis/infrastructure/document/contextualexternal/ContextualExternalVariableDocument.java index 5db6aa36..1a15caa5 100644 --- a/src/main/java/fr/insee/genesis/infrastructure/document/editedexternal/EditedExternalResponseDocument.java +++ b/src/main/java/fr/insee/genesis/infrastructure/document/contextualexternal/ContextualExternalVariableDocument.java @@ -1,4 +1,4 @@ -package fr.insee.genesis.infrastructure.document.editedexternal; +package fr.insee.genesis.infrastructure.document.contextualexternal; import fr.insee.genesis.Constants; import lombok.Data; @@ -10,9 +10,9 @@ import java.util.Map; @Data -@Document(collection = Constants.MONGODB_EDITED_EXTERNAL_COLLECTION_NAME) +@Document(collection = Constants.MONGODB_CONTEXTUAL_EXTERNAL_COLLECTION_NAME) @CompoundIndex(name = "questionnaireId_1_interrogationId_1", def = "{'questionnaireId': 1, 'interrogationId': 1}") -public class EditedExternalResponseDocument { +public class ContextualExternalVariableDocument { @Id private String id; @Indexed diff --git a/src/main/java/fr/insee/genesis/infrastructure/document/editedprevious/EditedPreviousResponseDocument.java b/src/main/java/fr/insee/genesis/infrastructure/document/contextualprevious/ContextualPreviousVariableDocument.java similarity index 75% rename from src/main/java/fr/insee/genesis/infrastructure/document/editedprevious/EditedPreviousResponseDocument.java rename to src/main/java/fr/insee/genesis/infrastructure/document/contextualprevious/ContextualPreviousVariableDocument.java index 0816939f..f3ef57a9 100644 --- a/src/main/java/fr/insee/genesis/infrastructure/document/editedprevious/EditedPreviousResponseDocument.java +++ b/src/main/java/fr/insee/genesis/infrastructure/document/contextualprevious/ContextualPreviousVariableDocument.java @@ -1,4 +1,4 @@ -package fr.insee.genesis.infrastructure.document.editedprevious; +package fr.insee.genesis.infrastructure.document.contextualprevious; import fr.insee.genesis.Constants; import lombok.Data; @@ -10,9 +10,9 @@ import java.util.Map; @Data -@Document(collection = Constants.MONGODB_EDITED_PREVIOUS_COLLECTION_NAME) +@Document(collection = Constants.MONGODB_CONTEXTUAL_PREVIOUS_COLLECTION_NAME) @CompoundIndex(name = "questionnaireId_1_interrogationId_1", def = "{'questionnaireId': 1, 'interrogationId': 1}") -public class EditedPreviousResponseDocument { +public class ContextualPreviousVariableDocument { @Id private String id; @Indexed diff --git a/src/main/java/fr/insee/genesis/infrastructure/mappers/ContextualExternalVariableDocumentMapper.java b/src/main/java/fr/insee/genesis/infrastructure/mappers/ContextualExternalVariableDocumentMapper.java new file mode 100644 index 00000000..5366caff --- /dev/null +++ b/src/main/java/fr/insee/genesis/infrastructure/mappers/ContextualExternalVariableDocumentMapper.java @@ -0,0 +1,21 @@ +package fr.insee.genesis.infrastructure.mappers; + +import fr.insee.genesis.domain.model.contextualvariable.ContextualExternalVariableModel; +import fr.insee.genesis.infrastructure.document.contextualexternal.ContextualExternalVariableDocument; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface ContextualExternalVariableDocumentMapper { + ContextualExternalVariableDocumentMapper INSTANCE = Mappers.getMapper(ContextualExternalVariableDocumentMapper.class); + + ContextualExternalVariableModel documentToModel(ContextualExternalVariableDocument contextualExternalDoc); + + ContextualExternalVariableDocument modelToDocument(ContextualExternalVariableModel rawDataModel); + + List listDocumentToListModel(List rawDataDocumentList); + + List listModelToListDocument(List rawDataModelList); +} diff --git a/src/main/java/fr/insee/genesis/infrastructure/mappers/ContextualPreviousVariableDocumentMapper.java b/src/main/java/fr/insee/genesis/infrastructure/mappers/ContextualPreviousVariableDocumentMapper.java new file mode 100644 index 00000000..d4919fc6 --- /dev/null +++ b/src/main/java/fr/insee/genesis/infrastructure/mappers/ContextualPreviousVariableDocumentMapper.java @@ -0,0 +1,21 @@ +package fr.insee.genesis.infrastructure.mappers; + +import fr.insee.genesis.domain.model.contextualvariable.ContextualPreviousVariableModel; +import fr.insee.genesis.infrastructure.document.contextualprevious.ContextualPreviousVariableDocument; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface ContextualPreviousVariableDocumentMapper { + ContextualPreviousVariableDocumentMapper INSTANCE = Mappers.getMapper(ContextualPreviousVariableDocumentMapper.class); + + ContextualPreviousVariableModel documentToModel(ContextualPreviousVariableDocument contextualPreviousDoc); + + ContextualPreviousVariableDocument modelToDocument(ContextualPreviousVariableModel rawDataModel); + + List listDocumentToListModel(List rawDataDocumentList); + + List listModelToListDocument(List rawDataModelList); +} diff --git a/src/main/java/fr/insee/genesis/infrastructure/mappers/EditedExternalResponseDocumentMapper.java b/src/main/java/fr/insee/genesis/infrastructure/mappers/EditedExternalResponseDocumentMapper.java deleted file mode 100644 index 179ee19c..00000000 --- a/src/main/java/fr/insee/genesis/infrastructure/mappers/EditedExternalResponseDocumentMapper.java +++ /dev/null @@ -1,21 +0,0 @@ -package fr.insee.genesis.infrastructure.mappers; - -import fr.insee.genesis.domain.model.editedresponse.EditedExternalResponseModel; -import fr.insee.genesis.infrastructure.document.editedexternal.EditedExternalResponseDocument; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -@Mapper -public interface EditedExternalResponseDocumentMapper { - EditedExternalResponseDocumentMapper INSTANCE = Mappers.getMapper(EditedExternalResponseDocumentMapper.class); - - EditedExternalResponseModel documentToModel(EditedExternalResponseDocument editedExternalDoc); - - EditedExternalResponseDocument modelToDocument(EditedExternalResponseModel rawDataModel); - - List listDocumentToListModel(List rawDataDocumentList); - - List listModelToListDocument(List rawDataModelList); -} diff --git a/src/main/java/fr/insee/genesis/infrastructure/mappers/EditedPreviousResponseDocumentMapper.java b/src/main/java/fr/insee/genesis/infrastructure/mappers/EditedPreviousResponseDocumentMapper.java deleted file mode 100644 index f76dcdb7..00000000 --- a/src/main/java/fr/insee/genesis/infrastructure/mappers/EditedPreviousResponseDocumentMapper.java +++ /dev/null @@ -1,21 +0,0 @@ -package fr.insee.genesis.infrastructure.mappers; - -import fr.insee.genesis.domain.model.editedresponse.EditedPreviousResponseModel; -import fr.insee.genesis.infrastructure.document.editedprevious.EditedPreviousResponseDocument; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -@Mapper -public interface EditedPreviousResponseDocumentMapper { - EditedPreviousResponseDocumentMapper INSTANCE = Mappers.getMapper(EditedPreviousResponseDocumentMapper.class); - - EditedPreviousResponseModel documentToModel(EditedPreviousResponseDocument editedPreviousDoc); - - EditedPreviousResponseDocument modelToDocument(EditedPreviousResponseModel rawDataModel); - - List listDocumentToListModel(List rawDataDocumentList); - - List listModelToListDocument(List rawDataModelList); -} diff --git a/src/main/java/fr/insee/genesis/infrastructure/repository/EditedExternalResponseMongoDBRepository.java b/src/main/java/fr/insee/genesis/infrastructure/repository/ContextualExternalVariableMongoDBRepository.java similarity index 52% rename from src/main/java/fr/insee/genesis/infrastructure/repository/EditedExternalResponseMongoDBRepository.java rename to src/main/java/fr/insee/genesis/infrastructure/repository/ContextualExternalVariableMongoDBRepository.java index 6f78e10d..e9bc22ec 100644 --- a/src/main/java/fr/insee/genesis/infrastructure/repository/EditedExternalResponseMongoDBRepository.java +++ b/src/main/java/fr/insee/genesis/infrastructure/repository/ContextualExternalVariableMongoDBRepository.java @@ -1,6 +1,6 @@ package fr.insee.genesis.infrastructure.repository; -import fr.insee.genesis.infrastructure.document.editedexternal.EditedExternalResponseDocument; +import fr.insee.genesis.infrastructure.document.contextualexternal.ContextualExternalVariableDocument; import org.springframework.data.mongodb.repository.MongoRepository; import org.springframework.data.mongodb.repository.Query; import org.springframework.stereotype.Repository; @@ -8,9 +8,9 @@ import java.util.List; @Repository -public interface EditedExternalResponseMongoDBRepository extends MongoRepository { +public interface ContextualExternalVariableMongoDBRepository extends MongoRepository { void deleteByQuestionnaireId(String questionnaireId); @Query(value = "{ 'questionnaireId' : ?0, 'interrogationId' : ?1 }") - List findByQuestionnaireIdAndInterrogationId(String questionnaireId, String interrogationId); + List findByQuestionnaireIdAndInterrogationId(String questionnaireId, String interrogationId); } diff --git a/src/main/java/fr/insee/genesis/infrastructure/repository/EditedPreviousResponseMongoDBRepository.java b/src/main/java/fr/insee/genesis/infrastructure/repository/ContextualPreviousVariableMongoDBRepository.java similarity index 52% rename from src/main/java/fr/insee/genesis/infrastructure/repository/EditedPreviousResponseMongoDBRepository.java rename to src/main/java/fr/insee/genesis/infrastructure/repository/ContextualPreviousVariableMongoDBRepository.java index 910b4653..f5604747 100644 --- a/src/main/java/fr/insee/genesis/infrastructure/repository/EditedPreviousResponseMongoDBRepository.java +++ b/src/main/java/fr/insee/genesis/infrastructure/repository/ContextualPreviousVariableMongoDBRepository.java @@ -1,6 +1,6 @@ package fr.insee.genesis.infrastructure.repository; -import fr.insee.genesis.infrastructure.document.editedprevious.EditedPreviousResponseDocument; +import fr.insee.genesis.infrastructure.document.contextualprevious.ContextualPreviousVariableDocument; import org.springframework.data.mongodb.repository.MongoRepository; import org.springframework.data.mongodb.repository.Query; import org.springframework.stereotype.Repository; @@ -8,9 +8,9 @@ import java.util.List; @Repository -public interface EditedPreviousResponseMongoDBRepository extends MongoRepository { +public interface ContextualPreviousVariableMongoDBRepository extends MongoRepository { void deleteByQuestionnaireId(String questionnaireId); @Query(value = "{ 'questionnaireId' : ?0, 'interrogationId' : ?1 }") - List findByQuestionnaireIdAndInterrogationId(String questionnaireId, String interrogationId); + List findByQuestionnaireIdAndInterrogationId(String questionnaireId, String interrogationId); } diff --git a/src/test/java/cucumber/functional_tests/LunaticModelDefinitions.java b/src/test/java/cucumber/functional_tests/LunaticModelDefinitions.java index 3b3f9ca3..efb5916c 100644 --- a/src/test/java/cucumber/functional_tests/LunaticModelDefinitions.java +++ b/src/test/java/cucumber/functional_tests/LunaticModelDefinitions.java @@ -7,6 +7,7 @@ import fr.insee.genesis.controller.rest.LunaticModelController; import fr.insee.genesis.controller.rest.responses.QuestionnaireController; import fr.insee.genesis.domain.model.surveyunit.SurveyUnitModel; +import fr.insee.genesis.domain.service.context.DataProcessingContextService; import fr.insee.genesis.domain.service.lunaticmodel.LunaticModelService; import fr.insee.genesis.domain.service.metadata.QuestionnaireMetadataService; import fr.insee.genesis.domain.service.surveyunit.SurveyUnitService; @@ -14,6 +15,7 @@ import fr.insee.genesis.infrastructure.document.lunaticmodel.LunaticModelDocument; import fr.insee.genesis.infrastructure.utils.FileUtils; import fr.insee.genesis.stubs.ConfigStub; +import fr.insee.genesis.stubs.DataProcessingContextPersistancePortStub; import fr.insee.genesis.stubs.LunaticModelPersistanceStub; import fr.insee.genesis.stubs.QuestionnaireMetadataPersistancePortStub; import fr.insee.genesis.stubs.SurveyUnitPersistencePortStub; @@ -53,6 +55,10 @@ public class LunaticModelDefinitions { surveyUnitPersistencePortStub, new QuestionnaireMetadataService(questionnaireMetadataPersistancePortStub), new FileUtils(new ConfigStub()) + ), + new DataProcessingContextService( + new DataProcessingContextPersistancePortStub(), + surveyUnitPersistencePortStub ) ); diff --git a/src/test/java/cucumber/functional_tests/config/CucumberSpringConfiguration.java b/src/test/java/cucumber/functional_tests/config/CucumberSpringConfiguration.java index de35902b..f7304759 100644 --- a/src/test/java/cucumber/functional_tests/config/CucumberSpringConfiguration.java +++ b/src/test/java/cucumber/functional_tests/config/CucumberSpringConfiguration.java @@ -2,8 +2,8 @@ import fr.insee.genesis.GenesisApi; import fr.insee.genesis.infrastructure.repository.DataProcessingContextMongoDBRepository; -import fr.insee.genesis.infrastructure.repository.EditedExternalResponseMongoDBRepository; -import fr.insee.genesis.infrastructure.repository.EditedPreviousResponseMongoDBRepository; +import fr.insee.genesis.infrastructure.repository.ContextualExternalVariableMongoDBRepository; +import fr.insee.genesis.infrastructure.repository.ContextualPreviousVariableMongoDBRepository; import fr.insee.genesis.infrastructure.repository.LunaticJsonMongoDBRepository; import fr.insee.genesis.infrastructure.repository.LunaticModelMongoDBRepository; import fr.insee.genesis.infrastructure.repository.QuestionnaireMetadataMongoDBRepository; @@ -39,9 +39,9 @@ public class CucumberSpringConfiguration { @MockitoBean private DataProcessingContextMongoDBRepository dataProcessingContextMongoDBRepository; @MockitoBean - private EditedPreviousResponseMongoDBRepository editedPreviousResponseMongoDBRepository; + private ContextualPreviousVariableMongoDBRepository contextualPreviousVariableMongoDBRepository; @MockitoBean - private EditedExternalResponseMongoDBRepository editedExternalResponseMongoDBRepository; + private ContextualExternalVariableMongoDBRepository contextualExternalVariableMongoDBRepository; @MockitoBean private QuestionnaireMetadataMongoDBRepository questionnaireMetadataMongoDBRepository; } 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 f757f8ca..68d07770 100644 --- a/src/test/java/fr/insee/genesis/controller/rest/ControllerAccessTest.java +++ b/src/test/java/fr/insee/genesis/controller/rest/ControllerAccessTest.java @@ -4,8 +4,8 @@ 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.EditedExternalResponseMongoDBRepository; -import fr.insee.genesis.infrastructure.repository.EditedPreviousResponseMongoDBRepository; +import fr.insee.genesis.infrastructure.repository.ContextualExternalVariableMongoDBRepository; +import fr.insee.genesis.infrastructure.repository.ContextualPreviousVariableMongoDBRepository; import fr.insee.genesis.infrastructure.repository.LunaticJsonMongoDBRepository; import fr.insee.genesis.infrastructure.repository.LunaticModelMongoDBRepository; import fr.insee.genesis.infrastructure.repository.QuestionnaireMetadataMongoDBRepository; @@ -88,9 +88,9 @@ class ControllerAccessTest { @MockitoBean private LunaticModelMongoDBRepository lunaticModelMongoDBRepository; @MockitoBean - private EditedPreviousResponseMongoDBRepository editedPreviousResponseMongoDBRepository; + private ContextualPreviousVariableMongoDBRepository contextualPreviousVariableMongoDBRepository; @MockitoBean - private EditedExternalResponseMongoDBRepository editedExternalResponseMongoDBRepository; + private ContextualExternalVariableMongoDBRepository contextualExternalVariableMongoDBRepository; @MockitoBean private QuestionnaireMetadataMongoDBRepository questionnaireMetadataMongoDBRepository; diff --git a/src/test/java/fr/insee/genesis/controller/rest/responses/EditedResponseControllerTest.java b/src/test/java/fr/insee/genesis/controller/rest/responses/ContextualVariableControllerTest.java similarity index 54% rename from src/test/java/fr/insee/genesis/controller/rest/responses/EditedResponseControllerTest.java rename to src/test/java/fr/insee/genesis/controller/rest/responses/ContextualVariableControllerTest.java index 24692587..bd89d9b9 100644 --- a/src/test/java/fr/insee/genesis/controller/rest/responses/EditedResponseControllerTest.java +++ b/src/test/java/fr/insee/genesis/controller/rest/responses/ContextualVariableControllerTest.java @@ -4,17 +4,17 @@ import fr.insee.genesis.TestConstants; import fr.insee.genesis.controller.dto.VariableQualityToolDto; import fr.insee.genesis.controller.dto.VariableStateDto; -import fr.insee.genesis.domain.model.editedresponse.EditedResponseModel; +import fr.insee.genesis.domain.model.contextualvariable.ContextualVariableModel; import fr.insee.genesis.domain.model.surveyunit.DataState; import fr.insee.genesis.domain.model.surveyunit.Mode; -import fr.insee.genesis.domain.service.editedresponse.EditedResponseJsonService; -import fr.insee.genesis.domain.service.editedresponse.editedexternal.EditedExternalResponseJsonService; -import fr.insee.genesis.domain.service.editedresponse.editedprevious.EditedPreviousResponseJsonService; -import fr.insee.genesis.infrastructure.document.editedexternal.EditedExternalResponseDocument; -import fr.insee.genesis.infrastructure.document.editedprevious.EditedPreviousResponseDocument; +import fr.insee.genesis.domain.service.contextualvariable.ContextualVariableJsonService; +import fr.insee.genesis.domain.service.contextualvariable.external.ContextualExternalVariableJsonService; +import fr.insee.genesis.domain.service.contextualvariable.previous.ContextualPreviousVariableJsonService; +import fr.insee.genesis.infrastructure.document.contextualexternal.ContextualExternalVariableDocument; +import fr.insee.genesis.infrastructure.document.contextualprevious.ContextualPreviousVariableDocument; import fr.insee.genesis.stubs.ConfigStub; -import fr.insee.genesis.stubs.EditedExternalResponsePersistancePortStub; -import fr.insee.genesis.stubs.EditedPreviousResponsePersistancePortStub; +import fr.insee.genesis.stubs.ContextualExternalVariablePersistancePortStub; +import fr.insee.genesis.stubs.ContextualPreviousVariablePersistancePortStub; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.assertj.core.api.Assertions; @@ -37,30 +37,30 @@ import java.util.Map; @Slf4j -class EditedResponseControllerTest { +class ContextualVariableControllerTest { - private static final String QUESTIONNAIRE_ID = "TEST-EDITED"; + private static final String QUESTIONNAIRE_ID = "TEST-CONTEXTUAL"; private static final String INTERROGATION_ID_1 = "TEST1"; private static final String INTERROGATION_ID_2 = "TEST2"; - private static final String QUESTIONNAIRE_ID_PREVIOUS = "TEST-EDITED-PREVIOUS"; - private static final String QUESTIONNAIRE_ID_EXTERNAL = "TEST-EDITED-EXTERNAL"; + private static final String QUESTIONNAIRE_ID_PREVIOUS = "TEST-CONTEXTUAL-PREVIOUS"; + private static final String QUESTIONNAIRE_ID_EXTERNAL = "TEST-CONTEXTUAL-EXTERNAL"; private static final Path SOURCE_PATH_PREVIOUS = Path.of(TestConstants.TEST_RESOURCES_DIRECTORY,"IN", Mode.WEB.getFolder()).resolve(QUESTIONNAIRE_ID_PREVIOUS); private static final Path SOURCE_PATH_EXTERNAL = Path.of(TestConstants.TEST_RESOURCES_DIRECTORY,"IN", Mode.WEB.getFolder()).resolve(QUESTIONNAIRE_ID_EXTERNAL); - private static final EditedPreviousResponsePersistancePortStub previousStub = - new EditedPreviousResponsePersistancePortStub(); - private static final EditedExternalResponsePersistancePortStub externalStub = - new EditedExternalResponsePersistancePortStub(); - - private final EditedResponseController editedResponseController = new EditedResponseController( - new EditedPreviousResponseJsonService(previousStub), - new EditedExternalResponseJsonService(externalStub), - new EditedResponseJsonService( - previousStub, - externalStub + private static final ContextualPreviousVariablePersistancePortStub previousStub = + new ContextualPreviousVariablePersistancePortStub(); + private static final ContextualExternalVariablePersistancePortStub externalStub = + new ContextualExternalVariablePersistancePortStub(); + + private final ContextualVariableController contextualVariableController = new ContextualVariableController( + new ContextualPreviousVariableJsonService(previousStub), + new ContextualExternalVariableJsonService(externalStub), + new ContextualVariableJsonService( + new ContextualPreviousVariableJsonService(previousStub), + new ContextualExternalVariableJsonService(externalStub) ), new ConfigStub() ); @@ -74,97 +74,251 @@ void clean() throws IOException { previousStub.getMongoStub().clear(); externalStub.getMongoStub().clear(); - previousStub.getMongoStub().put(Constants.MONGODB_EDITED_PREVIOUS_COLLECTION_NAME, new ArrayList<>()); - externalStub.getMongoStub().put(Constants.MONGODB_EDITED_EXTERNAL_COLLECTION_NAME, new ArrayList<>()); + previousStub.getMongoStub().put(Constants.MONGODB_CONTEXTUAL_PREVIOUS_COLLECTION_NAME, new ArrayList<>()); + externalStub.getMongoStub().put(Constants.MONGODB_CONTEXTUAL_EXTERNAL_COLLECTION_NAME, new ArrayList<>()); } //OK CASES //GET @Test - void getEditedResponses_test() { + void getContextualVariables_test() { //GIVEN - previousStub.getMongoStub().get(Constants.MONGODB_EDITED_PREVIOUS_COLLECTION_NAME).addAll( - getEditedPreviousTestDocuments() + previousStub.getMongoStub().get(Constants.MONGODB_CONTEXTUAL_PREVIOUS_COLLECTION_NAME).addAll( + getContextualPreviousTestDocuments() ); - externalStub.getMongoStub().get(Constants.MONGODB_EDITED_EXTERNAL_COLLECTION_NAME).addAll( - getEditedExternalTestDocuments() + externalStub.getMongoStub().get(Constants.MONGODB_CONTEXTUAL_EXTERNAL_COLLECTION_NAME).addAll( + getContextualExternalTestDocuments() ); //WHEN - ResponseEntity response = editedResponseController.getEditedResponses(QUESTIONNAIRE_ID, INTERROGATION_ID_1); + ResponseEntity response = contextualVariableController.getContextualVariables(QUESTIONNAIRE_ID, INTERROGATION_ID_1); //THEN if(!response.getStatusCode().is2xxSuccessful()){ log.error((String)response.getBody()); } Assertions.assertThat(response.getStatusCode().is2xxSuccessful()).isTrue(); - Assertions.assertThat(response.getBody()).isInstanceOf(EditedResponseModel.class); + Assertions.assertThat(response.getBody()).isInstanceOf(ContextualVariableModel.class); - EditedPreviousResponseDocument editedPreviousResponseDocument = previousStub.getMongoStub().get(Constants.MONGODB_EDITED_PREVIOUS_COLLECTION_NAME).stream().filter( - editedPreviousResponseDocument1 -> - editedPreviousResponseDocument1.getQuestionnaireId().equals(QUESTIONNAIRE_ID) - && editedPreviousResponseDocument1.getInterrogationId().equals(INTERROGATION_ID_1) + ContextualPreviousVariableDocument contextualPreviousVariableDocument = previousStub.getMongoStub().get(Constants.MONGODB_CONTEXTUAL_PREVIOUS_COLLECTION_NAME).stream().filter( + contextualPreviousVariableDocument1 -> + contextualPreviousVariableDocument1.getQuestionnaireId().equals(QUESTIONNAIRE_ID) + && contextualPreviousVariableDocument1.getInterrogationId().equals(INTERROGATION_ID_1) ).toList().getFirst(); - EditedExternalResponseDocument editedExternalResponseDocument = - externalStub.getMongoStub().get(Constants.MONGODB_EDITED_EXTERNAL_COLLECTION_NAME).stream().filter( - editedExternalResponseDocument1 -> - editedExternalResponseDocument1.getQuestionnaireId().equals(QUESTIONNAIRE_ID) - && editedExternalResponseDocument1.getInterrogationId().equals(INTERROGATION_ID_1) + ContextualExternalVariableDocument contextualExternalVariableDocument = + externalStub.getMongoStub().get(Constants.MONGODB_CONTEXTUAL_EXTERNAL_COLLECTION_NAME).stream().filter( + contextualExternalVariableDocument1 -> + contextualExternalVariableDocument1.getQuestionnaireId().equals(QUESTIONNAIRE_ID) + && contextualExternalVariableDocument1.getInterrogationId().equals(INTERROGATION_ID_1) ).toList().getFirst(); - EditedResponseModel editedResponseModel = (EditedResponseModel) response.getBody(); - Assertions.assertThat(editedResponseModel.interrogationId()).isEqualTo(INTERROGATION_ID_1); - assertDocumentEqualToDto(editedPreviousResponseDocument, editedResponseModel); - assertDocumentEqualToDto(editedExternalResponseDocument, editedResponseModel); + ContextualVariableModel contextualVariableModel = (ContextualVariableModel) response.getBody(); + Assertions.assertThat(contextualVariableModel.interrogationId()).isEqualTo(INTERROGATION_ID_1); + assertDocumentEqualToDto(contextualPreviousVariableDocument, contextualVariableModel); + assertDocumentEqualToDto(contextualExternalVariableDocument, contextualVariableModel); } @Test - void getEditedResponses_test_no_external() { + void getContextualVariables_test_no_external() { //GIVEN - previousStub.getMongoStub().get(Constants.MONGODB_EDITED_PREVIOUS_COLLECTION_NAME).addAll( - getEditedPreviousTestDocuments() + previousStub.getMongoStub().get(Constants.MONGODB_CONTEXTUAL_PREVIOUS_COLLECTION_NAME).addAll( + getContextualPreviousTestDocuments() ); - externalStub.getMongoStub().get(Constants.MONGODB_EDITED_EXTERNAL_COLLECTION_NAME).addAll( - getEditedExternalTestDocuments() + externalStub.getMongoStub().get(Constants.MONGODB_CONTEXTUAL_EXTERNAL_COLLECTION_NAME).addAll( + getContextualExternalTestDocuments() ); //WHEN - ResponseEntity response = editedResponseController.getEditedResponses(QUESTIONNAIRE_ID, INTERROGATION_ID_2); + ResponseEntity response = contextualVariableController.getContextualVariables(QUESTIONNAIRE_ID, INTERROGATION_ID_2); //THEN if(!response.getStatusCode().is2xxSuccessful()){ log.error((String)response.getBody()); } Assertions.assertThat(response.getStatusCode().is2xxSuccessful()).isTrue(); - Assertions.assertThat(response.getBody()).isInstanceOf(EditedResponseModel.class); + Assertions.assertThat(response.getBody()).isInstanceOf(ContextualVariableModel.class); - EditedPreviousResponseDocument editedPreviousResponseDocument = previousStub.getMongoStub().get(Constants.MONGODB_EDITED_PREVIOUS_COLLECTION_NAME).stream().filter( - editedPreviousResponseDocument1 -> - editedPreviousResponseDocument1.getQuestionnaireId().equals(QUESTIONNAIRE_ID) - && editedPreviousResponseDocument1.getInterrogationId().equals(INTERROGATION_ID_2) + ContextualPreviousVariableDocument contextualPreviousVariableDocument = previousStub.getMongoStub().get(Constants.MONGODB_CONTEXTUAL_PREVIOUS_COLLECTION_NAME).stream().filter( + contextualPreviousVariableDocument1 -> + contextualPreviousVariableDocument1.getQuestionnaireId().equals(QUESTIONNAIRE_ID) + && contextualPreviousVariableDocument1.getInterrogationId().equals(INTERROGATION_ID_2) ).toList().getFirst(); - EditedResponseModel editedResponseModel = (EditedResponseModel) response.getBody(); - Assertions.assertThat(editedResponseModel.interrogationId()).isEqualTo(INTERROGATION_ID_2); - assertDocumentEqualToDto(editedPreviousResponseDocument, editedResponseModel); - Assertions.assertThat(editedResponseModel.editedExternal()).isNotNull().isEmpty(); + ContextualVariableModel contextualVariableModel = (ContextualVariableModel) response.getBody(); + Assertions.assertThat(contextualVariableModel.interrogationId()).isEqualTo(INTERROGATION_ID_2); + assertDocumentEqualToDto(contextualPreviousVariableDocument, contextualVariableModel); + Assertions.assertThat(contextualVariableModel.contextualExternal()).isNotNull().isEmpty(); } @Test - void getEditedResponses_test_not_found(){ + void getContextualVariables_test_not_found(){ //GIVEN //Empty stubs from clean() //WHEN - ResponseEntity response = editedResponseController.getEditedResponses(QUESTIONNAIRE_ID, + ResponseEntity response = contextualVariableController.getContextualVariables(QUESTIONNAIRE_ID, INTERROGATION_ID_1); //THEN Assertions.assertThat(response.getStatusCode().is2xxSuccessful()).isTrue(); - Assertions.assertThat(response.getBody()).isInstanceOf(EditedResponseModel.class); - EditedResponseModel editedResponseModel = (EditedResponseModel) response.getBody(); - Assertions.assertThat(editedResponseModel.interrogationId()).isEqualTo(INTERROGATION_ID_1); - Assertions.assertThat(editedResponseModel.editedPrevious()).isNotNull().isEmpty(); - Assertions.assertThat(editedResponseModel.editedExternal()).isNotNull().isEmpty(); + Assertions.assertThat(response.getBody()).isInstanceOf(ContextualVariableModel.class); + ContextualVariableModel contextualVariableModel = (ContextualVariableModel) response.getBody(); + Assertions.assertThat(contextualVariableModel.interrogationId()).isEqualTo(INTERROGATION_ID_1); + Assertions.assertThat(contextualVariableModel.contextualPrevious()).isNotNull().isEmpty(); + Assertions.assertThat(contextualVariableModel.contextualExternal()).isNotNull().isEmpty(); + } + + //POST ALL FILES OF QUESTIONNAIRE + @Test + @SneakyThrows + void saveContextualVariables_previous_test() { + //GIVEN + Files.createDirectories(SOURCE_PATH_PREVIOUS); + Files.copy( + Path.of(TestConstants.TEST_RESOURCES_DIRECTORY).resolve("contextual_previous").resolve("ok.json"), + SOURCE_PATH_PREVIOUS.resolve("ok.json"), + StandardCopyOption.REPLACE_EXISTING + ); + + //WHEN + ResponseEntity response = contextualVariableController.saveContextualVariables(QUESTIONNAIRE_ID_PREVIOUS); + + //THEN + Assertions.assertThat(response.getStatusCode().is2xxSuccessful()).isTrue(); + Assertions.assertThat(previousStub.getMongoStub().get(Constants.MONGODB_CONTEXTUAL_PREVIOUS_COLLECTION_NAME)).hasSize(2); + + List filter = previousStub.getMongoStub().get(Constants.MONGODB_CONTEXTUAL_PREVIOUS_COLLECTION_NAME) + .stream().filter(doc -> doc.getInterrogationId().equals("AUTO104")).toList(); + Assertions.assertThat(filter).hasSize(1); + Assertions.assertThat(filter.getFirst().getSourceState()).isNull(); + Assertions.assertThat(filter.getFirst().getQuestionnaireId()).isEqualTo(QUESTIONNAIRE_ID_PREVIOUS); + + Assertions.assertThat(filter.getFirst().getVariables()).hasSize(15); + assertVariable(filter.getFirst(), "TEXTECOURT", ""); + assertVariable(filter.getFirst(), "TEXTELONG", "test d'une donnée antérieure sur un texte long pour voir comment ça marche"); + assertVariable(filter.getFirst(), "FLOAT", 50.25d); + assertVariableNull(filter.getFirst(), "INTEGER"); + assertVariable(filter.getFirst(), "BOOLEEN", true); + assertVariable(filter.getFirst(), "DROPDOWN", "03"); + assertVariable(filter.getFirst(), "QCM_B1", true); + assertVariable(filter.getFirst(), "QCM_B2", false); + assertVariable(filter.getFirst(), "QCM_B4", true); + assertVariable(filter.getFirst(), "TABLEAU2A11", 200); + assertVariable(filter.getFirst(), "TABLEAU2A12", 150); + assertVariable(filter.getFirst(), "TABLEAU2A23", 1000); + assertVariableNull(filter.getFirst(), "TABLEAU2A24"); + assertVariable(filter.getFirst(), "TABOFATS1",0, "AA"); + assertVariable(filter.getFirst(), "TABOFATS1",1, ""); + assertVariable(filter.getFirst(), "TABOFATS1",2, "BB"); + assertVariable(filter.getFirst(), "TABOFATS1",3, "CC"); + assertVariable(filter.getFirst(), "TABOFATS3",0, 5); + assertVariableNull(filter.getFirst(), "TABOFATS3",1); + assertVariable(filter.getFirst(), "TABOFATS3",2, 3); + + filter = previousStub.getMongoStub().get(Constants.MONGODB_CONTEXTUAL_PREVIOUS_COLLECTION_NAME) + .stream().filter(doc -> doc.getInterrogationId().equals("AUTO108")).toList(); + Assertions.assertThat(filter).hasSize(1); + Assertions.assertThat(filter.getFirst().getSourceState()).isNull(); + Assertions.assertThat(filter.getFirst().getQuestionnaireId()).isEqualTo(QUESTIONNAIRE_ID_PREVIOUS); + + Assertions.assertThat(filter.getFirst().getVariables()).hasSize(14); + assertVariable(filter.getFirst(), "TEXTECOURT", "test previous"); + assertVariable(filter.getFirst(), "TEXTELONG", ""); + assertVariable(filter.getFirst(), "FLOAT", 12.2d); + assertVariable(filter.getFirst(), "BOOLEEN", false); + assertVariable(filter.getFirst(), "DROPDOWN", ""); + assertVariable(filter.getFirst(), "QCM_B1", false); + assertVariable(filter.getFirst(), "QCM_B2", false); + assertVariable(filter.getFirst(), "QCM_B5", true); + assertVariable(filter.getFirst(), "TABLEAU2A11", 1); + assertVariable(filter.getFirst(), "TABLEAU2A12", 2); + assertVariable(filter.getFirst(), "TABLEAU2A23", 3); + assertVariable(filter.getFirst(), "TABLEAU2A24",4); + assertVariable(filter.getFirst(), "TABOFATS1",0, "BB"); + assertVariable(filter.getFirst(), "TABOFATS1",1, "BB"); + assertVariable(filter.getFirst(), "TABOFATS3",0, 10); + assertVariable(filter.getFirst(), "TABOFATS3",1, 4); + assertVariable(filter.getFirst(), "TABOFATS3",2, 0); + } + + @Test + @SneakyThrows + void saveContextualVariables_external_test() { + //GIVEN + Files.createDirectories(SOURCE_PATH_EXTERNAL); + Files.copy( + Path.of(TestConstants.TEST_RESOURCES_DIRECTORY).resolve("contextual_external").resolve("ok.json"), + SOURCE_PATH_EXTERNAL.resolve("ok.json"), + StandardCopyOption.REPLACE_EXISTING + ); + + //WHEN + ResponseEntity response = contextualVariableController.saveContextualVariables(QUESTIONNAIRE_ID_EXTERNAL); + + //THEN + Assertions.assertThat(response.getStatusCode().is2xxSuccessful()).isTrue(); + Assertions.assertThat(externalStub.getMongoStub().get(Constants.MONGODB_CONTEXTUAL_EXTERNAL_COLLECTION_NAME)).hasSize(2); + + List filter = externalStub.getMongoStub().get(Constants.MONGODB_CONTEXTUAL_EXTERNAL_COLLECTION_NAME) + .stream().filter(doc -> doc.getInterrogationId().equals("AUTO204")).toList(); + Assertions.assertThat(filter).hasSize(1); + + Assertions.assertThat(filter.getFirst().getQuestionnaireId()).isEqualTo(QUESTIONNAIRE_ID_EXTERNAL); + + Assertions.assertThat(filter.getFirst().getVariables()).hasSize(12); + assertVariable(filter.getFirst(), "TVA", 302.34d); + assertVariable(filter.getFirst(), "CA", 22.45d); + assertVariable(filter.getFirst(), "COM_AUTRE", "blablablabla"); + assertVariable(filter.getFirst(), "INTERRO_N_1", true); + assertVariable(filter.getFirst(), "INTERRO_N_2", false); + assertVariable(filter.getFirst(), "NAF25", "9560Y"); + assertVariable(filter.getFirst(), "POIDS", 1.25); + assertVariable(filter.getFirst(), "MILLESIME", "2024"); + assertVariable(filter.getFirst(), "NSUBST", true); + assertVariable(filter.getFirst(), "TAB_EXTNUM",0, 50); + assertVariable(filter.getFirst(), "TAB_EXTNUM",1, 23); + assertVariable(filter.getFirst(), "TAB_EXTNUM",2, 10); + assertVariableNull(filter.getFirst(), "TAB_EXTNUM",3); + assertVariable(filter.getFirst(), "TAB_EXTCAR",0, "A"); + assertVariable(filter.getFirst(), "TAB_EXTCAR",1, ""); + assertVariable(filter.getFirst(), "TAB_EXTCAR",2, "B"); + + filter = externalStub.getMongoStub().get(Constants.MONGODB_CONTEXTUAL_EXTERNAL_COLLECTION_NAME) + .stream().filter(doc -> doc.getInterrogationId().equals("AUTO208")).toList(); + Assertions.assertThat(filter).hasSize(1); + Assertions.assertThat(filter.getFirst().getQuestionnaireId()).isEqualTo(QUESTIONNAIRE_ID_EXTERNAL); + + Assertions.assertThat(filter.getFirst().getVariables()).hasSize(11); + assertVariable(filter.getFirst(), "TVA", ""); + assertVariable(filter.getFirst(), "COM_AUTRE", ""); + assertVariable(filter.getFirst(), "SECTEUR", "123456789"); + assertVariable(filter.getFirst(), "INTERRO_N_1", false); + assertVariable(filter.getFirst(), "INTERRO_N_2", false); + assertVariable(filter.getFirst(), "NAF25", "1014Z"); + assertVariable(filter.getFirst(), "POIDS", 12); + assertVariable(filter.getFirst(), "MILLESIME", "2024"); + assertVariable(filter.getFirst(), "NSUBST", false); + assertVariable(filter.getFirst(), "TAB_EXTNUM",0, 10); + assertVariable(filter.getFirst(), "TAB_EXTCAR",0, "C"); + assertVariable(filter.getFirst(), "TAB_EXTCAR",1, "C"); + } + + @Test + @SneakyThrows + void saveContextualVariables_random_json_test() { + //GIVEN + Files.createDirectories(SOURCE_PATH_EXTERNAL); + Files.copy( + Path.of(TestConstants.TEST_RESOURCES_DIRECTORY).resolve("contextual_external").resolve("random_json.json"), + SOURCE_PATH_EXTERNAL.resolve("random_json.json"), + StandardCopyOption.REPLACE_EXISTING + ); + + //WHEN + ResponseEntity response = contextualVariableController.saveContextualVariables(QUESTIONNAIRE_ID_EXTERNAL); + + //THEN + Assertions.assertThat(response.getStatusCode().is2xxSuccessful()).isTrue(); + Assertions.assertThat(externalStub.getMongoStub().get(Constants.MONGODB_CONTEXTUAL_EXTERNAL_COLLECTION_NAME)).isEmpty(); } //PREVIOUS @@ -185,18 +339,18 @@ private void testOKCase(String sourceState) throws IOException { //GIVEN Files.createDirectories(SOURCE_PATH_PREVIOUS); Files.copy( - Path.of(TestConstants.TEST_RESOURCES_DIRECTORY).resolve("edited_previous").resolve("ok.json"), + Path.of(TestConstants.TEST_RESOURCES_DIRECTORY).resolve("contextual_previous").resolve("ok.json"), SOURCE_PATH_PREVIOUS.resolve("ok.json"), StandardCopyOption.REPLACE_EXISTING ); //WHEN - editedResponseController.readEditedPreviousJson(QUESTIONNAIRE_ID_PREVIOUS, Mode.WEB, sourceState, "ok.json"); + contextualVariableController.readContextualPreviousJson(QUESTIONNAIRE_ID_PREVIOUS, Mode.WEB, sourceState, "ok.json"); //THEN - Assertions.assertThat(previousStub.getMongoStub().get(Constants.MONGODB_EDITED_PREVIOUS_COLLECTION_NAME)).hasSize(2); + Assertions.assertThat(previousStub.getMongoStub().get(Constants.MONGODB_CONTEXTUAL_PREVIOUS_COLLECTION_NAME)).hasSize(2); - List filter = previousStub.getMongoStub().get(Constants.MONGODB_EDITED_PREVIOUS_COLLECTION_NAME) + List filter = previousStub.getMongoStub().get(Constants.MONGODB_CONTEXTUAL_PREVIOUS_COLLECTION_NAME) .stream().filter(doc -> doc.getInterrogationId().equals("AUTO104")).toList(); Assertions.assertThat(filter).hasSize(1); if(sourceState == null){ @@ -228,7 +382,7 @@ private void testOKCase(String sourceState) throws IOException { assertVariableNull(filter.getFirst(), "TABOFATS3",1); assertVariable(filter.getFirst(), "TABOFATS3",2, 3); - filter = previousStub.getMongoStub().get(Constants.MONGODB_EDITED_PREVIOUS_COLLECTION_NAME) + filter = previousStub.getMongoStub().get(Constants.MONGODB_CONTEXTUAL_PREVIOUS_COLLECTION_NAME) .stream().filter(doc -> doc.getInterrogationId().equals("AUTO108")).toList(); Assertions.assertThat(filter).hasSize(1); if(sourceState == null){ @@ -264,26 +418,26 @@ void readPreviousJson_override_interrogation_id(){ //GIVEN Files.createDirectories(SOURCE_PATH_PREVIOUS); Files.copy( - Path.of(TestConstants.TEST_RESOURCES_DIRECTORY).resolve("edited_previous").resolve("ok.json"), + Path.of(TestConstants.TEST_RESOURCES_DIRECTORY).resolve("contextual_previous").resolve("ok.json"), SOURCE_PATH_PREVIOUS.resolve("ok.json"), StandardCopyOption.REPLACE_EXISTING ); - editedResponseController.readEditedPreviousJson(QUESTIONNAIRE_ID_PREVIOUS, Mode.WEB, null, "ok.json"); + contextualVariableController.readContextualPreviousJson(QUESTIONNAIRE_ID_PREVIOUS, Mode.WEB, null, "ok.json"); Files.createDirectories(SOURCE_PATH_PREVIOUS); Files.copy( - Path.of(TestConstants.TEST_RESOURCES_DIRECTORY).resolve("edited_previous").resolve("ok2.json"), + Path.of(TestConstants.TEST_RESOURCES_DIRECTORY).resolve("contextual_previous").resolve("ok2.json"), SOURCE_PATH_PREVIOUS.resolve("ok2.json"), StandardCopyOption.REPLACE_EXISTING ); //WHEN - editedResponseController.readEditedPreviousJson(QUESTIONNAIRE_ID_PREVIOUS, Mode.WEB, null, "ok2.json"); + contextualVariableController.readContextualPreviousJson(QUESTIONNAIRE_ID_PREVIOUS, Mode.WEB, null, "ok2.json"); //THEN - Assertions.assertThat(previousStub.getMongoStub().get(Constants.MONGODB_EDITED_PREVIOUS_COLLECTION_NAME)).hasSize(2); + Assertions.assertThat(previousStub.getMongoStub().get(Constants.MONGODB_CONTEXTUAL_PREVIOUS_COLLECTION_NAME)).hasSize(2); - List filter = - previousStub.getMongoStub().get(Constants.MONGODB_EDITED_PREVIOUS_COLLECTION_NAME) + List filter = + previousStub.getMongoStub().get(Constants.MONGODB_CONTEXTUAL_PREVIOUS_COLLECTION_NAME) .stream().filter(doc -> doc.getInterrogationId().equals("AUTO104")).toList(); Assertions.assertThat(filter).hasSize(1); Assertions.assertThat(filter.getFirst().getQuestionnaireId()).isEqualTo(QUESTIONNAIRE_ID_PREVIOUS); @@ -310,7 +464,7 @@ void readPreviousJson_override_interrogation_id(){ assertVariableNull(filter.getFirst(), "TABOFATS3",1); assertVariable(filter.getFirst(), "TABOFATS3",2, 3); - filter = previousStub.getMongoStub().get(Constants.MONGODB_EDITED_PREVIOUS_COLLECTION_NAME) + filter = previousStub.getMongoStub().get(Constants.MONGODB_CONTEXTUAL_PREVIOUS_COLLECTION_NAME) .stream().filter(doc -> doc.getInterrogationId().equals("AUTO200")).toList(); Assertions.assertThat(filter).hasSize(1); Assertions.assertThat(filter.getFirst().getQuestionnaireId()).isEqualTo(QUESTIONNAIRE_ID_PREVIOUS); @@ -334,7 +488,7 @@ void readPreviousJson_override_interrogation_id(){ assertVariable(filter.getFirst(), "TABOFATS3",1, 4); assertVariable(filter.getFirst(), "TABOFATS3",2, 0); - filter = previousStub.getMongoStub().get(Constants.MONGODB_EDITED_PREVIOUS_COLLECTION_NAME) + filter = previousStub.getMongoStub().get(Constants.MONGODB_CONTEXTUAL_PREVIOUS_COLLECTION_NAME) .stream().filter(doc -> doc.getInterrogationId().equals("AUTO108")).toList(); Assertions.assertThat(filter).isEmpty(); } @@ -347,13 +501,13 @@ void readPreviousJson_sourceState_too_long(String sourceState){ String fileName = "ok.json"; Files.createDirectories(SOURCE_PATH_PREVIOUS); Files.copy( - Path.of(TestConstants.TEST_RESOURCES_DIRECTORY).resolve("edited_previous").resolve(fileName), + Path.of(TestConstants.TEST_RESOURCES_DIRECTORY).resolve("contextual_previous").resolve(fileName), SOURCE_PATH_PREVIOUS.resolve(fileName), StandardCopyOption.REPLACE_EXISTING ); //WHEN + THEN - ResponseEntity response = editedResponseController.readEditedPreviousJson(QUESTIONNAIRE_ID_PREVIOUS, Mode.WEB, sourceState, + ResponseEntity response = contextualVariableController.readContextualPreviousJson(QUESTIONNAIRE_ID_PREVIOUS, Mode.WEB, sourceState, fileName); Assertions.assertThat(response.getStatusCode().value()).isEqualTo(400); } @@ -365,13 +519,13 @@ void readPreviousJson_invalid_syntax(){ //GIVEN Files.createDirectories(SOURCE_PATH_PREVIOUS); Files.copy( - Path.of(TestConstants.TEST_RESOURCES_DIRECTORY).resolve("edited_previous").resolve(syntaxErrorFileName), + Path.of(TestConstants.TEST_RESOURCES_DIRECTORY).resolve("contextual_previous").resolve(syntaxErrorFileName), SOURCE_PATH_PREVIOUS.resolve(syntaxErrorFileName), StandardCopyOption.REPLACE_EXISTING ); //WHEN + THEN - ResponseEntity response = editedResponseController.readEditedPreviousJson(QUESTIONNAIRE_ID_PREVIOUS, Mode.WEB, null, + ResponseEntity response = contextualVariableController.readContextualPreviousJson(QUESTIONNAIRE_ID_PREVIOUS, Mode.WEB, null, syntaxErrorFileName); Assertions.assertThat(response.getStatusCode().value()).isEqualTo(400); } @@ -382,13 +536,13 @@ void readPreviousJson_not_a_json(){ //GIVEN Files.createDirectories(SOURCE_PATH_PREVIOUS); Files.copy( - Path.of(TestConstants.TEST_RESOURCES_DIRECTORY).resolve("edited_previous").resolve(syntaxErrorFileName), + Path.of(TestConstants.TEST_RESOURCES_DIRECTORY).resolve("contextual_previous").resolve(syntaxErrorFileName), SOURCE_PATH_PREVIOUS.resolve(syntaxErrorFileName), StandardCopyOption.REPLACE_EXISTING ); //WHEN + THEN - ResponseEntity response = editedResponseController.readEditedPreviousJson(QUESTIONNAIRE_ID_PREVIOUS, Mode.WEB, null, + ResponseEntity response = contextualVariableController.readContextualPreviousJson(QUESTIONNAIRE_ID_PREVIOUS, Mode.WEB, null, syntaxErrorFileName); Assertions.assertThat(response.getStatusCode().value()).isEqualTo(400); } @@ -402,13 +556,13 @@ void readPreviousJson_no_interrogation_id(String fileName){ //GIVEN Files.createDirectories(SOURCE_PATH_PREVIOUS); Files.copy( - Path.of(TestConstants.TEST_RESOURCES_DIRECTORY).resolve("edited_previous").resolve(fileName), + Path.of(TestConstants.TEST_RESOURCES_DIRECTORY).resolve("contextual_previous").resolve(fileName), SOURCE_PATH_PREVIOUS.resolve(fileName), StandardCopyOption.REPLACE_EXISTING ); //WHEN + THEN - ResponseEntity response = editedResponseController.readEditedPreviousJson(QUESTIONNAIRE_ID_PREVIOUS, Mode.WEB, null, fileName); + ResponseEntity response = contextualVariableController.readContextualPreviousJson(QUESTIONNAIRE_ID_PREVIOUS, Mode.WEB, null, fileName); Assertions.assertThat(response.getStatusCode().value()).isEqualTo(400); } @@ -420,18 +574,18 @@ void readExternalJson_test(){ //GIVEN Files.createDirectories(SOURCE_PATH_EXTERNAL); Files.copy( - Path.of(TestConstants.TEST_RESOURCES_DIRECTORY).resolve("edited_external").resolve("ok.json"), + Path.of(TestConstants.TEST_RESOURCES_DIRECTORY).resolve("contextual_external").resolve("ok.json"), SOURCE_PATH_EXTERNAL.resolve("ok.json"), StandardCopyOption.REPLACE_EXISTING ); //WHEN - editedResponseController.readEditedExternalJson(QUESTIONNAIRE_ID_EXTERNAL, Mode.WEB, "ok.json"); + contextualVariableController.readContextualExternalJson(QUESTIONNAIRE_ID_EXTERNAL, Mode.WEB, "ok.json"); //THEN - Assertions.assertThat(externalStub.getMongoStub().get(Constants.MONGODB_EDITED_EXTERNAL_COLLECTION_NAME)).hasSize(2); + Assertions.assertThat(externalStub.getMongoStub().get(Constants.MONGODB_CONTEXTUAL_EXTERNAL_COLLECTION_NAME)).hasSize(2); - List filter = externalStub.getMongoStub().get(Constants.MONGODB_EDITED_EXTERNAL_COLLECTION_NAME) + List filter = externalStub.getMongoStub().get(Constants.MONGODB_CONTEXTUAL_EXTERNAL_COLLECTION_NAME) .stream().filter(doc -> doc.getInterrogationId().equals("AUTO204")).toList(); Assertions.assertThat(filter).hasSize(1); @@ -455,7 +609,7 @@ void readExternalJson_test(){ assertVariable(filter.getFirst(), "TAB_EXTCAR",1, ""); assertVariable(filter.getFirst(), "TAB_EXTCAR",2, "B"); - filter = externalStub.getMongoStub().get(Constants.MONGODB_EDITED_EXTERNAL_COLLECTION_NAME) + filter = externalStub.getMongoStub().get(Constants.MONGODB_CONTEXTUAL_EXTERNAL_COLLECTION_NAME) .stream().filter(doc -> doc.getInterrogationId().equals("AUTO208")).toList(); Assertions.assertThat(filter).hasSize(1); Assertions.assertThat(filter.getFirst().getQuestionnaireId()).isEqualTo(QUESTIONNAIRE_ID_EXTERNAL); @@ -481,26 +635,26 @@ void readExternalJson_override_interrogation_id(){ //GIVEN Files.createDirectories(SOURCE_PATH_EXTERNAL); Files.copy( - Path.of(TestConstants.TEST_RESOURCES_DIRECTORY).resolve("edited_external").resolve("ok.json"), + Path.of(TestConstants.TEST_RESOURCES_DIRECTORY).resolve("contextual_external").resolve("ok.json"), SOURCE_PATH_EXTERNAL.resolve("ok.json"), StandardCopyOption.REPLACE_EXISTING ); - editedResponseController.readEditedExternalJson(QUESTIONNAIRE_ID_EXTERNAL, Mode.WEB, "ok.json"); + contextualVariableController.readContextualExternalJson(QUESTIONNAIRE_ID_EXTERNAL, Mode.WEB, "ok.json"); Files.createDirectories(SOURCE_PATH_EXTERNAL); Files.copy( - Path.of(TestConstants.TEST_RESOURCES_DIRECTORY).resolve("edited_external").resolve("ok2.json"), + Path.of(TestConstants.TEST_RESOURCES_DIRECTORY).resolve("contextual_external").resolve("ok2.json"), SOURCE_PATH_EXTERNAL.resolve("ok2.json"), StandardCopyOption.REPLACE_EXISTING ); //WHEN - editedResponseController.readEditedExternalJson(QUESTIONNAIRE_ID_EXTERNAL, Mode.WEB, "ok2.json"); + contextualVariableController.readContextualExternalJson(QUESTIONNAIRE_ID_EXTERNAL, Mode.WEB, "ok2.json"); //THEN - Assertions.assertThat(externalStub.getMongoStub().get(Constants.MONGODB_EDITED_EXTERNAL_COLLECTION_NAME)).hasSize(2); + Assertions.assertThat(externalStub.getMongoStub().get(Constants.MONGODB_CONTEXTUAL_EXTERNAL_COLLECTION_NAME)).hasSize(2); - List filter = - externalStub.getMongoStub().get(Constants.MONGODB_EDITED_EXTERNAL_COLLECTION_NAME) + List filter = + externalStub.getMongoStub().get(Constants.MONGODB_CONTEXTUAL_EXTERNAL_COLLECTION_NAME) .stream().filter(doc -> doc.getInterrogationId().equals("AUTO204")).toList(); Assertions.assertThat(filter).hasSize(1); Assertions.assertThat(filter.getFirst().getQuestionnaireId()).isEqualTo(QUESTIONNAIRE_ID_EXTERNAL); @@ -523,7 +677,7 @@ void readExternalJson_override_interrogation_id(){ assertVariable(filter.getFirst(), "TAB_EXTCAR",1, ""); assertVariable(filter.getFirst(), "TAB_EXTCAR",2, "B"); - filter = externalStub.getMongoStub().get(Constants.MONGODB_EDITED_EXTERNAL_COLLECTION_NAME) + filter = externalStub.getMongoStub().get(Constants.MONGODB_CONTEXTUAL_EXTERNAL_COLLECTION_NAME) .stream().filter(doc -> doc.getInterrogationId().equals("AUTO200")).toList(); Assertions.assertThat(filter).hasSize(1); Assertions.assertThat(filter.getFirst().getQuestionnaireId()).isEqualTo(QUESTIONNAIRE_ID_EXTERNAL); @@ -555,54 +709,54 @@ void readExternalJson_error_400(String fileName){ //GIVEN Files.createDirectories(SOURCE_PATH_EXTERNAL); Files.copy( - Path.of(TestConstants.TEST_RESOURCES_DIRECTORY).resolve("edited_external").resolve(fileName), + Path.of(TestConstants.TEST_RESOURCES_DIRECTORY).resolve("contextual_external").resolve(fileName), SOURCE_PATH_EXTERNAL.resolve(fileName), StandardCopyOption.REPLACE_EXISTING ); //WHEN + THEN - ResponseEntity response = editedResponseController.readEditedExternalJson(QUESTIONNAIRE_ID_EXTERNAL, Mode.WEB, fileName); + ResponseEntity response = contextualVariableController.readContextualExternalJson(QUESTIONNAIRE_ID_EXTERNAL, Mode.WEB, fileName); Assertions.assertThat(response.getStatusCode().value()).isEqualTo(400); } //UTILS //THEN - private static void assertVariable(EditedPreviousResponseDocument document, + private static void assertVariable(ContextualPreviousVariableDocument document, String variableName, String expectedValue ) { Assertions.assertThat(document.getVariables().get(variableName)).isNotNull().isEqualTo(expectedValue); } - private static void assertVariable(EditedPreviousResponseDocument document, + private static void assertVariable(ContextualPreviousVariableDocument document, String variableName, double expectedValue ) { Assertions.assertThat(document.getVariables().get(variableName)).isNotNull().isInstanceOf(Double.class).isEqualTo(expectedValue); } - private static void assertVariable(EditedPreviousResponseDocument document, + private static void assertVariable(ContextualPreviousVariableDocument document, String variableName, boolean expectedValue ) { Assertions.assertThat(document.getVariables().get(variableName)).isNotNull().isInstanceOf(Boolean.class).isEqualTo(expectedValue); } - private static void assertVariable(EditedPreviousResponseDocument document, + private static void assertVariable(ContextualPreviousVariableDocument document, String variableName, int expectedValue ) { Assertions.assertThat(document.getVariables().get(variableName)).isNotNull().isInstanceOf(Integer.class).isEqualTo(expectedValue); } - private static void assertVariableNull(EditedPreviousResponseDocument document, + private static void assertVariableNull(ContextualPreviousVariableDocument document, String variableName ) { Assertions.assertThat(document.getVariables().get(variableName)).isNull(); } @SuppressWarnings("unchecked") - private static void assertVariableNull(EditedPreviousResponseDocument document, + private static void assertVariableNull(ContextualPreviousVariableDocument document, String arrayVariableName, int index ) { @@ -613,7 +767,7 @@ private static void assertVariableNull(EditedPreviousResponseDocument document, } @SuppressWarnings("unchecked") - private static void assertVariable(EditedPreviousResponseDocument document, + private static void assertVariable(ContextualPreviousVariableDocument document, String arrayVariableName, int index, String expectedValue @@ -627,7 +781,7 @@ private static void assertVariable(EditedPreviousResponseDocument document, } @SuppressWarnings("unchecked") - private static void assertVariable(EditedPreviousResponseDocument document, + private static void assertVariable(ContextualPreviousVariableDocument document, String arrayVariableName, int index, int expectedValue @@ -640,98 +794,98 @@ private static void assertVariable(EditedPreviousResponseDocument document, Assertions.assertThat((Integer)list.get(index)).isInstanceOf(Integer.class).isEqualTo(expectedValue); } - private List getEditedPreviousTestDocuments() { - List editedPreviousResponseDocumentList = new ArrayList<>(); - - EditedPreviousResponseDocument editedPreviousResponseDocument = new EditedPreviousResponseDocument(); - editedPreviousResponseDocument.setQuestionnaireId(QUESTIONNAIRE_ID); - editedPreviousResponseDocument.setInterrogationId(INTERROGATION_ID_1); - editedPreviousResponseDocument.setVariables(new HashMap<>()); - editedPreviousResponseDocument.getVariables().put("TEXTECOURT", ""); - editedPreviousResponseDocument.getVariables().put("TEXTELONG", "test d'une donnée antérieure sur un texte long pour voir comment ça marche"); - editedPreviousResponseDocument.getVariables().put("FLOAT", 50.25d); - editedPreviousResponseDocument.getVariables().put("INTEGER", null); - editedPreviousResponseDocument.getVariables().put("BOOLEEN", true); - editedPreviousResponseDocument.getVariables().put("DROPDOWN", "03"); - editedPreviousResponseDocument.getVariables().put("QCM_B1", true); - editedPreviousResponseDocument.getVariables().put("QCM_B2", false); - editedPreviousResponseDocument.getVariables().put("QCM_B4", true); - editedPreviousResponseDocument.getVariables().put("TABLEAU2A11", 200); - editedPreviousResponseDocument.getVariables().put("TABLEAU2A12", 150); - editedPreviousResponseDocument.getVariables().put("TABLEAU2A23", 1000); - editedPreviousResponseDocument.getVariables().put("TABLEAU2A24", null); - editedPreviousResponseDocument.getVariables().put("TABOFATS1", List.of("AA","","BB","CC")); - editedPreviousResponseDocument.getVariables().put("TABOFATS3", Arrays.asList(5,null,3)); - editedPreviousResponseDocumentList.add(editedPreviousResponseDocument); - - editedPreviousResponseDocument = new EditedPreviousResponseDocument(); - editedPreviousResponseDocument.setQuestionnaireId(QUESTIONNAIRE_ID); - editedPreviousResponseDocument.setInterrogationId(INTERROGATION_ID_2); - editedPreviousResponseDocument.setVariables(new HashMap<>()); - editedPreviousResponseDocument.getVariables().put("TEXTECOURT", "test previous"); - editedPreviousResponseDocument.getVariables().put("TEXTELONG", ""); - editedPreviousResponseDocument.getVariables().put("FLOAT", 12.2d); - editedPreviousResponseDocument.getVariables().put("BOOLEEN", false); - editedPreviousResponseDocument.getVariables().put("DROPDOWN", ""); - editedPreviousResponseDocument.getVariables().put("QCM_B1", false); - editedPreviousResponseDocument.getVariables().put("QCM_B2", false); - editedPreviousResponseDocument.getVariables().put("QCM_B5", true); - editedPreviousResponseDocument.getVariables().put("TABLEAU2A11", 1); - editedPreviousResponseDocument.getVariables().put("TABLEAU2A12", 2); - editedPreviousResponseDocument.getVariables().put("TABLEAU2A23", 3); - editedPreviousResponseDocument.getVariables().put("TABLEAU2A24", 4); - editedPreviousResponseDocument.getVariables().put("TABOFATS1", List.of("BB","BB")); - editedPreviousResponseDocument.getVariables().put("TABOFATS3", List.of(10,4,0)); - editedPreviousResponseDocumentList.add(editedPreviousResponseDocument); - - return editedPreviousResponseDocumentList; - } - - private List getEditedExternalTestDocuments() { - List editedExternalResponseDocumentList = new ArrayList<>(); - - EditedExternalResponseDocument editedExternalResponseDocument = new EditedExternalResponseDocument(); - editedExternalResponseDocument.setQuestionnaireId(QUESTIONNAIRE_ID); - editedExternalResponseDocument.setInterrogationId(INTERROGATION_ID_1); - editedExternalResponseDocument.setVariables(new HashMap<>()); - editedExternalResponseDocument.getVariables().put("TVA", 302.34d); - editedExternalResponseDocument.getVariables().put("CA", 22.45d); - editedExternalResponseDocument.getVariables().put("COM_AUTRE", "blablablabla"); - editedExternalResponseDocument.getVariables().put("SECTEUR", "110110110"); - editedExternalResponseDocument.getVariables().put("CATEGORIE", ""); - editedExternalResponseDocument.getVariables().put("INTERRO_N_1", true); - editedExternalResponseDocument.getVariables().put("INTERRO_N_2", false); - editedExternalResponseDocument.getVariables().put("NAF25", "9560Y"); - editedExternalResponseDocument.getVariables().put("POIDS", null); - editedExternalResponseDocument.getVariables().put("MILLESIME", "2024"); - editedExternalResponseDocument.getVariables().put("NSUBST", true); - editedExternalResponseDocument.getVariables().put("TAB_EXTNUM", Arrays.asList(50,23,10,null)); - editedExternalResponseDocument.getVariables().put("TAB_EXTCAR", Arrays.asList("A", "", "B")); - editedExternalResponseDocumentList.add(editedExternalResponseDocument); - return editedExternalResponseDocumentList; - } - - - private void assertDocumentEqualToDto(EditedPreviousResponseDocument editedPreviousResponseDocument, - EditedResponseModel editedResponseModel) { + private List getContextualPreviousTestDocuments() { + List contextualPreviousVariableDocumentList = new ArrayList<>(); + + ContextualPreviousVariableDocument contextualPreviousVariableDocument = new ContextualPreviousVariableDocument(); + contextualPreviousVariableDocument.setQuestionnaireId(QUESTIONNAIRE_ID); + contextualPreviousVariableDocument.setInterrogationId(INTERROGATION_ID_1); + contextualPreviousVariableDocument.setVariables(new HashMap<>()); + contextualPreviousVariableDocument.getVariables().put("TEXTECOURT", ""); + contextualPreviousVariableDocument.getVariables().put("TEXTELONG", "test d'une donnée antérieure sur un texte long pour voir comment ça marche"); + contextualPreviousVariableDocument.getVariables().put("FLOAT", 50.25d); + contextualPreviousVariableDocument.getVariables().put("INTEGER", null); + contextualPreviousVariableDocument.getVariables().put("BOOLEEN", true); + contextualPreviousVariableDocument.getVariables().put("DROPDOWN", "03"); + contextualPreviousVariableDocument.getVariables().put("QCM_B1", true); + contextualPreviousVariableDocument.getVariables().put("QCM_B2", false); + contextualPreviousVariableDocument.getVariables().put("QCM_B4", true); + contextualPreviousVariableDocument.getVariables().put("TABLEAU2A11", 200); + contextualPreviousVariableDocument.getVariables().put("TABLEAU2A12", 150); + contextualPreviousVariableDocument.getVariables().put("TABLEAU2A23", 1000); + contextualPreviousVariableDocument.getVariables().put("TABLEAU2A24", null); + contextualPreviousVariableDocument.getVariables().put("TABOFATS1", List.of("AA","","BB","CC")); + contextualPreviousVariableDocument.getVariables().put("TABOFATS3", Arrays.asList(5,null,3)); + contextualPreviousVariableDocumentList.add(contextualPreviousVariableDocument); + + contextualPreviousVariableDocument = new ContextualPreviousVariableDocument(); + contextualPreviousVariableDocument.setQuestionnaireId(QUESTIONNAIRE_ID); + contextualPreviousVariableDocument.setInterrogationId(INTERROGATION_ID_2); + contextualPreviousVariableDocument.setVariables(new HashMap<>()); + contextualPreviousVariableDocument.getVariables().put("TEXTECOURT", "test previous"); + contextualPreviousVariableDocument.getVariables().put("TEXTELONG", ""); + contextualPreviousVariableDocument.getVariables().put("FLOAT", 12.2d); + contextualPreviousVariableDocument.getVariables().put("BOOLEEN", false); + contextualPreviousVariableDocument.getVariables().put("DROPDOWN", ""); + contextualPreviousVariableDocument.getVariables().put("QCM_B1", false); + contextualPreviousVariableDocument.getVariables().put("QCM_B2", false); + contextualPreviousVariableDocument.getVariables().put("QCM_B5", true); + contextualPreviousVariableDocument.getVariables().put("TABLEAU2A11", 1); + contextualPreviousVariableDocument.getVariables().put("TABLEAU2A12", 2); + contextualPreviousVariableDocument.getVariables().put("TABLEAU2A23", 3); + contextualPreviousVariableDocument.getVariables().put("TABLEAU2A24", 4); + contextualPreviousVariableDocument.getVariables().put("TABOFATS1", List.of("BB","BB")); + contextualPreviousVariableDocument.getVariables().put("TABOFATS3", List.of(10,4,0)); + contextualPreviousVariableDocumentList.add(contextualPreviousVariableDocument); + + return contextualPreviousVariableDocumentList; + } + + private List getContextualExternalTestDocuments() { + List contextualExternalVariableDocumentList = new ArrayList<>(); + + ContextualExternalVariableDocument contextualExternalVariableDocument = new ContextualExternalVariableDocument(); + contextualExternalVariableDocument.setQuestionnaireId(QUESTIONNAIRE_ID); + contextualExternalVariableDocument.setInterrogationId(INTERROGATION_ID_1); + contextualExternalVariableDocument.setVariables(new HashMap<>()); + contextualExternalVariableDocument.getVariables().put("TVA", 302.34d); + contextualExternalVariableDocument.getVariables().put("CA", 22.45d); + contextualExternalVariableDocument.getVariables().put("COM_AUTRE", "blablablabla"); + contextualExternalVariableDocument.getVariables().put("SECTEUR", "110110110"); + contextualExternalVariableDocument.getVariables().put("CATEGORIE", ""); + contextualExternalVariableDocument.getVariables().put("INTERRO_N_1", true); + contextualExternalVariableDocument.getVariables().put("INTERRO_N_2", false); + contextualExternalVariableDocument.getVariables().put("NAF25", "9560Y"); + contextualExternalVariableDocument.getVariables().put("POIDS", null); + contextualExternalVariableDocument.getVariables().put("MILLESIME", "2024"); + contextualExternalVariableDocument.getVariables().put("NSUBST", true); + contextualExternalVariableDocument.getVariables().put("TAB_EXTNUM", Arrays.asList(50,23,10,null)); + contextualExternalVariableDocument.getVariables().put("TAB_EXTCAR", Arrays.asList("A", "", "B")); + contextualExternalVariableDocumentList.add(contextualExternalVariableDocument); + return contextualExternalVariableDocumentList; + } + + + private void assertDocumentEqualToDto(ContextualPreviousVariableDocument contextualPreviousVariableDocument, + ContextualVariableModel contextualVariableModel) { //For each variable of document - for (Map.Entry documentVariable : editedPreviousResponseDocument.getVariables().entrySet()) { - //Get edited previous dtos of that variable (1 per iteration) + for (Map.Entry documentVariable : contextualPreviousVariableDocument.getVariables().entrySet()) { + //Get contextual previous dtos of that variable (1 per iteration) List variableQualityToolDtosOfEntry = - editedResponseModel.editedPrevious().stream().filter( + contextualVariableModel.contextualPrevious().stream().filter( variableQualityToolDto -> variableQualityToolDto.getVariableName().equals(documentVariable.getKey()) ).toList(); assertEntryEqualToDto(documentVariable, variableQualityToolDtosOfEntry); } } - private void assertDocumentEqualToDto(EditedExternalResponseDocument editedExternalResponseDocument, - EditedResponseModel editedResponseModel) { + private void assertDocumentEqualToDto(ContextualExternalVariableDocument contextualExternalVariableDocument, + ContextualVariableModel contextualVariableModel) { //For each variable of document - for (Map.Entry documentVariable : editedExternalResponseDocument.getVariables().entrySet()) { - //Get edited previous dtos of that variable (1 per iteration) + for (Map.Entry documentVariable : contextualExternalVariableDocument.getVariables().entrySet()) { + //Get contextual previous dtos of that variable (1 per iteration) List variableQualityToolDtosOfEntry = - editedResponseModel.editedExternal().stream().filter( + contextualVariableModel.contextualExternal().stream().filter( variableQualityToolDto -> variableQualityToolDto.getVariableName().equals(documentVariable.getKey()) ).toList(); assertEntryEqualToDto(documentVariable, variableQualityToolDtosOfEntry); @@ -772,28 +926,28 @@ private void assertEntryEqualToDto(Map.Entry documentVariable, } } - private static void assertVariable(EditedExternalResponseDocument document, + private static void assertVariable(ContextualExternalVariableDocument document, String variableName, String expectedValue ) { Assertions.assertThat(document.getVariables().get(variableName)).isNotNull().isEqualTo(expectedValue); } - private static void assertVariable(EditedExternalResponseDocument document, + private static void assertVariable(ContextualExternalVariableDocument document, String variableName, double expectedValue ) { Assertions.assertThat(document.getVariables().get(variableName)).isNotNull().isInstanceOf(Double.class).isEqualTo(expectedValue); } - private static void assertVariable(EditedExternalResponseDocument document, + private static void assertVariable(ContextualExternalVariableDocument document, String variableName, boolean expectedValue ) { Assertions.assertThat(document.getVariables().get(variableName)).isNotNull().isInstanceOf(Boolean.class).isEqualTo(expectedValue); } - private static void assertVariable(EditedExternalResponseDocument document, + private static void assertVariable(ContextualExternalVariableDocument document, String variableName, int expectedValue ) { @@ -801,7 +955,7 @@ private static void assertVariable(EditedExternalResponseDocument document, } @SuppressWarnings("unchecked") - private static void assertVariableNull(EditedExternalResponseDocument document, + private static void assertVariableNull(ContextualExternalVariableDocument document, String arrayVariableName, int index ) { @@ -812,7 +966,7 @@ private static void assertVariableNull(EditedExternalResponseDocument document, } @SuppressWarnings("unchecked") - private static void assertVariable(EditedExternalResponseDocument document, + private static void assertVariable(ContextualExternalVariableDocument document, String arrayVariableName, int index, String expectedValue @@ -826,7 +980,7 @@ private static void assertVariable(EditedExternalResponseDocument document, } @SuppressWarnings("unchecked") - private static void assertVariable(EditedExternalResponseDocument document, + private static void assertVariable(ContextualExternalVariableDocument document, String arrayVariableName, int index, int expectedValue diff --git a/src/test/java/fr/insee/genesis/controller/rest/responses/QuestionnaireControllerTest.java b/src/test/java/fr/insee/genesis/controller/rest/responses/QuestionnaireControllerTest.java index 6dd32b2a..a93d8888 100644 --- a/src/test/java/fr/insee/genesis/controller/rest/responses/QuestionnaireControllerTest.java +++ b/src/test/java/fr/insee/genesis/controller/rest/responses/QuestionnaireControllerTest.java @@ -2,10 +2,13 @@ import fr.insee.genesis.controller.dto.QuestionnaireWithCampaign; import fr.insee.genesis.domain.ports.api.SurveyUnitApiPort; +import fr.insee.genesis.domain.service.context.DataProcessingContextService; import fr.insee.genesis.domain.service.metadata.QuestionnaireMetadataService; import fr.insee.genesis.domain.service.surveyunit.SurveyUnitService; +import fr.insee.genesis.infrastructure.document.context.DataProcessingContextDocument; import fr.insee.genesis.infrastructure.utils.FileUtils; import fr.insee.genesis.stubs.ConfigStub; +import fr.insee.genesis.stubs.DataProcessingContextPersistancePortStub; import fr.insee.genesis.stubs.QuestionnaireMetadataPersistancePortStub; import fr.insee.genesis.stubs.SurveyUnitPersistencePortStub; import org.assertj.core.api.Assertions; @@ -15,6 +18,7 @@ import org.springframework.http.ResponseEntity; import java.io.IOException; +import java.util.ArrayList; import java.util.List; import java.util.Set; @@ -24,23 +28,29 @@ class QuestionnaireControllerTest { //Given static QuestionnaireController questionnaireControllerStatic; static SurveyUnitPersistencePortStub surveyUnitPersistencePortStub; + static DataProcessingContextPersistancePortStub dataProcessingContextPersistancePortStub; @BeforeAll static void init() { surveyUnitPersistencePortStub = new SurveyUnitPersistencePortStub(); + dataProcessingContextPersistancePortStub = new DataProcessingContextPersistancePortStub(); SurveyUnitApiPort surveyUnitApiPort = new SurveyUnitService( surveyUnitPersistencePortStub, new QuestionnaireMetadataService(new QuestionnaireMetadataPersistancePortStub()), new FileUtils(new ConfigStub()) ); - questionnaireControllerStatic = new QuestionnaireController(surveyUnitApiPort); + questionnaireControllerStatic = new QuestionnaireController( + surveyUnitApiPort, + new DataProcessingContextService(dataProcessingContextPersistancePortStub, surveyUnitPersistencePortStub) + ); } @BeforeEach void reset() throws IOException { - Utils.reset(surveyUnitPersistencePortStub); + dataProcessingContextPersistancePortStub.getMongoStub().clear(); + Utils.reset(surveyUnitPersistencePortStub); } @@ -57,6 +67,79 @@ void getQuestionnairesTest() { DEFAULT_QUESTIONNAIRE_ID,"TESTQUESTIONNAIRE2"); } + @Test + void getQuestionnairesWithReviewTest() { + + String questionnaireId = "TESTQUESTIONNAIRE2"; + Utils.addAdditionalSurveyUnitModelToMongoStub(questionnaireId, surveyUnitPersistencePortStub); + + ResponseEntity> response = questionnaireControllerStatic.getQuestionnairesWithReview(true); + Assertions.assertThat(response.getStatusCode().is2xxSuccessful()).isTrue(); + Assertions.assertThat(response.getBody()).isNotNull().isEmpty(); + + dataProcessingContextPersistancePortStub.getMongoStub().add( + new DataProcessingContextDocument( + DEFAULT_QUESTIONNAIRE_ID, + new ArrayList<>(), + true + ) + ); + + response = questionnaireControllerStatic.getQuestionnairesWithReview(true); + Assertions.assertThat(response.getStatusCode().is2xxSuccessful()).isTrue(); + Assertions.assertThat(response.getBody()).isNotNull().isNotEmpty().containsOnly( + DEFAULT_QUESTIONNAIRE_ID); + + dataProcessingContextPersistancePortStub.getMongoStub().add( + new DataProcessingContextDocument( + questionnaireId, + new ArrayList<>(), + false + ) + ); + + response = questionnaireControllerStatic.getQuestionnairesWithReview(true); + Assertions.assertThat(response.getStatusCode().is2xxSuccessful()).isTrue(); + Assertions.assertThat(response.getBody()).isNotNull().isNotEmpty().containsOnly( + DEFAULT_QUESTIONNAIRE_ID); + } + + @Test + void getQuestionnairesWithoutReviewTest() { + + String questionnaireId = "TESTQUESTIONNAIRE2"; + Utils.addAdditionalSurveyUnitModelToMongoStub(questionnaireId, surveyUnitPersistencePortStub); + + ResponseEntity> response = questionnaireControllerStatic.getQuestionnairesWithReview(false); + Assertions.assertThat(response.getStatusCode().is2xxSuccessful()).isTrue(); + Assertions.assertThat(response.getBody()).isNotNull().isEmpty(); + + dataProcessingContextPersistancePortStub.getMongoStub().add( + new DataProcessingContextDocument( + DEFAULT_QUESTIONNAIRE_ID, + new ArrayList<>(), + false + ) + ); + + response = questionnaireControllerStatic.getQuestionnairesWithReview(false); + Assertions.assertThat(response.getStatusCode().is2xxSuccessful()).isTrue(); + Assertions.assertThat(response.getBody()).isNotNull().isNotEmpty().containsOnly( + DEFAULT_QUESTIONNAIRE_ID); + + dataProcessingContextPersistancePortStub.getMongoStub().add( + new DataProcessingContextDocument( + questionnaireId, + new ArrayList<>(), + true + ) + ); + response = questionnaireControllerStatic.getQuestionnairesWithReview(false); + Assertions.assertThat(response.getStatusCode().is2xxSuccessful()).isTrue(); + Assertions.assertThat(response.getBody()).isNotNull().isNotEmpty().containsOnly( + DEFAULT_QUESTIONNAIRE_ID); + } + @Test void getQuestionnairesByCampaignTest() { Utils.addAdditionalSurveyUnitModelToMongoStub("TESTQUESTIONNAIRE2", surveyUnitPersistencePortStub); diff --git a/src/test/java/fr/insee/genesis/stubs/ContextualExternalVariablePersistancePortStub.java b/src/test/java/fr/insee/genesis/stubs/ContextualExternalVariablePersistancePortStub.java new file mode 100644 index 00000000..6f5cdd2a --- /dev/null +++ b/src/test/java/fr/insee/genesis/stubs/ContextualExternalVariablePersistancePortStub.java @@ -0,0 +1,68 @@ +package fr.insee.genesis.stubs; + +import fr.insee.genesis.Constants; +import fr.insee.genesis.domain.model.contextualvariable.ContextualExternalVariableModel; +import fr.insee.genesis.domain.ports.spi.ContextualExternalVariablePersistancePort; +import fr.insee.genesis.infrastructure.document.contextualexternal.ContextualExternalVariableDocument; +import fr.insee.genesis.infrastructure.mappers.ContextualExternalVariableDocumentMapper; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Getter +public class ContextualExternalVariablePersistancePortStub implements ContextualExternalVariablePersistancePort { + + private final Map> mongoStub; // + + public ContextualExternalVariablePersistancePortStub() { + mongoStub = new HashMap<>(); + mongoStub.put(Constants.MONGODB_CONTEXTUAL_EXTERNAL_COLLECTION_NAME, new ArrayList<>()); + } + + @Override + public void backup(String questionnaireId) { + if(mongoStub.containsKey(questionnaireId)) { + mongoStub.put(questionnaireId + "_backup", new ArrayList<>(mongoStub.get(questionnaireId))); + } + } + + @Override + public void deleteBackup(String questionnaireId) { + mongoStub.remove(questionnaireId + "_backup"); + } + + @Override + public void restoreBackup(String questionnaireId) { + if(mongoStub.containsKey(questionnaireId + "_backup")) { + delete(questionnaireId); + mongoStub.put(questionnaireId, new ArrayList<>(mongoStub.get(questionnaireId + "_backup"))); + } + } + + @Override + public void saveAll(List contextualExternalVariableModelList) { + mongoStub.put( + Constants.MONGODB_CONTEXTUAL_EXTERNAL_COLLECTION_NAME, + ContextualExternalVariableDocumentMapper.INSTANCE.listModelToListDocument(contextualExternalVariableModelList)); + } + + @Override + public void delete(String questionnaireId) { + mongoStub.get(Constants.MONGODB_CONTEXTUAL_EXTERNAL_COLLECTION_NAME).removeIf( + contextualExternalVariableDocument -> contextualExternalVariableDocument.getQuestionnaireId().equals(questionnaireId) + ); + } + + @Override + public ContextualExternalVariableModel findByQuestionnaireIdAndInterrogationId(String questionnaireId, String interrogationId) { + List contextualExternalVariableDocumentList = mongoStub.get(Constants.MONGODB_CONTEXTUAL_EXTERNAL_COLLECTION_NAME).stream().filter( + contextualExternalVariableDocument -> + contextualExternalVariableDocument.getQuestionnaireId().equals(questionnaireId) + && contextualExternalVariableDocument.getInterrogationId().equals(interrogationId) + ).toList(); + return contextualExternalVariableDocumentList.isEmpty() ? null : ContextualExternalVariableDocumentMapper.INSTANCE.documentToModel(contextualExternalVariableDocumentList.getFirst()); + } +} diff --git a/src/test/java/fr/insee/genesis/stubs/ContextualPreviousVariablePersistancePortStub.java b/src/test/java/fr/insee/genesis/stubs/ContextualPreviousVariablePersistancePortStub.java new file mode 100644 index 00000000..255c6a9b --- /dev/null +++ b/src/test/java/fr/insee/genesis/stubs/ContextualPreviousVariablePersistancePortStub.java @@ -0,0 +1,70 @@ +package fr.insee.genesis.stubs; + +import fr.insee.genesis.Constants; +import fr.insee.genesis.domain.model.contextualvariable.ContextualPreviousVariableModel; +import fr.insee.genesis.domain.ports.spi.ContextualPreviousVariablePersistancePort; +import fr.insee.genesis.infrastructure.document.contextualprevious.ContextualPreviousVariableDocument; +import fr.insee.genesis.infrastructure.mappers.ContextualPreviousVariableDocumentMapper; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Getter +public class ContextualPreviousVariablePersistancePortStub implements ContextualPreviousVariablePersistancePort { + + private final Map> mongoStub; // + + public ContextualPreviousVariablePersistancePortStub() { + mongoStub = new HashMap<>(); + mongoStub.put(Constants.MONGODB_CONTEXTUAL_PREVIOUS_COLLECTION_NAME, new ArrayList<>()); + } + + @Override + public void backup(String questionnaireId) { + if(mongoStub.containsKey(questionnaireId)) { + mongoStub.put(questionnaireId + "_backup", new ArrayList<>(mongoStub.get(questionnaireId))); + } + } + + @Override + public void deleteBackup(String questionnaireId) { + mongoStub.remove(questionnaireId + "_backup"); + } + + @Override + public void restoreBackup(String questionnaireId) { + if(mongoStub.containsKey(questionnaireId + "_backup")) { + delete(questionnaireId); + mongoStub.put(questionnaireId, new ArrayList<>(mongoStub.get(questionnaireId + "_backup"))); + } + } + + @Override + public void saveAll(List contextualPreviousVariableModelList) { + mongoStub.put( + Constants.MONGODB_CONTEXTUAL_PREVIOUS_COLLECTION_NAME, + ContextualPreviousVariableDocumentMapper.INSTANCE.listModelToListDocument(contextualPreviousVariableModelList)); + } + + @Override + public void delete(String questionnaireId) { + mongoStub.get(Constants.MONGODB_CONTEXTUAL_PREVIOUS_COLLECTION_NAME).removeIf( + contextualPreviousVariableDocument -> contextualPreviousVariableDocument.getQuestionnaireId().equals(questionnaireId) + ); + } + + @Override + public ContextualPreviousVariableModel findByQuestionnaireIdAndInterrogationId(String questionnaireId, String interrogationId) { + List contextualPreviousVariableDocumentList = + mongoStub.get(Constants.MONGODB_CONTEXTUAL_PREVIOUS_COLLECTION_NAME).stream().filter( + contextualPreviousVariableDocument -> + contextualPreviousVariableDocument.getQuestionnaireId().equals(questionnaireId) + && contextualPreviousVariableDocument.getInterrogationId().equals(interrogationId) + ).toList(); + + return contextualPreviousVariableDocumentList.isEmpty() ? null : ContextualPreviousVariableDocumentMapper.INSTANCE.documentToModel(contextualPreviousVariableDocumentList.getFirst()); + } +} diff --git a/src/test/java/fr/insee/genesis/stubs/DataProcessingContextPersistancePortStub.java b/src/test/java/fr/insee/genesis/stubs/DataProcessingContextPersistancePortStub.java index c7b1d803..77a93995 100644 --- a/src/test/java/fr/insee/genesis/stubs/DataProcessingContextPersistancePortStub.java +++ b/src/test/java/fr/insee/genesis/stubs/DataProcessingContextPersistancePortStub.java @@ -82,4 +82,9 @@ public List removeExpiredSchedules(DataProcessingCon mongoStub.add(DataProcessingContextMapper.INSTANCE.modelToDocument(dataProcessingContextModel)); return kraftwerkExecutionSchedulesToRemove; } + + @Override + public List findAllByReview(boolean withReview) { + return mongoStub.stream().filter(doc -> doc.isWithReview() == withReview).toList(); + } } diff --git a/src/test/java/fr/insee/genesis/stubs/EditedExternalResponsePersistancePortStub.java b/src/test/java/fr/insee/genesis/stubs/EditedExternalResponsePersistancePortStub.java deleted file mode 100644 index 9ba29916..00000000 --- a/src/test/java/fr/insee/genesis/stubs/EditedExternalResponsePersistancePortStub.java +++ /dev/null @@ -1,68 +0,0 @@ -package fr.insee.genesis.stubs; - -import fr.insee.genesis.Constants; -import fr.insee.genesis.domain.model.editedresponse.EditedExternalResponseModel; -import fr.insee.genesis.domain.ports.spi.EditedExternalResponsePersistancePort; -import fr.insee.genesis.infrastructure.document.editedexternal.EditedExternalResponseDocument; -import fr.insee.genesis.infrastructure.mappers.EditedExternalResponseDocumentMapper; -import lombok.Getter; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Getter -public class EditedExternalResponsePersistancePortStub implements EditedExternalResponsePersistancePort { - - private final Map> mongoStub; // - - public EditedExternalResponsePersistancePortStub() { - mongoStub = new HashMap<>(); - mongoStub.put(Constants.MONGODB_EDITED_EXTERNAL_COLLECTION_NAME, new ArrayList<>()); - } - - @Override - public void backup(String questionnaireId) { - if(mongoStub.containsKey(questionnaireId)) { - mongoStub.put(questionnaireId + "_backup", new ArrayList<>(mongoStub.get(questionnaireId))); - } - } - - @Override - public void deleteBackup(String questionnaireId) { - mongoStub.remove(questionnaireId + "_backup"); - } - - @Override - public void restoreBackup(String questionnaireId) { - if(mongoStub.containsKey(questionnaireId + "_backup")) { - delete(questionnaireId); - mongoStub.put(questionnaireId, new ArrayList<>(mongoStub.get(questionnaireId + "_backup"))); - } - } - - @Override - public void saveAll(List editedExternalResponseModelList) { - mongoStub.put( - Constants.MONGODB_EDITED_EXTERNAL_COLLECTION_NAME, - EditedExternalResponseDocumentMapper.INSTANCE.listModelToListDocument(editedExternalResponseModelList)); - } - - @Override - public void delete(String questionnaireId) { - mongoStub.get(Constants.MONGODB_EDITED_EXTERNAL_COLLECTION_NAME).removeIf( - editedExternalResponseDocument -> editedExternalResponseDocument.getQuestionnaireId().equals(questionnaireId) - ); - } - - @Override - public EditedExternalResponseModel findByQuestionnaireIdAndInterrogationId(String questionnaireId, String interrogationId) { - List editedExternalResponseDocumentList = mongoStub.get(Constants.MONGODB_EDITED_EXTERNAL_COLLECTION_NAME).stream().filter( - editedExternalResponseDocument -> - editedExternalResponseDocument.getQuestionnaireId().equals(questionnaireId) - && editedExternalResponseDocument.getInterrogationId().equals(interrogationId) - ).toList(); - return editedExternalResponseDocumentList.isEmpty() ? null : EditedExternalResponseDocumentMapper.INSTANCE.documentToModel(editedExternalResponseDocumentList.getFirst()); - } -} diff --git a/src/test/java/fr/insee/genesis/stubs/EditedPreviousResponsePersistancePortStub.java b/src/test/java/fr/insee/genesis/stubs/EditedPreviousResponsePersistancePortStub.java deleted file mode 100644 index 92fb01f5..00000000 --- a/src/test/java/fr/insee/genesis/stubs/EditedPreviousResponsePersistancePortStub.java +++ /dev/null @@ -1,70 +0,0 @@ -package fr.insee.genesis.stubs; - -import fr.insee.genesis.Constants; -import fr.insee.genesis.domain.model.editedresponse.EditedPreviousResponseModel; -import fr.insee.genesis.domain.ports.spi.EditedPreviousResponsePersistancePort; -import fr.insee.genesis.infrastructure.document.editedprevious.EditedPreviousResponseDocument; -import fr.insee.genesis.infrastructure.mappers.EditedPreviousResponseDocumentMapper; -import lombok.Getter; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Getter -public class EditedPreviousResponsePersistancePortStub implements EditedPreviousResponsePersistancePort { - - private final Map> mongoStub; // - - public EditedPreviousResponsePersistancePortStub() { - mongoStub = new HashMap<>(); - mongoStub.put(Constants.MONGODB_EDITED_PREVIOUS_COLLECTION_NAME, new ArrayList<>()); - } - - @Override - public void backup(String questionnaireId) { - if(mongoStub.containsKey(questionnaireId)) { - mongoStub.put(questionnaireId + "_backup", new ArrayList<>(mongoStub.get(questionnaireId))); - } - } - - @Override - public void deleteBackup(String questionnaireId) { - mongoStub.remove(questionnaireId + "_backup"); - } - - @Override - public void restoreBackup(String questionnaireId) { - if(mongoStub.containsKey(questionnaireId + "_backup")) { - delete(questionnaireId); - mongoStub.put(questionnaireId, new ArrayList<>(mongoStub.get(questionnaireId + "_backup"))); - } - } - - @Override - public void saveAll(List editedPreviousResponseModelList) { - mongoStub.put( - Constants.MONGODB_EDITED_PREVIOUS_COLLECTION_NAME, - EditedPreviousResponseDocumentMapper.INSTANCE.listModelToListDocument(editedPreviousResponseModelList)); - } - - @Override - public void delete(String questionnaireId) { - mongoStub.get(Constants.MONGODB_EDITED_PREVIOUS_COLLECTION_NAME).removeIf( - editedPreviousResponseDocument -> editedPreviousResponseDocument.getQuestionnaireId().equals(questionnaireId) - ); - } - - @Override - public EditedPreviousResponseModel findByQuestionnaireIdAndInterrogationId(String questionnaireId, String interrogationId) { - List editedPreviousResponseDocumentList = - mongoStub.get(Constants.MONGODB_EDITED_PREVIOUS_COLLECTION_NAME).stream().filter( - editedPreviousResponseDocument -> - editedPreviousResponseDocument.getQuestionnaireId().equals(questionnaireId) - && editedPreviousResponseDocument.getInterrogationId().equals(interrogationId) - ).toList(); - - return editedPreviousResponseDocumentList.isEmpty() ? null : EditedPreviousResponseDocumentMapper.INSTANCE.documentToModel(editedPreviousResponseDocumentList.getFirst()); - } -} diff --git a/src/test/resources/edited_external/double_interrogationId.json b/src/test/resources/contextual_external/double_interrogationId.json similarity index 100% rename from src/test/resources/edited_external/double_interrogationId.json rename to src/test/resources/contextual_external/double_interrogationId.json diff --git a/src/test/resources/edited_external/invalid_syntax.json b/src/test/resources/contextual_external/invalid_syntax.json similarity index 100% rename from src/test/resources/edited_external/invalid_syntax.json rename to src/test/resources/contextual_external/invalid_syntax.json diff --git a/src/test/resources/edited_external/no_interrogationId.json b/src/test/resources/contextual_external/no_interrogationId.json similarity index 100% rename from src/test/resources/edited_external/no_interrogationId.json rename to src/test/resources/contextual_external/no_interrogationId.json diff --git a/src/test/resources/edited_external/not_a_json.xml b/src/test/resources/contextual_external/not_a_json.xml similarity index 100% rename from src/test/resources/edited_external/not_a_json.xml rename to src/test/resources/contextual_external/not_a_json.xml diff --git a/src/test/resources/edited_external/ok.json b/src/test/resources/contextual_external/ok.json similarity index 100% rename from src/test/resources/edited_external/ok.json rename to src/test/resources/contextual_external/ok.json diff --git a/src/test/resources/edited_external/ok2.json b/src/test/resources/contextual_external/ok2.json similarity index 100% rename from src/test/resources/edited_external/ok2.json rename to src/test/resources/contextual_external/ok2.json diff --git a/src/test/resources/edited_external/only_one_interrogationId.json b/src/test/resources/contextual_external/only_one_interrogationId.json similarity index 100% rename from src/test/resources/edited_external/only_one_interrogationId.json rename to src/test/resources/contextual_external/only_one_interrogationId.json diff --git a/src/test/resources/contextual_external/random_json.json b/src/test/resources/contextual_external/random_json.json new file mode 100644 index 00000000..45ab5b7f --- /dev/null +++ b/src/test/resources/contextual_external/random_json.json @@ -0,0 +1,3 @@ +{ + "truc": "muche" +} \ No newline at end of file diff --git a/src/test/resources/edited_previous/double_interrogationId.json b/src/test/resources/contextual_previous/double_interrogationId.json similarity index 100% rename from src/test/resources/edited_previous/double_interrogationId.json rename to src/test/resources/contextual_previous/double_interrogationId.json diff --git a/src/test/resources/edited_previous/invalid_syntax.json b/src/test/resources/contextual_previous/invalid_syntax.json similarity index 100% rename from src/test/resources/edited_previous/invalid_syntax.json rename to src/test/resources/contextual_previous/invalid_syntax.json diff --git a/src/test/resources/edited_previous/no_interrogationId.json b/src/test/resources/contextual_previous/no_interrogationId.json similarity index 100% rename from src/test/resources/edited_previous/no_interrogationId.json rename to src/test/resources/contextual_previous/no_interrogationId.json diff --git a/src/test/resources/edited_previous/not_a_json.xml b/src/test/resources/contextual_previous/not_a_json.xml similarity index 100% rename from src/test/resources/edited_previous/not_a_json.xml rename to src/test/resources/contextual_previous/not_a_json.xml diff --git a/src/test/resources/edited_previous/ok.json b/src/test/resources/contextual_previous/ok.json similarity index 100% rename from src/test/resources/edited_previous/ok.json rename to src/test/resources/contextual_previous/ok.json diff --git a/src/test/resources/edited_previous/ok2.json b/src/test/resources/contextual_previous/ok2.json similarity index 100% rename from src/test/resources/edited_previous/ok2.json rename to src/test/resources/contextual_previous/ok2.json diff --git a/src/test/resources/edited_previous/only_one_interrogationId.json b/src/test/resources/contextual_previous/only_one_interrogationId.json similarity index 100% rename from src/test/resources/edited_previous/only_one_interrogationId.json rename to src/test/resources/contextual_previous/only_one_interrogationId.json