Skip to content

Commit 4203f1b

Browse files
committed
Merge branch 'main' into devJsonExtraction
2 parents 1fcfe3d + 7c55f0d commit 4203f1b

File tree

74 files changed

+1296
-884
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

74 files changed

+1296
-884
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,4 +50,6 @@ src/test/resources/OUT/*
5050
/src/test/resources/IN/WEB/SAMPLETEST/
5151
/src/test/resources/IN/WEB/TEST-EDITED-PREVIOUS/
5252
/src/test/resources/IN/WEB/TEST-EDITED-EXTERNAL/
53+
/src/test/resources/IN/WEB/TEST-CONTEXTUAL-PREVIOUS/
54+
/src/test/resources/IN/WEB/TEST-CONTEXTUAL-EXTERNAL/
5355
/src/main/resources/application-mbg.properties

CHANGELOG.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,18 @@
11
# Changelog
2+
## 1.10.0 [2025-10-16]
3+
### Added
4+
- Survey unit id export
5+
### Fixed
6+
- Cache eviction not working when delete questionnaire metadata
7+
8+
## 1.9.0 [2025-10-09]
9+
### Added
10+
- Authorizations for scheduled Perret calls
11+
- Get questionnaires by review activated or not endpoint
12+
- Save all contextual previous/external variables files for one questionnaire endpoint
13+
### Changed
14+
- No more 400 if the previous/external file has no corresponding part (warn in log instead)
15+
- Changed edited to contextual
216

317
## 1.8.6 [2025-09-18]
418
### Added

pom.xml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<modelVersion>4.0.0</modelVersion>
55
<groupId>fr.insee.genesis</groupId>
66
<artifactId>genesis-api</artifactId>
7-
<version>1.8.7</version>
7+
<version>1.10.0</version>
88
<packaging>jar</packaging>
99
<name>genesis-api</name>
1010

@@ -18,11 +18,11 @@
1818
<java.version>21</java.version>
1919
<springdoc.version>2.8.13</springdoc.version>
2020
<mapstruct.version>1.6.3</mapstruct.version>
21-
<cucumber.version>7.29.0</cucumber.version>
21+
<cucumber.version>7.30.0</cucumber.version>
2222
<junit-jupiter.version>5.13.4</junit-jupiter.version>
2323

2424
<!-- Proprietes sonar -->
25-
<jacoco.version>0.8.13</jacoco.version>
25+
<jacoco.version>0.8.14</jacoco.version>
2626
<sonar.core.codeCoveragePlugin>jacoco</sonar.core.codeCoveragePlugin>
2727
<sonar.language>java</sonar.language>
2828
<sonar.sourceEncoding>UTF-8</sonar.sourceEncoding>
@@ -31,7 +31,7 @@
3131
</sonar.exclusions>
3232
<skipSurefireReport>true</skipSurefireReport>
3333
<!-- Pi Test-->
34-
<pitest.version>1.20.3</pitest.version>
34+
<pitest.version>1.21.0</pitest.version>
3535
<pitest.junit.version>1.2.3</pitest.junit.version>
3636
<jackson.version>2.19.0</jackson.version>
3737
<bpm.version>1.0.17</bpm.version>

src/main/java/fr/insee/genesis/Constants.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ public class Constants {
1919

2020
public static final String MONGODB_SCHEDULE_COLLECTION_NAME = "schedules";
2121
public static final String MONGODB_CONTEXT_COLLECTION_NAME = "dataProcessingContexts";
22-
public static final String MONGODB_EDITED_PREVIOUS_COLLECTION_NAME = "editedPrevious";
23-
public static final String MONGODB_EDITED_EXTERNAL_COLLECTION_NAME = "editedExternal";
22+
public static final String MONGODB_CONTEXTUAL_PREVIOUS_COLLECTION_NAME = "editedPrevious";
23+
public static final String MONGODB_CONTEXTUAL_EXTERNAL_COLLECTION_NAME = "editedExternal";
2424
public static final String LOOP_NAME_PREFIX = "BOUCLE";
2525
public static final String MONGODB_RESPONSE_COLLECTION_NAME = "responses";
2626
public static final String MONGODB_RESPONSE_RAW_COLLECTION_NAME = "lunaticjsondata";

src/main/java/fr/insee/genesis/controller/dto/SurveyUnitSimplified.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ public class SurveyUnitSimplified {
1414
private String questionnaireId;
1515
private String campaignId;
1616
private String interrogationId;
17+
private String surveyUnitId;
1718
private Mode mode;
1819
private List<VariableModel> variablesUpdate;
1920
private List<VariableModel> externalVariables;

src/main/java/fr/insee/genesis/controller/rest/responses/EditedResponseController.java renamed to src/main/java/fr/insee/genesis/controller/rest/responses/ContextualVariableController.java

Lines changed: 38 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
import fr.insee.genesis.configuration.Config;
44
import fr.insee.genesis.domain.model.surveyunit.Mode;
5-
import fr.insee.genesis.domain.ports.api.EditedExternalResponseApiPort;
6-
import fr.insee.genesis.domain.ports.api.EditedPreviousResponseApiPort;
7-
import fr.insee.genesis.domain.ports.api.EditedResponseApiPort;
5+
import fr.insee.genesis.domain.ports.api.ContextualExternalVariableApiPort;
6+
import fr.insee.genesis.domain.ports.api.ContextualPreviousVariableApiPort;
7+
import fr.insee.genesis.domain.ports.api.ContextualVariableApiPort;
88
import fr.insee.genesis.exceptions.GenesisException;
99
import fr.insee.genesis.infrastructure.utils.FileUtils;
1010
import io.swagger.v3.oas.annotations.Operation;
@@ -19,39 +19,51 @@
1919
import org.springframework.web.bind.annotation.RequestMapping;
2020
import org.springframework.web.bind.annotation.RequestParam;
2121

22-
import java.io.FileInputStream;
23-
import java.io.FileNotFoundException;
2422
import java.io.IOException;
25-
import java.io.InputStream;
2623
import java.nio.file.Path;
2724

28-
@RequestMapping(path = "/edited")
25+
@RequestMapping(path = "/contextual-variables")
2926
@Controller
3027
@Slf4j
3128
@AllArgsConstructor
32-
public class EditedResponseController {
29+
public class ContextualVariableController {
3330

34-
private final EditedPreviousResponseApiPort editedPreviousResponseApiPort;
35-
private final EditedExternalResponseApiPort editedExternalResponseApiPort;
36-
private final EditedResponseApiPort editedResponseApiPort;
31+
private final ContextualPreviousVariableApiPort contextualPreviousVariableApiPort;
32+
private final ContextualExternalVariableApiPort contextualExternalVariableApiPort;
33+
private final ContextualVariableApiPort contextualVariableApiPort;
3734
private final Config config;
3835

39-
@Operation(summary = "Get edited variables (edited and previous)")
36+
@Operation(summary = "Get contextual variables (external and previous)")
4037
@GetMapping(path = "/")
41-
@PreAuthorize("hasRole('USER_PLATINE')")
42-
public ResponseEntity<Object> getEditedResponses(
38+
@PreAuthorize("hasAnyRole('USER_PLATINE','SCHEDULER')")
39+
public ResponseEntity<Object> getContextualVariables(
4340
@RequestParam("questionnaireId") String questionnaireId,
4441
@RequestParam("interrogationId") String interrogationId
4542
){
4643
return ResponseEntity.ok().body(
47-
editedResponseApiPort.getEditedResponse(questionnaireId, interrogationId)
44+
contextualVariableApiPort.getContextualVariable(questionnaireId, interrogationId)
4845
);
4946
}
5047

51-
@Operation(summary = "Add edited previous json file")
48+
@Operation(summary = "Save all contextual variables json files (external and previous)")
49+
@PostMapping(path = "/json")
50+
@PreAuthorize("hasAnyRole('USER_PLATINE','SCHEDULER')")
51+
public ResponseEntity<Object> saveContextualVariables(
52+
@RequestParam("questionnaireId") String questionnaireId
53+
){
54+
try {
55+
FileUtils fileUtils = new FileUtils(config);
56+
int fileCount = contextualVariableApiPort.saveContextualVariableFiles(questionnaireId, fileUtils);
57+
return ResponseEntity.ok("%d file(s) processed for questionnaire %s !".formatted(fileCount, questionnaireId));
58+
}catch (GenesisException ge){
59+
return ResponseEntity.status(HttpStatusCode.valueOf(ge.getStatus())).body(ge.getMessage());
60+
}
61+
}
62+
63+
@Operation(summary = "Add contextual previous json file")
5264
@PostMapping(path = "previous/json")
5365
@PreAuthorize("hasAnyRole('USER_PLATINE','SCHEDULER','USER_BACK_OFFICE')")
54-
public ResponseEntity<Object> readEditedPreviousJson(
66+
public ResponseEntity<Object> readContextualPreviousJson(
5567
@RequestParam("questionnaireId") String questionnaireId,
5668
@RequestParam("mode") Mode mode,
5769
@RequestParam(value = "sourceState", required = false) String sourceState,
@@ -67,18 +79,18 @@ public ResponseEntity<Object> readEditedPreviousJson(
6779
if (!jsonFileName.toLowerCase().endsWith(".json")) {
6880
throw new GenesisException(400, "File must be a JSON file !");
6981
}
70-
readEditedPreviousFile(questionnaireId.toUpperCase(), sourceState, filePath);
71-
moveFiles(questionnaireId, mode, fileUtils, filePath);
72-
return ResponseEntity.ok("Edited previous variable file %s saved !".formatted(filePath));
82+
contextualPreviousVariableApiPort.readContextualPreviousFile(questionnaireId.toUpperCase(), sourceState, filePath);
83+
moveFile(questionnaireId, mode, fileUtils, filePath);
84+
return ResponseEntity.ok("Contextual previous variable file %s saved !".formatted(filePath));
7385
}catch (GenesisException ge){
7486
return ResponseEntity.status(HttpStatusCode.valueOf(ge.getStatus())).body(ge.getMessage());
7587
}
7688
}
7789

78-
@Operation(summary = "Add edited external json file")
90+
@Operation(summary = "Add contextual external json file")
7991
@PostMapping(path = "/external/json")
8092
@PreAuthorize("hasAnyRole('USER_PLATINE','SCHEDULER','USER_BACK_OFFICE')")
81-
public ResponseEntity<Object> readEditedExternalJson(
93+
public ResponseEntity<Object> readContextualExternalJson(
8294
@RequestParam("questionnaireId") String questionnaireId,
8395
@RequestParam("mode") Mode mode,
8496
@RequestParam(value = "jsonFileName") String jsonFileName
@@ -93,35 +105,15 @@ public ResponseEntity<Object> readEditedExternalJson(
93105
if (!jsonFileName.toLowerCase().endsWith(".json")) {
94106
throw new GenesisException(400, "File must be a JSON file !");
95107
}
96-
readEditedExternalFile(questionnaireId.toUpperCase(), filePath);
97-
moveFiles(questionnaireId, mode, fileUtils, filePath);
98-
return ResponseEntity.ok("Edited external variable file %s saved !".formatted(filePath));
108+
contextualExternalVariableApiPort.readContextualExternalFile(questionnaireId, filePath);
109+
moveFile(questionnaireId, mode, fileUtils, filePath);
110+
return ResponseEntity.ok("Contextual external variable file %s saved !".formatted(filePath));
99111
}catch (GenesisException ge){
100112
return ResponseEntity.status(HttpStatusCode.valueOf(ge.getStatus())).body(ge.getMessage());
101113
}
102114
}
103115

104-
private void readEditedPreviousFile(String questionnaireId, String sourceState, String filePath) throws GenesisException {
105-
try (InputStream inputStream = new FileInputStream(filePath)) {
106-
editedPreviousResponseApiPort.readEditedPreviousFile(inputStream, questionnaireId, sourceState);
107-
} catch (FileNotFoundException e) {
108-
throw new GenesisException(404, "File %s not found".formatted(filePath));
109-
} catch (IOException e) {
110-
throw new GenesisException(500, e.toString());
111-
}
112-
}
113-
114-
private void readEditedExternalFile(String questionnaireId, String filePath) throws GenesisException {
115-
try (InputStream inputStream = new FileInputStream(filePath)) {
116-
editedExternalResponseApiPort.readEditedExternalFile(inputStream, questionnaireId);
117-
} catch (FileNotFoundException e) {
118-
throw new GenesisException(404, "File %s not found".formatted(filePath));
119-
} catch (IOException e) {
120-
throw new GenesisException(500, e.toString());
121-
}
122-
}
123-
124-
private static void moveFiles(String questionnaireId, Mode mode, FileUtils fileUtils, String filePath) throws GenesisException {
116+
private static void moveFile(String questionnaireId, Mode mode, FileUtils fileUtils, String filePath) throws GenesisException {
125117
try {
126118
fileUtils.moveFiles(Path.of(filePath), fileUtils.getDoneFolder(questionnaireId, mode.getFolder()));
127119
} catch (IOException e) {

src/main/java/fr/insee/genesis/controller/rest/responses/QuestionnaireController.java

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@
22

33
import fr.insee.genesis.controller.dto.QuestionnaireWithCampaign;
44
import fr.insee.genesis.controller.rest.CommonApiResponse;
5+
import fr.insee.genesis.domain.ports.api.DataProcessingContextApiPort;
56
import fr.insee.genesis.domain.ports.api.SurveyUnitApiPort;
67
import fr.insee.genesis.exceptions.GenesisException;
78
import io.swagger.v3.oas.annotations.Operation;
89
import io.swagger.v3.oas.annotations.responses.ApiResponse;
910
import lombok.extern.slf4j.Slf4j;
1011
import org.springframework.http.ResponseEntity;
12+
import org.springframework.security.access.prepost.PreAuthorize;
1113
import org.springframework.stereotype.Controller;
1214
import org.springframework.web.bind.annotation.GetMapping;
1315
import org.springframework.web.bind.annotation.RequestMapping;
@@ -22,21 +24,36 @@
2224
public class QuestionnaireController implements CommonApiResponse {
2325

2426
private final SurveyUnitApiPort surveyUnitService;
27+
private final DataProcessingContextApiPort dataProcessingContextService;
2528

2629

27-
public QuestionnaireController(SurveyUnitApiPort surveyUnitService) {
30+
public QuestionnaireController(
31+
SurveyUnitApiPort surveyUnitService,
32+
DataProcessingContextApiPort dataProcessingContextService
33+
) {
2834
this.surveyUnitService = surveyUnitService;
35+
this.dataProcessingContextService = dataProcessingContextService;
2936
}
3037

3138

3239

33-
@Operation(summary = "List questionnaires in database")
40+
@Operation(summary = "List questionnaires from responses database")
3441
@GetMapping(path = "/")
3542
public ResponseEntity<Set<String>> getQuestionnaires() {
3643
Set<String> questionnaires = surveyUnitService.findDistinctQuestionnaireIds();
3744
return ResponseEntity.ok(questionnaires);
3845
}
3946

47+
@Operation(summary = "List questionnaires in database that have a context with a specific withReview")
48+
@GetMapping(path = "/with-review")
49+
@PreAuthorize("hasAnyRole('USER_PLATINE','SCHEDULER')")
50+
public ResponseEntity<List<String>> getQuestionnairesWithReview(
51+
@RequestParam(value = "withReview") boolean withReview
52+
) {
53+
List<String> questionnaires = dataProcessingContextService.getPartitionIds(withReview);
54+
return ResponseEntity.ok(questionnaires);
55+
}
56+
4057

4158
@Operation(summary = "List questionnaires in database with their campaigns")
4259
@GetMapping(path = "/with-campaigns")

src/main/java/fr/insee/genesis/controller/rest/responses/ResponseController.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ public ResponseEntity<List<SurveyUnitModel>> findResponsesByInterrogationAndQues
208208
@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")
209209
@GetMapping(path = "/by-ue-and-questionnaire/latest-states",
210210
produces = MediaType.APPLICATION_JSON_VALUE)
211-
@PreAuthorize("hasRole('USER_PLATINE')")
211+
@PreAuthorize("hasAnyRole('USER_PLATINE','SCHEDULER')")
212212
public ResponseEntity<Object> findResponsesByInterrogationAndQuestionnaireLatestStates(
213213
@RequestParam("interrogationId") String interrogationId,
214214
@RequestParam("questionnaireId") String questionnaireId) throws GenesisException {
@@ -251,6 +251,7 @@ public ResponseEntity<SurveyUnitSimplified> getLatestByInterrogationOneObject(@R
251251
.questionnaireId(responses.getFirst().getQuestionnaireId())
252252
.campaignId(responses.getFirst().getCampaignId())
253253
.interrogationId(responses.getFirst().getInterrogationId())
254+
.surveyUnitId(responses.getFirst().getIdUE())
254255
.variablesUpdate(outputVariables)
255256
.externalVariables(outputExternalVariables)
256257
.build());
@@ -280,6 +281,7 @@ public ResponseEntity<List<SurveyUnitSimplified>> getLatestForInterrogationList(
280281
.questionnaireId(responses.getFirst().getQuestionnaireId())
281282
.campaignId(responses.getFirst().getCampaignId())
282283
.interrogationId(responses.getFirst().getInterrogationId())
284+
.surveyUnitId(responses.getFirst().getIdUE())
283285
.mode(mode)
284286
.variablesUpdate(outputVariables)
285287
.externalVariables(outputExternalVariables)

src/main/java/fr/insee/genesis/domain/model/editedresponse/EditedExternalResponseModel.java renamed to src/main/java/fr/insee/genesis/domain/model/contextualvariable/ContextualExternalVariableModel.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package fr.insee.genesis.domain.model.editedresponse;
1+
package fr.insee.genesis.domain.model.contextualvariable;
22

33
import lombok.Builder;
44
import lombok.Data;
@@ -7,7 +7,7 @@
77

88
@Builder
99
@Data
10-
public class EditedExternalResponseModel {
10+
public class ContextualExternalVariableModel {
1111
String id;
1212
String questionnaireId;
1313
String interrogationId;

src/main/java/fr/insee/genesis/domain/model/editedresponse/EditedPreviousResponseModel.java renamed to src/main/java/fr/insee/genesis/domain/model/contextualvariable/ContextualPreviousVariableModel.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package fr.insee.genesis.domain.model.editedresponse;
1+
package fr.insee.genesis.domain.model.contextualvariable;
22

33
import lombok.Builder;
44
import lombok.Data;
@@ -7,7 +7,7 @@
77

88
@Builder
99
@Data
10-
public class EditedPreviousResponseModel {
10+
public class ContextualPreviousVariableModel {
1111
String id;
1212
String questionnaireId;
1313
String interrogationId;

0 commit comments

Comments
 (0)