99import fr .insee .genesis .controller .adapter .LunaticXmlAdapter ;
1010import fr .insee .genesis .controller .dto .SurveyUnitDto ;
1111import fr .insee .genesis .controller .dto .SurveyUnitId ;
12+ import fr .insee .genesis .controller .dto .SurveyUnitInputDto ;
1213import fr .insee .genesis .controller .dto .SurveyUnitSimplified ;
1314import fr .insee .genesis .controller .sources .xml .LunaticXmlCampaign ;
1415import fr .insee .genesis .controller .sources .xml .LunaticXmlDataParser ;
1516import fr .insee .genesis .controller .sources .xml .LunaticXmlDataSequentialParser ;
1617import fr .insee .genesis .controller .sources .xml .LunaticXmlSurveyUnit ;
18+ import fr .insee .genesis .controller .utils .AuthUtils ;
1719import fr .insee .genesis .controller .utils .ControllerUtils ;
1820import fr .insee .genesis .domain .model .surveyunit .CollectedVariable ;
1921import fr .insee .genesis .domain .model .surveyunit .Mode ;
5456import java .time .LocalDateTime ;
5557import java .util .ArrayList ;
5658import java .util .List ;
59+ import java .util .stream .Collectors ;
5760import java .util .stream .Stream ;
5861
5962@ RequestMapping (path = "/responses" )
@@ -73,20 +76,24 @@ public class ResponseController {
7376 private final LunaticJsonRawDataApiPort lunaticJsonRawDataApiPort ;
7477 private final FileUtils fileUtils ;
7578 private final ControllerUtils controllerUtils ;
79+ private final AuthUtils authUtils ;
7680
7781
7882 public ResponseController (SurveyUnitApiPort surveyUnitService ,
7983 SurveyUnitQualityService surveyUnitQualityService ,
8084 LunaticXmlRawDataApiPort lunaticXmlRawDataApiPort ,
8185 LunaticJsonRawDataApiPort lunaticJsonRawDataApiPort ,
8286 FileUtils fileUtils ,
83- ControllerUtils controllerUtils ) {
87+ ControllerUtils controllerUtils ,
88+ AuthUtils authUtils
89+ ) {
8490 this .surveyUnitService = surveyUnitService ;
8591 this .surveyUnitQualityService = surveyUnitQualityService ;
8692 this .lunaticXmlRawDataApiPort = lunaticXmlRawDataApiPort ;
8793 this .lunaticJsonRawDataApiPort = lunaticJsonRawDataApiPort ;
8894 this .fileUtils = fileUtils ;
8995 this .controllerUtils = controllerUtils ;
96+ this .authUtils = authUtils ;
9097 }
9198
9299 //SAVE
@@ -230,7 +237,7 @@ public ResponseEntity<Object> saveResponsesFromAllCampaignFolders(){
230237 try {
231238 List <Mode > modesList = controllerUtils .getModesList (campaignName , null ); //modeSpecified null = all modes
232239 for (Mode currentMode : modesList ) {
233- processCampaignWithMode (campaignName , currentMode , errors , Constants .DIFFRENTIAL_DATA_FOLDER_NAME );
240+ processCampaignWithMode (campaignName , currentMode , errors , Constants .DIFFERENTIAL_DATA_FOLDER_NAME );
234241 }
235242 }catch (NoDataException nde ){
236243 log .warn (nde .getMessage ());
@@ -360,6 +367,62 @@ public ResponseEntity<List<SurveyUnitSimplified>> getLatestForUEList(@RequestPar
360367 return ResponseEntity .ok (results );
361368 }
362369
370+ @ Operation (summary = "Save edited variables" ,
371+ description = "Save edited variables document into database" )
372+ @ PostMapping (path = "/save-edited" )
373+ public ResponseEntity <Object > saveEditedVariables (
374+ @ RequestBody SurveyUnitInputDto surveyUnitInputDto
375+ ){
376+ //Parse metadata
377+ //Try to look for DDI first, if no DDI found looks for lunatic components
378+ List <GenesisError > errors = new ArrayList <>();
379+ VariablesMap variablesMap = readMetadatas (surveyUnitInputDto .getCampaignId (), surveyUnitInputDto .getMode (), errors , true );
380+ if (variablesMap == null ){
381+ log .warn ("Can't find DDI, trying with lunatic..." );
382+ variablesMap = readMetadatas (surveyUnitInputDto .getCampaignId (), surveyUnitInputDto .getMode (), errors , false );
383+ if (variablesMap == null ){
384+ return ResponseEntity .status (404 ).body (errors .getLast ().getMessage ());
385+ }
386+ }
387+
388+ //Check if input edited variables are in metadatas
389+ List <String > absentCollectedVariableNames =
390+ surveyUnitQualityService .checkVariablesPresentInMetadata (surveyUnitInputDto .getCollectedVariables (),
391+ variablesMap );
392+ // List<String> absentExternalVariableNames =
393+ // surveyUnitQualityService.checkVariablesPresentInMetadata(surveyUnitInputDto.getExternalVariables(),
394+ // variablesMap);
395+ if (!absentCollectedVariableNames .isEmpty ()) {
396+ String absentVariables = String .join ("\n " , absentCollectedVariableNames );
397+ return ResponseEntity .badRequest ().body (
398+ String .format ("The following variables are absent in metadatas : %n%s" , absentVariables )
399+ );
400+ }
401+
402+ //Fetch user identifier from OIDC token
403+ String userIdentifier = authUtils .getIDEP ();
404+
405+
406+ //Create surveyUnitModel for each STATE received (Quality tool could send variables with another STATE than EDITED)
407+ List <SurveyUnitModel > surveyUnitModels ;
408+ try {
409+ surveyUnitModels = surveyUnitService .parseEditedVariables (
410+ surveyUnitInputDto ,
411+ userIdentifier ,
412+ variablesMap
413+ );
414+ }catch (GenesisException e ){
415+ return ResponseEntity .status (e .getStatus ()).body (e .getMessage ());
416+ }
417+
418+ //Check data with dataverifier (might create a FORCED document)
419+ surveyUnitQualityService .verifySurveyUnits (surveyUnitModels , variablesMap );
420+
421+ //Save documents
422+ surveyUnitService .saveSurveyUnits (surveyUnitModels );
423+ return ResponseEntity .ok (SUCCESS_MESSAGE );
424+ }
425+
363426 //Utilities
364427
365428 /**
@@ -579,10 +642,9 @@ private ResponseEntity<Object> processXmlFileSequentially(Path filepath, Mode mo
579642 su = parser .readNextSurveyUnit ();
580643 }
581644
582- log .info ("Saved {} survey units updates" , suCount );
645+ log .info ("Saved {} survey units updates from Xml file {} " , suCount , filepath . getFileName () );
583646 }
584647
585- log .info ("File {} processed" , filepath .getFileName ());
586648 return ResponseEntity .ok ().build ();
587649 }
588650
0 commit comments