diff --git a/pom.xml b/pom.xml index e506a88c..49a4d07c 100644 --- a/pom.xml +++ b/pom.xml @@ -61,6 +61,8 @@ org.gridsuite:loadflow-server 1.44.0 + + 2.3.0-SNAPSHOT @@ -146,6 +148,7 @@ org.gridsuite gridsuite-computation + ${gridsuite-computation.version} com.powsybl diff --git a/src/main/java/org/gridsuite/loadflow/server/LoadFlowController.java b/src/main/java/org/gridsuite/loadflow/server/LoadFlowController.java index e6b9c9a2..27a5e057 100644 --- a/src/main/java/org/gridsuite/loadflow/server/LoadFlowController.java +++ b/src/main/java/org/gridsuite/loadflow/server/LoadFlowController.java @@ -128,6 +128,13 @@ public ResponseEntity getStatus(@Parameter(description = "Result return ResponseEntity.ok().body(loadFlowService.getStatus(resultUuid)); } + @PostMapping(value = "/results/statuses", consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE) + @Operation(summary = "Get loadflow statuses from the database") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The loadflow statuses")}) + public ResponseEntity> getStatuses(@Parameter(description = "Result uuids") @RequestBody List resultUuids) { + return ResponseEntity.ok().body(loadFlowService.getStatuses(resultUuids)); + } + @PutMapping(value = "/results/invalidate-status", produces = APPLICATION_JSON_VALUE) @Operation(summary = "Invalidate the loadflow status from the database") @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The loadflow status has been invalidated")}) diff --git a/src/main/java/org/gridsuite/loadflow/server/repositories/GlobalStatusRepository.java b/src/main/java/org/gridsuite/loadflow/server/repositories/GlobalStatusRepository.java index 51d4609c..31791211 100644 --- a/src/main/java/org/gridsuite/loadflow/server/repositories/GlobalStatusRepository.java +++ b/src/main/java/org/gridsuite/loadflow/server/repositories/GlobalStatusRepository.java @@ -17,8 +17,4 @@ */ @Repository public interface GlobalStatusRepository extends JpaRepository { - GlobalStatusEntity findByResultUuid(UUID resultUuid); - - void deleteByResultUuid(UUID resultUuid); - } diff --git a/src/main/java/org/gridsuite/loadflow/server/repositories/ResultRepository.java b/src/main/java/org/gridsuite/loadflow/server/repositories/ResultRepository.java index 898e9d9c..a6e7da8e 100644 --- a/src/main/java/org/gridsuite/loadflow/server/repositories/ResultRepository.java +++ b/src/main/java/org/gridsuite/loadflow/server/repositories/ResultRepository.java @@ -10,7 +10,6 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; -import java.util.Optional; import java.util.UUID; /** @@ -18,7 +17,4 @@ */ @Repository public interface ResultRepository extends JpaRepository { - Optional findByResultUuid(UUID resultUuid); - - void deleteByResultUuid(UUID resultUuid); } diff --git a/src/main/java/org/gridsuite/loadflow/server/service/LoadFlowResultService.java b/src/main/java/org/gridsuite/loadflow/server/service/LoadFlowResultService.java index 8636e095..8adaa7cd 100644 --- a/src/main/java/org/gridsuite/loadflow/server/service/LoadFlowResultService.java +++ b/src/main/java/org/gridsuite/loadflow/server/service/LoadFlowResultService.java @@ -207,13 +207,13 @@ private static ExchangeMapEntryEntity toExchangeMapEntryEntity(UUID resultUuid, @Transactional public void delete(UUID resultUuid) { Objects.requireNonNull(resultUuid); - globalStatusRepository.deleteByResultUuid(resultUuid); - resultRepository.deleteByResultUuid(resultUuid); + globalStatusRepository.deleteById(resultUuid); + resultRepository.deleteById(resultUuid); } public Optional findResults(UUID resultUuid) { Objects.requireNonNull(resultUuid); - return resultRepository.findByResultUuid(resultUuid); + return resultRepository.findById(resultUuid); } @Override @@ -227,8 +227,16 @@ public void deleteAll() { @Transactional(readOnly = true) public LoadFlowStatus findStatus(UUID resultUuid) { Objects.requireNonNull(resultUuid); - GlobalStatusEntity globalEntity = globalStatusRepository.findByResultUuid(resultUuid); - return globalEntity != null ? globalEntity.getStatus() : null; + Optional globalEntity = globalStatusRepository.findById(resultUuid); + return globalEntity.map(GlobalStatusEntity::getStatus).orElse(null); + } + + @Override + @Transactional(readOnly = true) + public Map findStatuses(List resultUuids) { + Objects.requireNonNull(resultUuids); + List globalEntities = globalStatusRepository.findAllById(resultUuids); + return globalEntities.stream().collect(Collectors.toMap(GlobalStatusEntity::getResultUuid, GlobalStatusEntity::getStatus)); } public List findComponentResults(UUID resultUuid, List resourceFilters, Sort sort) { diff --git a/src/test/java/org/gridsuite/loadflow/server/LoadFlowControllerTest.java b/src/test/java/org/gridsuite/loadflow/server/LoadFlowControllerTest.java index 1bc7ff18..b9aa1c83 100644 --- a/src/test/java/org/gridsuite/loadflow/server/LoadFlowControllerTest.java +++ b/src/test/java/org/gridsuite/loadflow/server/LoadFlowControllerTest.java @@ -883,6 +883,39 @@ public void testStatus() { assertEquals(LoadFlowStatus.NOT_DONE, mapper.readValue(result.getResponse().getContentAsString(), LoadFlowStatus.class)); } + @SneakyThrows + @Test + public void testStatuses() { + MvcResult result = mockMvc.perform(post( + "/" + VERSION + "/results/statuses") + .contentType(MediaType.APPLICATION_JSON) + .content(mapper.writeValueAsString(List.of(RESULT_UUID, OTHER_RESULT_UUID)))) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) + .andReturn(); + Map statuses = mapper.readValue(result.getResponse().getContentAsString(), + new TypeReference>() { + }); + assertTrue(statuses.isEmpty()); + + mockMvc.perform(put("/" + VERSION + "/results/invalidate-status?resultUuid=" + RESULT_UUID)) + .andExpect(status().isOk()); + + result = mockMvc.perform(post( + "/" + VERSION + "/results/statuses") + .contentType(MediaType.APPLICATION_JSON) + .content(mapper.writeValueAsString(List.of(RESULT_UUID, OTHER_RESULT_UUID)))) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) + .andReturn(); + statuses = mapper.readValue(result.getResponse().getContentAsString(), + new TypeReference>() { + }); + assertEquals(1, statuses.size()); + assertEquals(LoadFlowStatus.NOT_DONE, statuses.get(RESULT_UUID)); + assertFalse(statuses.containsKey(OTHER_RESULT_UUID)); + } + @SneakyThrows @Test public void runWithReportTest() { @@ -1041,7 +1074,7 @@ public void testCreateRunningStatus() throws Exception { .andExpect(status().isOk()) .andReturn(); assertEquals(LoadFlowStatus.RUNNING, mapper.readValue(result.getResponse().getContentAsString(), LoadFlowStatus.class)); - assertEquals(LoadFlowStatus.RUNNING, globalStatusRepository.findByResultUuid(resultUuid).getStatus()); + assertEquals(LoadFlowStatus.RUNNING, globalStatusRepository.findById(resultUuid).get().getStatus()); } @Test