Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
6a63661
create an exceptionHandler class to unify the exception logs
Hajarel-moukh Feb 26, 2026
72afd29
continuer les modifs
Hajarel-moukh Feb 26, 2026
21420d5
continuer les modifs
Hajarel-moukh Feb 27, 2026
4d461c1
modify tests
Hajarel-moukh Feb 27, 2026
765e0d7
modify tests
Hajarel-moukh Feb 27, 2026
150acb4
modify after CR
Hajarel-moukh Mar 31, 2026
7c05074
replace e with an unnamed pattern
Hajarel-moukh Apr 1, 2026
10bdcf6
replace ResponseEntity with ProblemDetail
Hajarel-moukh Apr 10, 2026
5e5fa46
feat: new last extractions date and idInterrogations endpoints
loichenninger Apr 13, 2026
ee19758
test: fix for recordedDate as Instant
loichenninger Apr 13, 2026
0606d10
Merge branch 'main' into devLastExtractionDate
loichenninger Apr 13, 2026
623aab3
fix: remove system.out.println
loichenninger Apr 13, 2026
0ddb09c
Merge branch 'main' into devExceptionHandlerClass
alexisszmundy Apr 15, 2026
8267ac5
fix: fixed build errors
alexisszmundy Apr 15, 2026
953d5f1
test: ignored old tests
alexisszmundy Apr 15, 2026
1877c3a
Merge branch 'main' into devExceptionHandlerClass
alexisszmundy Apr 15, 2026
78d48f9
fix: fixes after merge
alexisszmundy Apr 15, 2026
f5307c2
correct after CR
Hajarel-moukh Apr 15, 2026
c4c756d
Merge branch 'main' into devExceptionHandlerClass
alexisszmundy Apr 15, 2026
e8a0ab3
Merge branch 'devExceptionHandlerClass' of https://github.com/InseeFr…
alexisszmundy Apr 15, 2026
bebdb26
Merge branch 'main' into devLastExtractionDate
loichenninger Apr 15, 2026
25d3597
Merge branch 'main' into devExceptionHandlerClass
nsenave Apr 15, 2026
1022223
refactor: warn log on genesis unresolved code
nsenave Apr 15, 2026
425117d
refactor: gather exception handlers (wip)
nsenave Apr 15, 2026
407fae7
refactor: wip still in progress
nsenave Apr 15, 2026
8017501
put all handlers in one class
Hajarel-moukh Apr 16, 2026
ea7ce04
Merge branch 'main' into devExceptionHandlerClass
Hajarel-moukh Apr 16, 2026
b348fab
refactor: warn if invalid http code
nsenave Apr 16, 2026
4b8af17
style: reorder and line breaks
nsenave Apr 16, 2026
060308c
refactor: endpoint which selects interrogations uses a starting and e…
loichenninger Apr 20, 2026
c0e9c64
Merge remote-tracking branch 'origin/removeCampaignId' into devLastEx…
loichenninger Apr 20, 2026
a3f8ba6
test: adapt new code to refactor of tests
loichenninger Apr 21, 2026
cd2f2a0
chore: add logs
alicela Apr 21, 2026
dc84da9
Merge remote-tracking branch 'origin/devLastExtractionDateAndRefacto'…
alicela Apr 21, 2026
9bce50a
test: fix exception errors
alicela Apr 22, 2026
b5843ce
delete try catch from rawResponseController
Hajarel-moukh Apr 22, 2026
2203253
refactor: wrap persistence exceptions into GenesisException
Hajarel-moukh Apr 22, 2026
d347742
Merge branch 'main' into devExceptionAndRefactoAndDate
Hajarel-moukh Apr 22, 2026
2701ebc
Merge branch 'main' into devExceptionAndRefactoAndDate
Hajarel-moukh Apr 24, 2026
d722f5d
fix: remove null questionnaireId/collectionInstrumentId
alexisszmundy Apr 24, 2026
0dc9600
test: InterrogationController IT for get interrogationIds
alexisszmundy Apr 24, 2026
f40e04b
fix: until is not required anymore
alexisszmundy Apr 24, 2026
eb81b90
add two endpoints to get lunatic and rawdata model
Hajarel-moukh Apr 24, 2026
7e6438b
add endpoint to retrieve raw/lunatic data identifiers by collectionIn…
Hajarel-moukh Apr 27, 2026
d0af6a2
Merge branch 'main' into feat/addNewEndPointsToGetRawData
Hajarel-moukh Apr 27, 2026
3dfbb21
Merge branch 'main' into feat/addNewEndPointsToGetRawData
Hajarel-moukh Apr 27, 2026
07fce5c
create api port interface
Hajarel-moukh Apr 27, 2026
e7790a4
add tests for new methods
Hajarel-moukh Apr 27, 2026
e96de64
Merge branch 'main' into feat/addNewEndPointsToGetRawData
Hajarel-moukh Apr 27, 2026
a9e3861
update changeLog
Hajarel-moukh Apr 27, 2026
690b33f
Merge branch 'main' into feat/addNewEndPointsToGetRawData
Hajarel-moukh Apr 28, 2026
4fad006
Merge branch 'main' into feat/addNewEndPointsToGetRawData
Hajarel-moukh Apr 29, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,11 @@
- Prevent missing contextual external or previous files from clearing existing contextual data.
- Endpoint to get data by dates

### Added
- Endpoint to retrieve raw response by collectionInstrumentId and interrogationId
- Endpoint to retrieve lunatic JSON data by questionnaireId and interrogationId
- Endpoint to retrieve raw/lunatic data identifiers by collectionInstrumentId

### Changed
- Refactor all tests
- Begin to handle exceptions
Expand Down
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package fr.insee.genesis.controller.dto.rawdata;

import java.time.LocalDateTime;

public record RawDataIdentifierDto(
String interrogationId,
String usualSurveyUnitId,
LocalDateTime recordDate,
LocalDateTime processDate
) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package fr.insee.genesis.controller.dto.rawdata;

import java.util.List;

public record RawDataIdentifiersDto(
String campaignId,
List<RawDataIdentifierDto> interrogations
) {}
Original file line number Diff line number Diff line change
@@ -1,14 +1,17 @@
package fr.insee.genesis.controller.rest;

import fr.insee.genesis.controller.dto.rawdata.CombinedRawDataDto;
import fr.insee.genesis.controller.dto.rawdata.RawDataIdentifiersDto;
import fr.insee.genesis.domain.service.rawdata.CombinedRawDataService;
import fr.insee.genesis.exceptions.NoDataException;
import io.swagger.v3.oas.annotations.Operation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

Expand Down Expand Up @@ -36,5 +39,14 @@ public ResponseEntity<CombinedRawDataDto> getCombinedRawData(

return ResponseEntity.ok(data);
}

@Operation(summary = "Get raw data identifiers by collection instrument ID")
@GetMapping("/collection-instruments/{collectionInstrumentId}/ids")
@PreAuthorize("hasRole('ADMIN')")
public ResponseEntity<RawDataIdentifiersDto> getRawDataIdentifiers(
@PathVariable String collectionInstrumentId
) throws NoDataException {
return ResponseEntity.ok(
combinedRawDataService.getRawDataIdentifiersByCollectionInstrumentId(collectionInstrumentId)
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import fr.insee.genesis.domain.ports.api.RawResponseApiPort;
import fr.insee.genesis.exceptions.GenesisError;
import fr.insee.genesis.exceptions.GenesisException;
import fr.insee.genesis.exceptions.NoDataException;
import fr.insee.genesis.infrastructure.repository.RawResponseInputRepository;
import fr.insee.modelefiliere.RawResponseDto;
import io.swagger.v3.oas.annotations.Operation;
Expand Down Expand Up @@ -93,6 +94,16 @@ public ResponseEntity<String> saveRawResponsesFromRawResponseDto(
return ResponseEntity.status(201).body(String.format(SUCCESS_MESSAGE, dto.getInterrogationId()));
}

@Operation(summary = "Get a raw response by collection instrument ID and interrogation ID")
@GetMapping("/raw-responses/collection-instruments/{collectionInstrumentId}/interrogations/{interrogationId}")
@PreAuthorize("hasRole('ADMIN')")
public ResponseEntity<RawResponseModel> getRawResponse(
@PathVariable String collectionInstrumentId,
@PathVariable String interrogationId
) throws NoDataException {
return ResponseEntity.ok(rawResponseApiPort.getRawResponseByCollectionInstrumentIdAndInterrogationId(collectionInstrumentId, interrogationId));
}

//PROCESS
@Operation(summary = "Process raw data for a list of interrogations")
@PostMapping(path = "/raw-responses/process")
Expand Down Expand Up @@ -215,6 +226,21 @@ public ResponseEntity<PagedModel<LunaticJsonRawDataModel>> getLunaticJsonRawData
return ResponseEntity.status(HttpStatus.OK).body(new PagedModel<>(rawResponses));
}

@Operation(summary = "Get lunatic json data by questionnaire ID and interrogation ID")
@GetMapping("/responses/raw/lunatic-json/collection-instruments/{collectionInstrumentId}/interrogations/{interrogationId}")
@PreAuthorize("hasRole('ADMIN')")
public ResponseEntity<LunaticJsonRawDataModel> getLunaticJsonData(
@PathVariable String questionnaireId,
@PathVariable String interrogationId
) throws NoDataException{
return ResponseEntity.ok(
lunaticJsonRawDataApiPort.getLunaticJsonDataByQuestionnaireIdAndInterrogationId(
questionnaireId,
interrogationId
)
);
}

@Operation(summary = "Check existence of an interrogation")
@RequestMapping(value = "/responses/raw/lunatic-json/{interrogationId}", method = RequestMethod.HEAD)
@PreAuthorize("hasRole('ADMIN')")
Expand Down Expand Up @@ -266,4 +292,7 @@ public ResponseEntity<Void> exists(@PathVariable String interrogationId) {
}
return ResponseEntity.notFound().build();
}



}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package fr.insee.genesis.domain.ports.api;

import fr.insee.genesis.controller.dto.rawdata.CombinedRawDataDto;
import fr.insee.genesis.controller.dto.rawdata.RawDataIdentifiersDto;
import fr.insee.genesis.exceptions.NoDataException;

public interface CombinedRawDataApiPort {

CombinedRawDataDto getCombinedRawDataByInterrogationId(String interrogationId);
RawDataIdentifiersDto getRawDataIdentifiersByCollectionInstrumentId(
String collectionInstrumentId
) throws NoDataException;
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import fr.insee.genesis.domain.model.surveyunit.rawdata.LunaticJsonRawDataModel;
import fr.insee.genesis.exceptions.GenesisError;
import fr.insee.genesis.exceptions.GenesisException;
import fr.insee.genesis.exceptions.NoDataException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

Expand All @@ -22,7 +23,7 @@ public interface LunaticJsonRawDataApiPort {
void save(LunaticJsonRawDataModel rawData) throws GenesisException;
List<LunaticJsonRawDataModel> getRawDataByQuestionnaireId(String questionnaireId, Mode mode, List<String> interrogationIdList);
List<SurveyUnitModel> convertRawData(List<LunaticJsonRawDataModel> rawData, VariablesMap variablesMap);

LunaticJsonRawDataModel getLunaticJsonDataByQuestionnaireIdAndInterrogationId(String questionnaireId, String interrogationId) throws NoDataException;
List<LunaticJsonRawDataUnprocessedDto> getUnprocessedDataIds();
Set<String> getUnprocessedDataQuestionnaireIds();
void updateProcessDates(List<SurveyUnitModel> surveyUnitModels);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import fr.insee.genesis.domain.model.surveyunit.rawdata.RawResponseModel;
import fr.insee.genesis.exceptions.GenesisError;
import fr.insee.genesis.exceptions.GenesisException;
import fr.insee.genesis.exceptions.NoDataException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

Expand All @@ -18,6 +19,7 @@ public interface RawResponseApiPort {

List<RawResponseModel> getRawResponses(String collectionInstrumentId, Mode mode, List<String> interrogationIdList);
List<RawResponseModel> getRawResponsesByInterrogationID(String interrogationId);
RawResponseModel getRawResponseByCollectionInstrumentIdAndInterrogationId(String collectionInstrumentId, String interrogationId) throws NoDataException;
DataProcessResult processRawResponsesByInterrogationIds(String collectionInstrumentId, List<String> interrogationIdList, List<GenesisError> errors) throws GenesisException;
DataProcessResult processRawResponsesByInterrogationIds(String collectionInstrumentId) throws GenesisException;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package fr.insee.genesis.domain.ports.spi;

import fr.insee.genesis.controller.dto.rawdata.RawDataIdentifiersDto;
import fr.insee.genesis.domain.model.surveyunit.GroupedInterrogation;
import fr.insee.genesis.domain.model.surveyunit.Mode;
import fr.insee.genesis.domain.model.surveyunit.rawdata.LunaticJsonRawDataModel;
Expand All @@ -16,9 +17,15 @@ public interface LunaticJsonRawDataPersistencePort {
void save(LunaticJsonRawDataModel rawData);
List<LunaticJsonRawDataModel> findRawDataByQuestionnaireId(String questionnaireId, Mode mode, List<String> interrogationIdList);
Page<LunaticJsonRawDataModel> findRawDataByQuestionnaireId(String questionnaireId, Pageable pageable);

RawDataIdentifiersDto findLunaticJsonRawDataIdentifiersByQuestionnaireId(
String questionnaireId
);

List<LunaticJsonRawDataModel> findRawDataByInterrogationId(String interrogationId);
List<LunaticJsonRawDataModel> getAllUnprocessedData();
void updateProcessDates(String campaignId, Set<String> interrogationIds);
LunaticJsonRawDataModel findLunaticJsonDataByQuestionnaireIdAndInterrogationId(String questionnaireId, String interrogationId);

Set<String> findDistinctQuestionnaireIds();
Set<String> findDistinctQuestionnaireIdsByNullProcessDate();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package fr.insee.genesis.domain.ports.spi;

import fr.insee.genesis.controller.dto.rawdata.RawDataIdentifiersDto;
import fr.insee.genesis.domain.model.surveyunit.Mode;
import fr.insee.genesis.domain.model.surveyunit.rawdata.RawResponseModel;
import fr.insee.modelefiliere.ModeDto;
Expand All @@ -14,6 +15,12 @@ public interface RawResponsePersistencePort {

List<RawResponseModel> findRawResponses(String collectionInstrumentId, Mode mode, List<String> interrogationIdList);
List<RawResponseModel> findRawResponsesByInterrogationID(String interrogationId);
RawResponseModel findRawResponseByCollectionInstrumentIdAndInterrogationId(String collectionInstrumentId, String interrogationId);

RawDataIdentifiersDto findRawResponseIdentifiersByCollectionInstrumentId(
String collectionInstrumentId
);

void updateProcessDates(String collectionInstrumentId, Set<String> interrogationIds);
List<String> getUnprocessedCollectionIds();
Set<String> findUnprocessedInterrogationIdsByCollectionInstrumentId(String collectionInstrumentId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -302,7 +302,6 @@ public long countContexts() {
return dataProcessingContextPersistancePort.count();
}

//TODO get context by collectionInstrumentId
@Override
public DataProcessingContextModel getContext(String interrogationId) throws GenesisException {
List<SurveyUnitModel> surveyUnitModels = surveyUnitPersistencePort.findByInterrogationId(interrogationId);
Expand All @@ -326,7 +325,6 @@ public DataProcessingContextModel getContext(String interrogationId) throws Gene
}

return dataProcessingContextPersistancePort.findByCollectionInstrumentId(collectionInstrumentIds.stream().toList().getFirst());
//TODO if multiple contexts, priorize withReview false
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
package fr.insee.genesis.domain.service.rawdata;

import fr.insee.genesis.controller.dto.rawdata.CombinedRawDataDto;
import fr.insee.genesis.controller.dto.rawdata.RawDataIdentifiersDto;
import fr.insee.genesis.domain.model.surveyunit.rawdata.LunaticJsonRawDataModel;
import fr.insee.genesis.domain.model.surveyunit.rawdata.RawResponseModel;
import fr.insee.genesis.domain.ports.api.CombinedRawDataApiPort;
import fr.insee.genesis.domain.ports.spi.LunaticJsonRawDataPersistencePort;
import fr.insee.genesis.domain.ports.spi.RawResponsePersistencePort;
import fr.insee.genesis.exceptions.NoDataException;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Qualifier;
Expand All @@ -15,8 +18,7 @@
@Service
@Slf4j
@RequiredArgsConstructor
//TODO create API port interface
public class CombinedRawDataService {
public class CombinedRawDataService implements CombinedRawDataApiPort {

@Qualifier("lunaticJsonMongoAdapter")
private final LunaticJsonRawDataPersistencePort lunaticJsonRawDataPersistencePort;
Expand All @@ -37,5 +39,31 @@ public CombinedRawDataDto getCombinedRawDataByInterrogationId(String interrogati
);
}

public RawDataIdentifiersDto getRawDataIdentifiersByCollectionInstrumentId(
String collectionInstrumentId
) throws NoDataException {

RawDataIdentifiersDto rawResult =
rawResponsePersistencePort.findRawResponseIdentifiersByCollectionInstrumentId(
collectionInstrumentId
);

if (rawResult != null) {
return rawResult;
}

RawDataIdentifiersDto lunaticResult =
lunaticJsonRawDataPersistencePort.findLunaticJsonRawDataIdentifiersByQuestionnaireId(
collectionInstrumentId
);

if (lunaticResult != null) {
return lunaticResult;
}

throw new NoDataException(
"No raw data found for collectionInstrumentId=%s".formatted(collectionInstrumentId)
);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import fr.insee.genesis.domain.utils.JsonUtils;
import fr.insee.genesis.exceptions.GenesisError;
import fr.insee.genesis.exceptions.GenesisException;
import fr.insee.genesis.exceptions.NoDataException;
import fr.insee.genesis.infrastructure.utils.FileUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
Expand Down Expand Up @@ -577,6 +578,19 @@ public Page<LunaticJsonRawDataModel> findRawDataByQuestionnaireId(String questio
return lunaticJsonRawDataPersistencePort.findRawDataByQuestionnaireId(questionnaireId, pageable);
}

@Override
public LunaticJsonRawDataModel getLunaticJsonDataByQuestionnaireIdAndInterrogationId(String questionnaireId, String interrogationId) throws NoDataException {

LunaticJsonRawDataModel lunaticJsonRawDataModel = lunaticJsonRawDataPersistencePort.findLunaticJsonDataByQuestionnaireIdAndInterrogationId(questionnaireId, interrogationId);
if(lunaticJsonRawDataModel == null){
throw new NoDataException(
"No lunatic JSON data found for questionnaireId=%s and interrogationId=%s"
.formatted(questionnaireId, interrogationId)
);
}
return lunaticJsonRawDataModel;
}

@Override
public boolean existsByInterrogationId(String interrogationId) {
return lunaticJsonRawDataPersistencePort.existsByInterrogationId(interrogationId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import fr.insee.genesis.domain.utils.JsonUtils;
import fr.insee.genesis.exceptions.GenesisError;
import fr.insee.genesis.exceptions.GenesisException;
import fr.insee.genesis.exceptions.NoDataException;
import fr.insee.genesis.infrastructure.utils.FileUtils;
import fr.insee.modelefiliere.ModeDto;
import fr.insee.modelefiliere.RawResponseDto;
Expand Down Expand Up @@ -81,6 +82,27 @@ public List<RawResponseModel> getRawResponsesByInterrogationID(String interrogat
return rawResponsePersistencePort.findRawResponsesByInterrogationID(interrogationId);
}

@Override
public RawResponseModel getRawResponseByCollectionInstrumentIdAndInterrogationId(
String collectionInstrumentId,
String interrogationId
) throws NoDataException {
RawResponseModel rawResponse = rawResponsePersistencePort
.findRawResponseByCollectionInstrumentIdAndInterrogationId(
collectionInstrumentId,
interrogationId
);

if (rawResponse == null) {
throw new NoDataException(
"No raw response found for collectionInstrumentId=%s and interrogationId=%s"
.formatted(collectionInstrumentId, interrogationId)
);
}

return rawResponse;
}

@Override
public DataProcessResult processRawResponsesByInterrogationIds(String collectionInstrumentId, List<String> interrogationIdList, List<GenesisError> errors) throws GenesisException {
int dataCount=0;
Expand Down
Loading
Loading