Skip to content

Commit 049050c

Browse files
Merge pull request #297 from InseeFr/devJsonExtraction
New endpoints for Json extraction
2 parents 7c55f0d + 4203f1b commit 049050c

23 files changed

+394
-4
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ public class Constants {
1414
public static final String FILTER_RESULT_PREFIX = "FILTER_RESULT_";
1515
public static final String MISSING_SUFFIX = "_MISSING";
1616
public static final String MONGODB_LUNATIC_RAWDATA_COLLECTION_NAME = "lunaticjsondata";
17+
public static final String MONGODB_EXTRACTION_JSON_COLLECTION_NAME = "lastjsonextraction";
1718
private static final String[] ENO_VARIABLES = {"COMMENT_QE","COMMENT_UE","HEURE_REMPL","MIN_REMPL"};
1819

1920
public static final String MONGODB_SCHEDULE_COLLECTION_NAME = "schedules";
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package fr.insee.genesis.controller.dto;
2+
3+
import lombok.Getter;
4+
import lombok.Setter;
5+
6+
import java.time.LocalDateTime;
7+
8+
@Getter
9+
@Setter
10+
public class LastExtractionResponseDto {
11+
private final String lastExtractionDate;
12+
public LastExtractionResponseDto(LocalDateTime lastExtractionDate) {
13+
this.lastExtractionDate = lastExtractionDate != null ? lastExtractionDate.toString() : null;
14+
}
15+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package fr.insee.genesis.controller.mappers;
2+
3+
import fr.insee.genesis.controller.dto.ScheduleDto;
4+
import fr.insee.genesis.domain.model.context.DataProcessingContextModel;
5+
6+
import java.util.ArrayList;
7+
import java.util.List;
8+
9+
public class DataProcessingContextMapperDto {
10+
11+
public ScheduleDto dataProcessingContextToScheduleDto(DataProcessingContextModel dataProcessingContext){
12+
return ScheduleDto.builder()
13+
.surveyName(dataProcessingContext.getPartitionId())
14+
.lastExecution(dataProcessingContext.getLastExecution())
15+
.kraftwerkExecutionScheduleList(dataProcessingContext.getKraftwerkExecutionScheduleList())
16+
.build();
17+
}
18+
19+
public List<ScheduleDto> dataProcessingContextListToScheduleDtoList(List<DataProcessingContextModel> contexts){
20+
List<ScheduleDto> dtos = new ArrayList<>();
21+
for(DataProcessingContextModel context : contexts){
22+
dtos.add(dataProcessingContextToScheduleDto(context));
23+
}
24+
return dtos;
25+
}
26+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package fr.insee.genesis.controller.rest;
2+
3+
import fr.insee.genesis.controller.dto.LastExtractionResponseDto;
4+
import fr.insee.genesis.domain.model.extraction.json.LastJsonExtractionModel;
5+
import fr.insee.genesis.domain.model.surveyunit.Mode;
6+
import fr.insee.genesis.domain.ports.api.LastJsonExtractionApiPort;
7+
import fr.insee.genesis.exceptions.GenesisException;
8+
import io.swagger.v3.oas.annotations.Operation;
9+
import lombok.AllArgsConstructor;
10+
import lombok.extern.slf4j.Slf4j;
11+
import org.springframework.http.HttpStatus;
12+
import org.springframework.http.ResponseEntity;
13+
import org.springframework.security.access.prepost.PreAuthorize;
14+
import org.springframework.stereotype.Controller;
15+
import org.springframework.web.bind.annotation.GetMapping;
16+
import org.springframework.web.bind.annotation.PutMapping;
17+
import org.springframework.web.bind.annotation.RequestMapping;
18+
import org.springframework.web.bind.annotation.RequestParam;
19+
20+
import java.time.LocalDateTime;
21+
22+
@Slf4j
23+
@Controller
24+
@AllArgsConstructor
25+
@RequestMapping(path = "/extractions")
26+
public class JsonExtractionController {
27+
28+
LastJsonExtractionApiPort lastJsonExtractionApiPort;
29+
30+
@Operation(summary = "Record the date of the latest JSON data extraction in Kraftwerk")
31+
@PutMapping(path = "/json")
32+
@PreAuthorize("hasAnyRole('USER_KRAFTWERK','SCHEDULER')")
33+
public ResponseEntity<String> saveLastJsonExtractionDate(
34+
@RequestParam("questionnaireId") String questionnaireId,
35+
@RequestParam(value = "mode", required = false) Mode mode){
36+
LocalDateTime extractDate = LocalDateTime.now();
37+
LastJsonExtractionModel extract = LastJsonExtractionModel.builder()
38+
.questionnaireModelId(questionnaireId)
39+
.mode(mode)
40+
.lastExtractionDate(extractDate)
41+
.build();
42+
lastJsonExtractionApiPort.recordDate(extract);
43+
return ResponseEntity.ok().build();
44+
}
45+
46+
@Operation(summary = "Get the date of the latest JSON data extraction in Kraftwerk")
47+
@GetMapping(path = "/json")
48+
@PreAuthorize("hasAnyRole('USER_KRAFTWERK','SCHEDULER')")
49+
public ResponseEntity<LastExtractionResponseDto> getLastJsonExtractionDate(
50+
@RequestParam("questionnaireId") String questionnaireId,
51+
@RequestParam(value = "mode", required = false) Mode mode){
52+
try{
53+
LastJsonExtractionModel lastJsonExtraction = lastJsonExtractionApiPort.getLastExtractionDate(questionnaireId,mode);
54+
return ResponseEntity.ok(new LastExtractionResponseDto(lastJsonExtraction.getLastExtractionDate()));
55+
} catch (GenesisException e){
56+
return ResponseEntity.notFound().build();
57+
}
58+
}
59+
60+
}

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@
66
import io.swagger.v3.oas.annotations.Operation;
77
import io.swagger.v3.oas.annotations.Parameter;
88
import lombok.extern.slf4j.Slf4j;
9+
import org.springframework.format.annotation.DateTimeFormat;
910
import org.springframework.http.ResponseEntity;
1011
import org.springframework.stereotype.Controller;
1112
import org.springframework.web.bind.annotation.GetMapping;
1213
import org.springframework.web.bind.annotation.PathVariable;
1314
import org.springframework.web.bind.annotation.RequestMapping;
1415
import org.springframework.web.bind.annotation.RequestParam;
1516

17+
import java.time.LocalDateTime;
1618
import java.util.List;
1719

1820
@RequestMapping(path = "/interrogations" )
@@ -35,6 +37,15 @@ public ResponseEntity<List<InterrogationId>> getAllInterrogationIdsByQuestionnai
3537
return ResponseEntity.ok(responses);
3638
}
3739

40+
@Operation(summary = "Retrieve interrogations recorded since a specified date for a given questionnaire")
41+
@GetMapping(path = "/by-questionnaire-and-since-datetime")
42+
public ResponseEntity<List<InterrogationId>> getAllInterrogationIdsByQuestionnaire(
43+
@RequestParam("questionnaireId") String questionnaireId,
44+
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime since) {
45+
List<InterrogationId> responses = surveyUnitService.findDistinctInterrogationIdsByQuestionnaireIdAndDateAfter(questionnaireId, since);
46+
return ResponseEntity.ok(responses);
47+
}
48+
3849

3950
//========= OPTIMISATIONS PERFS (START) ==========
4051
/**
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package fr.insee.genesis.domain.model.extraction.json;
2+
3+
import fr.insee.genesis.domain.model.surveyunit.Mode;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Builder;
6+
import lombok.Data;
7+
import lombok.NoArgsConstructor;
8+
import org.springframework.data.annotation.Id;
9+
10+
import java.time.LocalDateTime;
11+
12+
@Data
13+
@Builder
14+
@NoArgsConstructor
15+
@AllArgsConstructor
16+
public class LastJsonExtractionModel {
17+
@Id
18+
private String id; //Used to remove warning
19+
String questionnaireModelId;
20+
Mode mode;
21+
LocalDateTime lastExtractionDate;
22+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package fr.insee.genesis.domain.ports.api;
2+
3+
import fr.insee.genesis.domain.model.extraction.json.LastJsonExtractionModel;
4+
import fr.insee.genesis.domain.model.surveyunit.Mode;
5+
import fr.insee.genesis.exceptions.GenesisException;
6+
7+
public interface LastJsonExtractionApiPort {
8+
void recordDate(LastJsonExtractionModel extraction);
9+
10+
LastJsonExtractionModel getLastExtractionDate(String questionnaireModelId, Mode mode) throws GenesisException;
11+
}

src/main/java/fr/insee/genesis/domain/ports/api/SurveyUnitApiPort.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import fr.insee.genesis.domain.model.surveyunit.SurveyUnitModel;
1111
import fr.insee.genesis.exceptions.GenesisException;
1212

13+
import java.time.LocalDateTime;
1314
import java.util.List;
1415
import java.util.Set;
1516
import java.util.stream.Stream;
@@ -37,6 +38,8 @@ public interface SurveyUnitApiPort {
3738

3839
List<InterrogationId> findDistinctInterrogationIdsByQuestionnaireId(String questionnaireId);
3940

41+
List<InterrogationId> findDistinctInterrogationIdsByQuestionnaireIdAndDateAfter(String questionnaireId, LocalDateTime since);
42+
4043
//========= OPTIMISATIONS PERFS (START) ==========
4144
long countInterrogationIdsByQuestionnaireId(String questionnaireId);
4245

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package fr.insee.genesis.domain.ports.spi;
2+
3+
import fr.insee.genesis.domain.model.extraction.json.LastJsonExtractionModel;
4+
import fr.insee.genesis.domain.model.surveyunit.Mode;
5+
import fr.insee.genesis.exceptions.GenesisException;
6+
7+
public interface LastJsonExtractionPersistencePort {
8+
void save(LastJsonExtractionModel extraction);
9+
LastJsonExtractionModel getLastExecutionDate(String questionnaireModelId, Mode mode) throws GenesisException;
10+
}

src/main/java/fr/insee/genesis/domain/ports/spi/SurveyUnitPersistencePort.java

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

33
import fr.insee.genesis.domain.model.surveyunit.SurveyUnitModel;
44

5+
import java.time.LocalDateTime;
56
import java.util.List;
67
import java.util.Set;
78
import java.util.stream.Stream;
@@ -27,6 +28,8 @@ public interface SurveyUnitPersistencePort {
2728

2829
List<SurveyUnitModel> findInterrogationIdsByQuestionnaireId(String questionnaireId);
2930

31+
List<SurveyUnitModel> findInterrogationIdsByQuestionnaireIdAndDateAfter(String questionnaireId, LocalDateTime since);
32+
3033
//======== OPTIMISATIONS PERFS (START) ========
3134
long countInterrogationIdsByQuestionnaireId(String questionnaireId);
3235

0 commit comments

Comments
 (0)