diff --git a/pom.xml b/pom.xml
index fd64d2163..d43661fc7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -22,7 +22,7 @@
3.20.0
- 1.2.1
+ 1.2.2
3.0.3
1.6.3
1.25.5
diff --git a/src/main/java/fr/insee/genesis/Constants.java b/src/main/java/fr/insee/genesis/Constants.java
index 5a23c2167..eb06a6197 100644
--- a/src/main/java/fr/insee/genesis/Constants.java
+++ b/src/main/java/fr/insee/genesis/Constants.java
@@ -2,6 +2,8 @@
import lombok.experimental.UtilityClass;
+import java.util.regex.Pattern;
+
@UtilityClass
public class Constants {
@@ -11,6 +13,8 @@ public class Constants {
public static final String METADATA_SEPARATOR = ".";
public static final String DATE_REGEX = "(^([0-9]{4})[\\-\\/]([0-9]|1[0-2]|0[1-9])[\\-\\/]([0-9]|[0-2][0-9]|3[0-1])$)|" +
"(^([0-9]|[0-2][0-9]|3[0-1])[\\-\\/]([0-9]|1[0-2]|0[1-9])[\\-\\/]([0-9]{4})$)";
+ public static final Pattern QUESTIONNAIRE_ID_PATTERN =
+ Pattern.compile("^[A-Za-z0-9_-]+$");
public static final String FILTER_RESULT_PREFIX = "FILTER_RESULT_";
public static final String MISSING_SUFFIX = "_MISSING";
public static final String MONGODB_LUNATIC_RAWDATA_COLLECTION_NAME = "lunaticjsondata";
@@ -21,6 +25,8 @@ public class Constants {
public static final String MONGODB_CONTEXT_COLLECTION_NAME = "dataProcessingContexts";
public static final String MONGODB_CONTEXTUAL_PREVIOUS_COLLECTION_NAME = "editedPrevious";
public static final String MONGODB_CONTEXTUAL_EXTERNAL_COLLECTION_NAME = "editedExternal";
+ public static final String TYPE_PREVIOUS = "PREVIOUS";
+ public static final String TYPE_EXTERNAL = "EXTERNAL";
public static final String LOOP_NAME_PREFIX = "BOUCLE";
public static final String MONGODB_RESPONSE_COLLECTION_NAME = "responses";
public static final String MONGODB_RAW_RESPONSES_COLLECTION_NAME = "rawResponses";
diff --git a/src/main/java/fr/insee/genesis/controller/dto/ContextualVariableFileReportDto.java b/src/main/java/fr/insee/genesis/controller/dto/ContextualVariableFileReportDto.java
new file mode 100644
index 000000000..b9c6f5ea2
--- /dev/null
+++ b/src/main/java/fr/insee/genesis/controller/dto/ContextualVariableFileReportDto.java
@@ -0,0 +1,6 @@
+package fr.insee.genesis.controller.dto;
+
+public record ContextualVariableFileReportDto(
+ String fileName,
+ String type
+) {}
diff --git a/src/main/java/fr/insee/genesis/controller/dto/SaveContextualVariablesReportDto.java b/src/main/java/fr/insee/genesis/controller/dto/SaveContextualVariablesReportDto.java
new file mode 100644
index 000000000..3246288c1
--- /dev/null
+++ b/src/main/java/fr/insee/genesis/controller/dto/SaveContextualVariablesReportDto.java
@@ -0,0 +1,9 @@
+package fr.insee.genesis.controller.dto;
+
+import java.util.List;
+
+public record SaveContextualVariablesReportDto(
+ String questionnaireId,
+ int processedFiles,
+ List files
+) {}
diff --git a/src/main/java/fr/insee/genesis/controller/rest/responses/ContextualVariableController.java b/src/main/java/fr/insee/genesis/controller/rest/responses/ContextualVariableController.java
index ff3a17101..b2a8b0757 100644
--- a/src/main/java/fr/insee/genesis/controller/rest/responses/ContextualVariableController.java
+++ b/src/main/java/fr/insee/genesis/controller/rest/responses/ContextualVariableController.java
@@ -2,6 +2,7 @@
import fr.insee.genesis.Constants;
import fr.insee.genesis.configuration.Config;
+import fr.insee.genesis.controller.dto.SaveContextualVariablesReportDto;
import fr.insee.genesis.domain.model.surveyunit.Mode;
import fr.insee.genesis.domain.ports.api.ContextualExternalVariableApiPort;
import fr.insee.genesis.domain.ports.api.ContextualPreviousVariableApiPort;
@@ -22,6 +23,9 @@
import java.io.IOException;
import java.nio.file.Path;
+import java.util.regex.Pattern;
+
+import static fr.insee.genesis.Constants.QUESTIONNAIRE_ID_PATTERN;
@RequestMapping(path = "/contextual-variables")
@Controller
@@ -34,6 +38,7 @@ public class ContextualVariableController {
private final ContextualVariableApiPort contextualVariableApiPort;
private final Config config;
+
@Operation(summary = "Get contextual variables (external and previous)")
@GetMapping(path = "/")
@PreAuthorize("hasAnyRole('USER_PLATINE','SCHEDULER')")
@@ -52,16 +57,35 @@ public ResponseEntity