diff --git a/CHANGELOG.md b/CHANGELOG.md index cc7a7a0b..35b00f23 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,6 @@ # Changelog +## 1.12.0 [TODO] +- Get review indicator endpoint ## 1.11.0 [2025-10-20] ### Added diff --git a/src/main/java/fr/insee/genesis/controller/rest/DataProcessingContextController.java b/src/main/java/fr/insee/genesis/controller/rest/DataProcessingContextController.java index a176588f..2411d169 100644 --- a/src/main/java/fr/insee/genesis/controller/rest/DataProcessingContextController.java +++ b/src/main/java/fr/insee/genesis/controller/rest/DataProcessingContextController.java @@ -46,11 +46,11 @@ public class DataProcessingContextController { @Operation(summary = "Create or update a data processing context") @PutMapping(path = "/review") - @PreAuthorize("hasAnyRole('USER_BACK_OFFICE','SCHEDULER')") + @PreAuthorize("hasAnyRole('USER_PLATINE', 'USER_BACK_OFFICE', 'SCHEDULER')") public ResponseEntity saveContext( @Parameter(description = "Identifier of the partition", required = true) @RequestParam("partitionId") String partitionId, @Parameter(description = "Allow reviewing") @RequestParam(value = "withReview", defaultValue = "false") Boolean withReview - ) { + ){ try { withReview = withReview != null && withReview; //False if null dataProcessingContextApiPort.saveContext(partitionId, withReview); @@ -60,6 +60,20 @@ public ResponseEntity saveContext( return ResponseEntity.ok().build(); } + @Operation(summary = "Returns partition review indicator") + @GetMapping(path = "/review") + @PreAuthorize("hasAnyRole('USER_BACK_OFFICE','SCHEDULER','USER_PLATINE')") + public ResponseEntity getReviewIndicator( + @Parameter(description = "Identifier of the partition", required = true) @RequestParam("partitionId") String partitionId + ){ + try { + boolean withReview = dataProcessingContextApiPort.getReviewByPartitionId(partitionId); + return ResponseEntity.ok(withReview); + }catch (GenesisException e){ + return new ResponseEntity<>(e.getMessage(), HttpStatusCode.valueOf(e.getStatus())); + } + } + @Operation(summary = "Schedule a Kraftwerk execution") @PutMapping(path = "/schedules") @PreAuthorize("hasRole('USER_KRAFTWERK')") diff --git a/src/main/java/fr/insee/genesis/domain/ports/api/DataProcessingContextApiPort.java b/src/main/java/fr/insee/genesis/domain/ports/api/DataProcessingContextApiPort.java index 0e08b153..f26ad129 100644 --- a/src/main/java/fr/insee/genesis/domain/ports/api/DataProcessingContextApiPort.java +++ b/src/main/java/fr/insee/genesis/domain/ports/api/DataProcessingContextApiPort.java @@ -33,4 +33,11 @@ void saveKraftwerkExecutionSchedule(String partitionId, DataProcessingContextModel getContext(String interrogationId) throws GenesisException; DataProcessingContextModel getContextByPartitionId(String partitionId) throws GenesisException; List getPartitionIds(boolean withReview); + + /** + * Gets the review indicator for a partition + * @param partitionId id of the partition + * @return the review indicator stored in genesis + */ + boolean getReviewByPartitionId(String partitionId) throws GenesisException; } diff --git a/src/main/java/fr/insee/genesis/domain/service/context/DataProcessingContextService.java b/src/main/java/fr/insee/genesis/domain/service/context/DataProcessingContextService.java index a371bbea..9688a84a 100644 --- a/src/main/java/fr/insee/genesis/domain/service/context/DataProcessingContextService.java +++ b/src/main/java/fr/insee/genesis/domain/service/context/DataProcessingContextService.java @@ -10,6 +10,7 @@ import fr.insee.genesis.domain.ports.spi.DataProcessingContextPersistancePort; import fr.insee.genesis.domain.ports.spi.SurveyUnitPersistencePort; import fr.insee.genesis.exceptions.GenesisException; +import fr.insee.genesis.infrastructure.document.context.DataProcessingContextDocument; import fr.insee.genesis.infrastructure.mappers.DataProcessingContextMapper; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -168,7 +169,7 @@ public DataProcessingContextModel getContext(String interrogationId) throws Gene @Override public DataProcessingContextModel getContextByPartitionId(String partitionId){ - return DataProcessingContextMapper.INSTANCE.documentToModel( + return DataProcessingContextMapper.INSTANCE.documentToModel( dataProcessingContextPersistancePort.findByPartitionId(partitionId) ); } @@ -184,4 +185,16 @@ public List getPartitionIds(boolean withReview){ } return partitionIds; } + + @Override + public boolean getReviewByPartitionId(String partitionId) throws GenesisException { + DataProcessingContextDocument dataProcessingContextDocument = + dataProcessingContextPersistancePort.findByPartitionId(partitionId); + if(dataProcessingContextDocument == null){ + throw new GenesisException(404, "Data processing context not found"); + } + return DataProcessingContextMapper.INSTANCE.documentToModel( + dataProcessingContextPersistancePort.findByPartitionId(partitionId) + ).isWithReview(); + } } diff --git a/src/test/java/fr/insee/genesis/controller/rest/DataProcessingContextControllerTest.java b/src/test/java/fr/insee/genesis/controller/rest/DataProcessingContextControllerTest.java index 3fd6ecb9..606538ef 100644 --- a/src/test/java/fr/insee/genesis/controller/rest/DataProcessingContextControllerTest.java +++ b/src/test/java/fr/insee/genesis/controller/rest/DataProcessingContextControllerTest.java @@ -17,6 +17,8 @@ import org.assertj.core.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; import org.springframework.http.ResponseEntity; import java.io.IOException; @@ -442,6 +444,41 @@ void deleteExpiredScheduleTest_appendLog() throws IOException, GenesisException .toFile()).exists().content().isNotEmpty().contains("2000","2001"); } + @ParameterizedTest + @ValueSource(booleans = {false, true}) + void getReview_test(boolean withReview){ + //GIVEN + String partitionId = "TESTPARTITION"; + dataProcessingContextPersistancePortStub.getMongoStub().add( + new DataProcessingContextDocument( + "TESTPARTITION", + new ArrayList<>(), + withReview + ) + ); + + //WHEN + ResponseEntity response = dataProcessingContextController.getReviewIndicator(partitionId); + + //THEN + Assertions.assertThat(response.getStatusCode().value()).isEqualTo(200); + Assertions.assertThat(response.getBody().getClass()).isEqualTo(Boolean.class); + Assertions.assertThat((Boolean) response.getBody()).isEqualTo(withReview); + } + + @Test + void getReview_no_context_test(){ + //WHEN + ResponseEntity response = dataProcessingContextController.getReviewIndicator( + "TESTPARTITIONIDNOCONTEXT" + ); + + //THEN + Assertions.assertThat(response.getStatusCode().value()).isEqualTo(404); + } + + + //UTILITY private void addNewDocumentToStub() { DataProcessingContextDocument dataProcessingContextDocumentTest = new DataProcessingContextDocument( "TESTSURVEY",