11package fr .insee .genesis .controller .rest .responses ;
22
3- import com .fasterxml .jackson .core . JsonProcessingException ;
3+ import com .fasterxml .jackson .databind . DeserializationFeature ;
44import com .fasterxml .jackson .databind .ObjectMapper ;
5- import com .networknt .schema .Error ;
6- import com .networknt .schema .Schema ;
7- import com .networknt .schema .SchemaRegistry ;
8- import com .networknt .schema .dialect .Dialects ;
5+ import com .fasterxml .jackson .databind .SerializationFeature ;
6+ import com .fasterxml .jackson .datatype .jsr310 .JavaTimeModule ;
97import fr .insee .genesis .controller .dto .rawdata .LunaticJsonRawDataUnprocessedDto ;
8+ import fr .insee .genesis .controller .utils .ExtendedJsonNormalizer ;
9+ import fr .insee .genesis .controller .utils .JsonSchemaValidator ;
10+ import fr .insee .genesis .controller .utils .SchemaType ;
1011import fr .insee .genesis .domain .model .surveyunit .Mode ;
1112import fr .insee .genesis .domain .model .surveyunit .rawdata .DataProcessResult ;
1213import fr .insee .genesis .domain .model .surveyunit .rawdata .LunaticJsonRawDataModel ;
1314import fr .insee .genesis .domain .ports .api .LunaticJsonRawDataApiPort ;
1415import fr .insee .genesis .exceptions .GenesisError ;
1516import fr .insee .genesis .exceptions .GenesisException ;
17+ import fr .insee .genesis .exceptions .SchemaValidationException ;
18+ import fr .insee .genesis .infrastructure .repository .RawResponseInputRepository ;
19+ import fr .insee .modelefiliere .RawResponseDto ;
1620import io .swagger .v3 .oas .annotations .Hidden ;
1721import io .swagger .v3 .oas .annotations .Operation ;
1822import lombok .extern .slf4j .Slf4j ;
3034import org .springframework .web .bind .annotation .PostMapping ;
3135import org .springframework .web .bind .annotation .PutMapping ;
3236import org .springframework .web .bind .annotation .RequestBody ;
33- import org .springframework .web .bind .annotation .RequestMapping ;
3437import org .springframework .web .bind .annotation .RequestParam ;
3538
39+ import java .io .IOException ;
3640import java .time .Instant ;
3741import java .time .LocalDateTime ;
3842import java .util .ArrayList ;
4246
4347@ Slf4j
4448@ Controller
45- @ RequestMapping (path = "/responses/raw" )
4649public class RawResponseController {
4750
4851 private static final String SUCCESS_MESSAGE = "Interrogation %s saved" ;
4952 private static final String PARTITION_ID = "partitionId" ;
5053 private static final String INTERROGATION_ID = "interrogationId" ;
5154 private final LunaticJsonRawDataApiPort lunaticJsonRawDataApiPort ;
55+ private final RawResponseInputRepository rawRepository ;
5256
53- public RawResponseController (LunaticJsonRawDataApiPort lunaticJsonRawDataApiPort ) {
57+
58+ public RawResponseController (LunaticJsonRawDataApiPort lunaticJsonRawDataApiPort , RawResponseInputRepository rawRepository ) {
5459 this .lunaticJsonRawDataApiPort = lunaticJsonRawDataApiPort ;
60+ this .rawRepository = rawRepository ;
5561 }
5662
5763 @ Operation (summary = "Save lunatic json data from one interrogation in Genesis Database" )
58- @ PutMapping (path = "/lunatic-json/save" )
64+ @ PutMapping (path = "/responses/raw/ lunatic-json/save" )
5965 @ PreAuthorize ("hasRole('COLLECT_PLATFORM')" )
6066 public ResponseEntity <String > saveRawResponsesFromJsonBody (
6167
@@ -86,16 +92,18 @@ public ResponseEntity<String> saveRawResponsesFromJsonBody(
8692 return ResponseEntity .status (201 ).body (String .format (SUCCESS_MESSAGE , interrogationId ));
8793 }
8894
89- @ Operation (summary = "Save lunatic json data from one interrogation in Genesis Database (with json " +
90- "schema validation)" )
91- @ PutMapping (path = "/lunatic-json" )
95+ /* @Operation(summary = "Deprecated")
96+ @PutMapping(path="/lunatic-json")
9297 @PreAuthorize("hasRole('COLLECT_PLATFORM')")
93- public ResponseEntity <String > saveRawResponsesFromJsonBodyWithValidation (
98+ // Check version when merging
99+ @Deprecated(since="1.13.0", forRemoval=true)
100+ public ResponseEntity<String> saveRawResponsesFromJsonBodyWithValidationDeprecated(
94101 @RequestBody Map<String, Object> body
95102 ) {
103+
96104 SchemaRegistry schemaRegistry = SchemaRegistry.withDialect(Dialects.getDraft202012(), SchemaRegistry.Builder::build);
97105 Schema jsonSchema = schemaRegistry
98- .getSchema (RawResponseController .class .getResourceAsStream ("/jsonSchemas /RawResponse.json" )
106+ .getSchema(RawResponseController.class.getResourceAsStream("/modele-filiere-spec /RawResponse.json")
99107 );
100108 try {
101109 if (jsonSchema == null) {
@@ -134,19 +142,48 @@ public ResponseEntity<String> saveRawResponsesFromJsonBodyWithValidation(
134142 log.info("Data saved for interrogationId {} and partition {}", body.get(INTERROGATION_ID).toString(),
135143 body.get(PARTITION_ID).toString());
136144 return ResponseEntity.status(201).body(String.format(SUCCESS_MESSAGE, body.get(INTERROGATION_ID).toString()));
145+ }*/
146+
147+ @ Operation (summary = "Save lunatic json data from one interrogation in Genesis Database (with json " +
148+ "schema validation)" )
149+ @ PutMapping (path ="/raw-responses" )
150+ @ PreAuthorize ("hasRole('COLLECT_PLATFORM')" )
151+ public ResponseEntity <String > saveRawResponsesFromJsonBodyWithValidation (
152+ @ RequestBody Map <String , Object > body
153+ ) {
154+ ObjectMapper objectMapperLocal = new ObjectMapper ();
155+ objectMapperLocal .registerModule (new JavaTimeModule ());
156+ objectMapperLocal .disable (SerializationFeature .WRITE_DATES_AS_TIMESTAMPS ); // ISO-8601
157+ objectMapperLocal .disable (DeserializationFeature .ADJUST_DATES_TO_CONTEXT_TIME_ZONE );
158+
159+ try {
160+ RawResponseDto rawResponseDto = JsonSchemaValidator .readAndValidateFromClasspath (
161+ ExtendedJsonNormalizer .normalize (new ObjectMapper ().readTree (
162+ new ObjectMapper ().writeValueAsString (body ))),
163+ SchemaType .RAW_RESPONSE .getSchemaFileName (),
164+ RawResponseDto .class ,
165+ objectMapperLocal
166+ );
167+ rawRepository .saveAsRawJson (rawResponseDto );
168+ } catch (SchemaValidationException | IOException e ) {
169+ return ResponseEntity .status (400 ).body (e .toString ());
170+ }
171+ return ResponseEntity .ok ("Change this when ready" );
172+ }
173+
137174 }
138175
139176 //GET unprocessed
140177 @ Operation (summary = "Get campaign id and interrogationId from all unprocessed raw json data" )
141- @ GetMapping (path = "/lunatic-json/get/unprocessed" )
178+ @ GetMapping (path = "/responses/raw/ lunatic-json/get/unprocessed" )
142179 @ PreAuthorize ("hasRole('SCHEDULER')" )
143180 public ResponseEntity <List <LunaticJsonRawDataUnprocessedDto >> getUnproccessedJsonRawData () {
144181 log .info ("Try to get unprocessed raw JSON datas..." );
145182 return ResponseEntity .ok (lunaticJsonRawDataApiPort .getUnprocessedDataIds ());
146183 }
147184
148185 @ Hidden
149- @ GetMapping (path = "/lunatic-json/get/by-interrogation-mode-and-campaign" )
186+ @ GetMapping (path = "/responses/raw/ lunatic-json/get/by-interrogation-mode-and-campaign" )
150187 @ PreAuthorize ("hasRole('ADMIN')" )
151188 public ResponseEntity <LunaticJsonRawDataModel > getJsonRawData (
152189 @ RequestParam (INTERROGATION_ID ) String interrogationId ,
@@ -159,7 +196,7 @@ public ResponseEntity<LunaticJsonRawDataModel> getJsonRawData(
159196
160197 //PROCESS
161198 @ Operation (summary = "Process raw data of a campaign" )
162- @ PostMapping (path = "/lunatic-json/process" )
199+ @ PostMapping (path = "/responses/raw/ lunatic-json/process" )
163200 @ PreAuthorize ("hasRole('SCHEDULER')" )
164201 public ResponseEntity <String > processJsonRawData (
165202 @ RequestParam ("campaignName" ) String campaignName ,
@@ -181,7 +218,7 @@ public ResponseEntity<String> processJsonRawData(
181218 }
182219
183220 @ Operation (summary = "Get processed data ids from last n hours (default 24h)" )
184- @ GetMapping (path = "/lunatic-json/processed/ids" )
221+ @ GetMapping (path = "/responses/raw/ lunatic-json/processed/ids" )
185222 @ PreAuthorize ("hasRole('ADMIN')" )
186223 public ResponseEntity <Map <String , List <String >>> getProcessedDataIdsSinceHours (
187224 @ RequestParam ("questionnaireId" ) String questionnaireId ,
@@ -193,7 +230,7 @@ public ResponseEntity<Map<String, List<String>>> getProcessedDataIdsSinceHours(
193230 }
194231
195232 @ Operation (summary = "Get lunatic JSON data from one campaign in Genesis Database, filtered by start and end dates" )
196- @ GetMapping (path = "/lunatic-json/{campaignId}" )
233+ @ GetMapping (path = "/responses/raw/ lunatic-json/{campaignId}" )
197234 @ PreAuthorize ("hasRole('USER_BATCH_GENERIC')" )
198235 public ResponseEntity <PagedModel <LunaticJsonRawDataModel >> getRawResponsesFromJsonBody (
199236 @ PathVariable String campaignId ,
0 commit comments