Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
10 changes: 4 additions & 6 deletions .github/workflows/create-release.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ jobs:
java-version: '25'

- name: install model filiere
run: mvn install:install-file -Dfile="$(pwd)/libs/modelefiliere-2.2.2-springboot4.jar" -DgroupId=fr.insee -DartifactId=modelefiliere -Dversion=2.2.2-springboot4 -Dpackaging=jar -DgeneratePom=true
run: mvn install:install-file -Dfile="$(pwd)/libs/modelefiliere-2.1.0.jar" -DgroupId=fr.insee -DartifactId=modelefiliere -Dversion=2.1.0 -Dpackaging=jar -DgeneratePom=true

- name: Clone BPM
uses: actions/checkout@v6
Expand All @@ -86,10 +86,8 @@ jobs:
cd ..

- uses: actions/checkout@v6
- name: Build app
run: |
git fetch origin main
git checkout origin/main
- name: Build app
run:
mvn package --no-transfer-progress

- name: Upload app jar
Expand Down Expand Up @@ -182,4 +180,4 @@ jobs:
password: ${{ secrets.DOCKERHUB_TOKEN }}
default_branch: ${{ github.ref }}
tags: ${{ needs.check-version.outputs.release-tag }}
workdir: .
workdir: .
2 changes: 1 addition & 1 deletion .github/workflows/docker.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ jobs:
java-version: "25"

- name: install model filiere
run: mvn install:install-file -Dfile="$(pwd)/libs/modelefiliere-2.2.2-springboot4.jar" -DgroupId=fr.insee -DartifactId=modelefiliere -Dversion=2.2.2-springboot4 -Dpackaging=jar -DgeneratePom=true
run: mvn install:install-file -Dfile="$(pwd)/libs/modelefiliere-2.1.0.jar" -DgroupId=fr.insee -DartifactId=modelefiliere -Dversion=2.1.0 -Dpackaging=jar -DgeneratePom=true

- name: Clone BPM
uses: actions/checkout@master
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/maven.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ jobs:
cache: maven

- name: install model filiere
run: mvn install:install-file -Dfile="$(pwd)/libs/modelefiliere-2.2.2-springboot4.jar" -DgroupId=fr.insee -DartifactId=modelefiliere -Dversion=2.2.2-springboot4 -Dpackaging=jar -DgeneratePom=true
run: mvn install:install-file -Dfile="$(pwd)/libs/modelefiliere-2.1.0.jar" -DgroupId=fr.insee -DartifactId=modelefiliere -Dversion=2.1.0 -Dpackaging=jar -DgeneratePom=true

- name: Clone BPM
uses: actions/checkout@master
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/scheduled-version-update.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ jobs:

- name: install model filiere
run: |
mvn install:install-file -Dfile="$(pwd)/genesis/libs/modelefiliere-2.2.2-springboot4.jar" -DgroupId=fr.insee -DartifactId=modelefiliere -Dversion=2.2.2-springboot4 -Dpackaging=jar -DgeneratePom=true
mvn install:install-file -Dfile="$(pwd)/genesis/libs/modelefiliere-2.1.0.jar" -DgroupId=fr.insee -DartifactId=modelefiliere -Dversion=2.1.0 -Dpackaging=jar -DgeneratePom=true

- name: Clone BPM
uses: actions/checkout@master
Expand Down
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@ src/bin/

# Package Files #
*.jar
!libs/*.jar
*.war
*.nar
*.ear
Expand Down
8 changes: 0 additions & 8 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,4 @@
# Changelog
## 2.7.0 [2026-06-18]
### Changed
- spring-boot 3.5.14 -> 4.0.6

## 2.6.10 [2026-06-18]
### Fixed
- Aligned the conversion logic for multi-iteration variables with single-value variables during collectedVariables creation to avoid unexpected xxx.0 values for INTEGER variables.

## 2.6.9 [2026-06-11]
### Fixed
- Delete only expired V2 schedules from dataProcessingContext
Expand Down
Binary file added libs/modelefiliere-2.1.0.jar
Binary file not shown.
Binary file removed libs/modelefiliere-2.2.2-springboot4.jar
Binary file not shown.
25 changes: 9 additions & 16 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@
<modelVersion>4.0.0</modelVersion>
<groupId>fr.insee.genesis</groupId>
<artifactId>genesis-api</artifactId>
<version>2.7.0</version>
<version>2.6.9</version>
<packaging>jar</packaging>
<name>genesis-api</name>

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>4.0.6</version>
<version>3.5.14</version>
</parent>

<properties>
Expand All @@ -20,12 +20,14 @@
<!-- (!!!) Dependency versions temporary overwritten for security reasons -->
<tomcat.version>10.1.55</tomcat.version>
<commons-lang3.version>3.20.0</commons-lang3.version>
<junit-jupiter.version>5.13.4</junit-jupiter.version>
<jackson-bom.version>2.21.1</jackson-bom.version>

<!-- Dependency versions not managed by Spring -->
<bpm.version>1.2.0</bpm.version>
<springdoc.version>3.0.3</springdoc.version>
<springdoc.version>2.8.17</springdoc.version>
<mapstruct.version>1.6.3</mapstruct.version>
<pitest.version>1.25.5</pitest.version>
<pitest.version>1.25.3</pitest.version>
<pitest.junit.version>1.2.3</pitest.junit.version>

<!-- Sonar properties -->
Expand Down Expand Up @@ -73,19 +75,10 @@
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webmvc-test</artifactId>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- AssertJ -->
<!-- https://www.baeldung.com/introduction-to-assertj -->
<!-- https://mvnrepository.com/artifact/org.assertj/assertj-core -->
Expand Down Expand Up @@ -113,7 +106,7 @@
<dependency>
<groupId>fr.insee</groupId>
<artifactId>modelefiliere</artifactId>
<version>2.2.2-springboot4</version>
<version>2.1.0</version>
</dependency>
<!-- XML libraries -->
<!-- XML-XSLT with Saxon -->
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,12 @@
package fr.insee.genesis.controller.dto;

import fr.insee.genesis.domain.model.surveyunit.Mode;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

@Builder
@NoArgsConstructor
@AllArgsConstructor
@Data
public class SurveyUnitInputDto {
private String questionnaireId;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package fr.insee.genesis.controller.rest;

import tools.jackson.core.JacksonException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import fr.insee.genesis.domain.model.lunaticmodel.LunaticModelModel;
import fr.insee.genesis.domain.ports.api.LunaticModelApiPort;
import fr.insee.genesis.exceptions.GenesisException;
Expand All @@ -14,7 +15,6 @@
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import tools.jackson.databind.json.JsonMapper;

import java.util.Map;

Expand Down Expand Up @@ -45,12 +45,10 @@ public ResponseEntity<String> saveRawResponsesFromJsonBody(
@PreAuthorize("hasRole('READER')")
public ResponseEntity<String> getLunaticModelFromQuestionnaireId(
@RequestParam("questionnaireId") String questionnaireId
) throws JacksonException, GenesisException {
) throws JsonProcessingException, GenesisException {

LunaticModelModel lunaticModelModel = lunaticModelApiPort.get(questionnaireId);
JsonMapper objectMapper = JsonMapper.builder()
.findAndAddModules()
.build();
ObjectMapper objectMapper = new ObjectMapper().findAndRegisterModules();
return ResponseEntity.ok(objectMapper.writeValueAsString(lunaticModelModel.lunaticModel()));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import fr.insee.genesis.controller.dto.InterrogationBatchResponse;
import fr.insee.genesis.controller.rest.CommonApiResponse;
import fr.insee.genesis.controller.utils.DateTimeUtils;
import fr.insee.genesis.domain.model.surveyunit.InterrogationId;
import fr.insee.genesis.domain.model.surveyunit.InterrogationInfo;
import fr.insee.genesis.domain.ports.api.SurveyUnitApiPort;
Expand Down Expand Up @@ -61,14 +62,27 @@ public ResponseEntity<InterrogationBatchResponse> getAllInterrogationIdsByQuesti
)
@RequestParam(value = "since", required = false)
Instant since,
@RequestParam(value = "localSinceDate", required = false)
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
@Parameter(description = "Filter interrogations to those recorded strictly after the given timestamp (Europe/Paris timezone)",
schema = @Schema(type = "string", format = "date-time", example = "2026-02-02T01:00:00"))
LocalDateTime localSinceDate,
@RequestParam(value = "until", required = false)
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
@Parameter(
description = "Filter interrogations to those recorded before the given timestamp or at the same time (ISO-8601 UTC format).",
schema = @Schema(type = "string", format = "date-time", example = "2026-01-31T23:59:59Z")
)
Instant until) {
List<InterrogationInfo> idsInfo = surveyUnitService.searchInterrogations(collectionInstrumentId, since, until);
Instant until,
@RequestParam(value = "localUntilDate", required = false)
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
@Parameter(description = "Filter interrogations to those recorded before the given timestamp or at the same time (Europe/Paris timezone)",
schema = @Schema(type = "string", format = "date-time", example = "2026-04-02T01:00:00"))
LocalDateTime localUntilDate) {

Instant resolvedSinceDate = DateTimeUtils.resolveInstant(since, localSinceDate);
Instant resolvedEndDate = DateTimeUtils.resolveInstant(until, localUntilDate);
List<InterrogationInfo> idsInfo = surveyUnitService.searchInterrogations(collectionInstrumentId, resolvedSinceDate, resolvedEndDate);
InterrogationBatchResponse response = buildInterrogationBatchResponse(idsInfo);
return ResponseEntity.ok(response);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package fr.insee.genesis.controller.rest.responses;

import fr.insee.genesis.controller.dto.rawdata.LunaticJsonRawDataUnprocessedDto;
import fr.insee.genesis.controller.utils.DateTimeUtils;
import fr.insee.genesis.domain.model.surveyunit.Mode;
import fr.insee.genesis.domain.model.surveyunit.rawdata.DataProcessResult;
import fr.insee.genesis.domain.model.surveyunit.rawdata.LunaticJsonRawDataModel;
Expand All @@ -14,6 +15,7 @@
import fr.insee.modelefiliere.RawResponseDto;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
Expand Down Expand Up @@ -199,15 +201,44 @@ public ResponseEntity<Map<String, List<String>>> getProcessedDataIdsSinceHours(
@PreAuthorize("hasRole('USER_BATCH_GENERIC')")
public ResponseEntity<PagedModel<LunaticJsonRawDataModel>> getLunaticJsonRawDataModelFromJsonBody(
@PathVariable String campaignId,
@RequestParam(value = "startDate", required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) Instant startDate,
@RequestParam(value = "endDate", required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) Instant endDate,
@RequestParam(value = "startDate", required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
@Parameter(description = "Start date in UTC", example = "2026-02-02T00:00:00Z")
Instant startDate,
@RequestParam(value = "localStartDate", required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
@Parameter(description = "Extract since in Europe/Paris timezone", schema = @Schema(type = "string", format = "date-time", example = "2026-02-02T01:00:00"))
LocalDateTime localStartDate,
@RequestParam(value = "endDate", required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
@Parameter(description = "End date in UTC", example = "2026-02-02T00:00:00Z")
Instant endDate,
@RequestParam(value = "localEndDate", required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
@Parameter(description = "Extract until in Europe/Paris timezone", schema = @Schema(type = "string", format = "date-time", example = "2026-02-02T01:00:00"))
LocalDateTime localEndDate,
@RequestParam(value = "page", defaultValue = "0") int page,
@RequestParam(value = "size", defaultValue = "1000") int size
) {
log.info("Try to read raw JSONs for campaign {}, with startDate={} and endDate={} - page={} - size={}", campaignId, startDate, endDate,page,size);
Instant resolvedStartDate = DateTimeUtils.resolveInstant(startDate, localStartDate);
Instant resolvedEndDate = DateTimeUtils.resolveInstant(endDate, localEndDate);
log.info(
"Try to read raw JSONs for campaign {} with startDateUtc={} startDateLocal={} endDateUtc={} endDateLocal={} - page={} - size={}",
campaignId,
resolvedStartDate,
DateTimeUtils.toFranceDateTime(resolvedStartDate),
resolvedEndDate,
DateTimeUtils.toFranceDateTime(resolvedEndDate),
page,
size
);
Pageable pageable = PageRequest.of(page, size);
Page<LunaticJsonRawDataModel> rawResponses = lunaticJsonRawDataApiPort.findRawDataByCampaignIdAndDate(campaignId, startDate, endDate, pageable);
log.info("rawResponses, lunatic-json for campaign {}, with startDate={} and endDate={} ={}", campaignId, startDate, endDate,rawResponses.getContent().size());
Page<LunaticJsonRawDataModel> rawResponses = lunaticJsonRawDataApiPort.findRawDataByCampaignIdAndDate(campaignId, resolvedStartDate, resolvedEndDate, pageable);
log.info(
"rawResponses, lunatic-json for campaign {} with startDateUtc={} startDateLocal={} endDateUtc={} endDateLocal={} count={}",
campaignId,
resolvedStartDate,
DateTimeUtils.toFranceDateTime(resolvedStartDate),
resolvedEndDate,
DateTimeUtils.toFranceDateTime(resolvedEndDate),
rawResponses.getContent().size()
);
return ResponseEntity.status(HttpStatus.OK).body(new PagedModel<>(rawResponses));
}

Expand Down Expand Up @@ -256,15 +287,41 @@ public ResponseEntity<Void> existsLunaticJsonByInterrogationId(@PathVariable Str
@PreAuthorize("hasRole('USER_BATCH_GENERIC')")
public ResponseEntity<PagedModel<RawResponseModel>> getRawResponsesFromJsonBody(
@PathVariable String campaignId,
@RequestParam(value = "startDate", required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) Instant startDate,
@RequestParam(value = "endDate", required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) Instant endDate,
@RequestParam(value = "startDate", required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
@Parameter(description = "Start date in UTC", example = "2026-02-02T00:00:00Z")
Instant startDate,
@RequestParam(value = "localStartDate", required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
@Parameter(description = "Extract since in Europe/Paris timezone", schema = @Schema(type = "string", format = "date-time", example = "2026-02-02T01:00:00"))
LocalDateTime localStartDate,
@RequestParam(value = "endDate", required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
@Parameter(description = "End date in UTC", example = "2026-04-02T00:00:00Z")
Instant endDate,
@RequestParam(value = "localEndDate", required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
@Parameter(description = "Extract until in Europe/Paris timezone", schema = @Schema(type = "string", format = "date-time", example = "2026-02-02T01:00:00"))
LocalDateTime localEndDate,
@RequestParam(value = "page", defaultValue = "0") int page,
@RequestParam(value = "size", defaultValue = "1000") int size
) {
log.info("Try to read raw lunatic JSONs for campaign {}, with startDate={} and endDate={} - page={} - size={}", campaignId, startDate, endDate,page,size);
Instant resolvedStartDate = DateTimeUtils.resolveInstant(startDate, localStartDate);
Instant resolvedEndDate = DateTimeUtils.resolveInstant(endDate, localEndDate);
log.info("Try to read raw JSONs for campaign {} with startDateUtc={} startDateLocal={} endDateUtc={} endDateLocal={} - page={} - size={}",
campaignId,
resolvedStartDate,
DateTimeUtils.toFranceDateTime(resolvedStartDate),
resolvedEndDate,
DateTimeUtils.toFranceDateTime(resolvedEndDate),
page,
size
);
Pageable pageable = PageRequest.of(page, size);
Page<RawResponseModel> rawResponses = rawResponseApiPort.findRawResponseDataByCampaignIdAndDate(campaignId, startDate, endDate, pageable);
log.info("rawResponses for campaign {}, with startDate={} and endDate={} ={}",campaignId, startDate, endDate, rawResponses.getContent().size());
Page<RawResponseModel> rawResponses = rawResponseApiPort.findRawResponseDataByCampaignIdAndDate(campaignId, resolvedStartDate, resolvedEndDate, pageable);
log.info("rawResponses for campaign {},with startDateUtc={} startDateLocal={} endDateUtc={} endDateLocal={} count={}",
campaignId,
resolvedStartDate,
DateTimeUtils.toFranceDateTime(resolvedStartDate),
resolvedEndDate,
DateTimeUtils.toFranceDateTime(resolvedEndDate),
rawResponses.getContent().size());
return ResponseEntity.status(HttpStatus.OK).body(new PagedModel<>(rawResponses));
}

Expand Down
Loading
Loading