Skip to content

Commit cd26c42

Browse files
committed
feat: add contextual variables execution report endpoint
1 parent 5de43eb commit cd26c42

5 files changed

Lines changed: 118 additions & 0 deletions

File tree

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package fr.insee.genesis.controller.dto;
2+
3+
public record ContextualVariableFileReportDto(
4+
String fileName,
5+
String type
6+
) {}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package fr.insee.genesis.controller.dto;
2+
3+
import java.util.List;
4+
5+
public record SaveContextualVariablesReportDto(
6+
String questionnaireId,
7+
int processedFiles,
8+
List<ContextualVariableFileReportDto> files
9+
) {}

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import fr.insee.genesis.Constants;
44
import fr.insee.genesis.configuration.Config;
5+
import fr.insee.genesis.controller.dto.SaveContextualVariablesReportDto;
56
import fr.insee.genesis.domain.model.surveyunit.Mode;
67
import fr.insee.genesis.domain.ports.api.ContextualExternalVariableApiPort;
78
import fr.insee.genesis.domain.ports.api.ContextualPreviousVariableApiPort;
@@ -62,6 +63,27 @@ public ResponseEntity<Object> saveContextualVariables(
6263

6364
}
6465

66+
@Operation(summary = "Save all contextual variables json files and return processed file details")
67+
@PostMapping(path = "/json/report")
68+
@PreAuthorize("hasAnyRole('USER_PLATINE','SCHEDULER')")
69+
public ResponseEntity<SaveContextualVariablesReportDto> saveContextualVariablesWithReport(
70+
@RequestParam("questionnaireId") String questionnaireId
71+
) throws GenesisException {
72+
FileUtils fileUtils = new FileUtils(config);
73+
74+
String contextualFolderPath =
75+
fileUtils.getDataFolder(questionnaireId, "WEB", null) + Constants.CONTEXTUAL_FOLDER;
76+
77+
SaveContextualVariablesReportDto report =
78+
contextualVariableApiPort.saveContextualVariableFilesWithReport(
79+
questionnaireId,
80+
fileUtils,
81+
contextualFolderPath
82+
);
83+
84+
return ResponseEntity.ok(report);
85+
}
86+
6587
@Operation(summary = "Add contextual previous json file")
6688
@PostMapping(path = "previous/json")
6789
@PreAuthorize("hasAnyRole('USER_PLATINE','SCHEDULER','USER_BACK_OFFICE')")
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
package fr.insee.genesis.domain.ports.api;
22

3+
import fr.insee.genesis.controller.dto.SaveContextualVariablesReportDto;
34
import fr.insee.genesis.domain.model.contextualvariable.ContextualVariableModel;
45
import fr.insee.genesis.exceptions.GenesisException;
56
import fr.insee.genesis.infrastructure.utils.FileUtils;
67

78
public interface ContextualVariableApiPort {
89
ContextualVariableModel getContextualVariable(String collectionInstrumentId, String interrogationId);
910
int saveContextualVariableFiles(String collectionInstrumentId, FileUtils fileUtils, String contextualFolderPath) throws GenesisException;
11+
SaveContextualVariablesReportDto saveContextualVariableFilesWithReport(
12+
String collectionInstrumentId,
13+
FileUtils fileUtils,
14+
String contextualFolderPath
15+
) throws GenesisException;
1016
}

src/main/java/fr/insee/genesis/domain/service/contextualvariable/ContextualVariableJsonService.java

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package fr.insee.genesis.domain.service.contextualvariable;
22

3+
import fr.insee.genesis.controller.dto.ContextualVariableFileReportDto;
4+
import fr.insee.genesis.controller.dto.SaveContextualVariablesReportDto;
35
import fr.insee.genesis.controller.dto.VariableQualityToolDto;
46
import fr.insee.genesis.controller.dto.VariableStateDto;
57
import fr.insee.genesis.domain.model.contextualvariable.ContextualExternalVariableModel;
@@ -26,6 +28,7 @@
2628
import java.util.Iterator;
2729
import java.util.List;
2830
import java.util.Map;
31+
import java.util.Optional;
2932
import java.util.stream.Stream;
3033

3134
@Service
@@ -101,6 +104,78 @@ public int saveContextualVariableFiles(String collectionInstrumentId, FileUtils
101104
return fileCount;
102105
}
103106

107+
@Override
108+
public SaveContextualVariablesReportDto saveContextualVariableFilesWithReport(
109+
String collectionInstrumentId,
110+
FileUtils fileUtils,
111+
String contextualFolderPath
112+
) throws GenesisException {
113+
List<ContextualVariableFileReportDto> files = new ArrayList<>();
114+
115+
for (Mode mode : Mode.values()) {
116+
try (Stream<Path> filePaths = Files.list(Path.of(contextualFolderPath))) {
117+
Iterator<Path> it = filePaths
118+
.filter(path -> path.toString().endsWith(".json"))
119+
.iterator();
120+
121+
while (it.hasNext()) {
122+
Path jsonFilePath = it.next();
123+
124+
Optional<String> type = processContextualVariableFileAndGetType(
125+
collectionInstrumentId,
126+
jsonFilePath
127+
);
128+
129+
if (type.isPresent()) {
130+
moveFile(collectionInstrumentId, mode, fileUtils, jsonFilePath.toString());
131+
132+
files.add(new ContextualVariableFileReportDto(
133+
jsonFilePath.getFileName().toString(),
134+
type.get()
135+
));
136+
}
137+
}
138+
} catch (NoSuchFileException nsfe) {
139+
log.debug(nsfe.toString());
140+
} catch (IOException ioe) {
141+
log.warn(ioe.toString());
142+
}
143+
}
144+
145+
return new SaveContextualVariablesReportDto(
146+
collectionInstrumentId,
147+
files.size(),
148+
files
149+
);
150+
}
151+
152+
private Optional<String> processContextualVariableFileAndGetType(
153+
String collectionInstrumentId,
154+
Path jsonFilePath
155+
) throws GenesisException {
156+
boolean isPrevious = contextualPreviousVariableApiPort.readContextualPreviousFile(
157+
collectionInstrumentId.toUpperCase(),
158+
null,
159+
jsonFilePath.toString()
160+
);
161+
162+
if (isPrevious) {
163+
return Optional.of("PREVIOUS");
164+
}
165+
166+
boolean isExternal = contextualExternalVariableApiPort.readContextualExternalFile(
167+
collectionInstrumentId.toUpperCase(),
168+
jsonFilePath.toString()
169+
);
170+
171+
if (isExternal) {
172+
return Optional.of("EXTERNAL");
173+
}
174+
175+
return Optional.empty();
176+
}
177+
178+
104179
private static void moveFile(String collectionInstrumentId, Mode mode, FileUtils fileUtils, String filePath) throws GenesisException {
105180
try {
106181
fileUtils.moveFiles(Path.of(filePath), fileUtils.getDoneFolder(collectionInstrumentId, mode.getFolder()));

0 commit comments

Comments
 (0)