diff --git a/src/main/java/org/gridsuite/explore/server/ExploreController.java b/src/main/java/org/gridsuite/explore/server/ExploreController.java index 4486d48..3052a6f 100644 --- a/src/main/java/org/gridsuite/explore/server/ExploreController.java +++ b/src/main/java/org/gridsuite/explore/server/ExploreController.java @@ -182,6 +182,19 @@ public ResponseEntity createIdentifierContingencyList(@PathVariable("listN return ResponseEntity.ok().build(); } + @PostMapping(value = "/explore/filters-contingency-lists/{listName}") + @Operation(summary = "create a filter based contingency list") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Filter based contingency list has been created")}) + @PreAuthorize("@authorizationService.isAuthorized(#userId, #parentDirectoryUuid, null, T(org.gridsuite.explore.server.dto.PermissionType).WRITE)") + public ResponseEntity createFilterBasedContingencyList(@PathVariable("listName") String listName, + @RequestBody(required = false) String content, + @RequestParam("description") String description, + @RequestParam(QUERY_PARAM_PARENT_DIRECTORY_ID) UUID parentDirectoryUuid, + @RequestHeader(QUERY_PARAM_USER_ID) String userId) { + exploreService.createFilterBasedContingencyList(listName, content, description, userId, parentDirectoryUuid); + return ResponseEntity.ok().build(); + } + @PostMapping(value = "/explore/filters", consumes = MediaType.APPLICATION_JSON_VALUE) @Operation(summary = "create a filter") @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Filter creation request delegated to filter server")}) diff --git a/src/main/java/org/gridsuite/explore/server/services/ContingencyListService.java b/src/main/java/org/gridsuite/explore/server/services/ContingencyListService.java index ae620c6..58624a5 100644 --- a/src/main/java/org/gridsuite/explore/server/services/ContingencyListService.java +++ b/src/main/java/org/gridsuite/explore/server/services/ContingencyListService.java @@ -90,6 +90,16 @@ public void insertIdentifierContingencyList(UUID id, String content) { restTemplate.exchange(actionsServerBaseUri + path, HttpMethod.POST, httpEntity, Void.class); } + public void insertFilterBasedContingencyList(UUID id, String content) { + String path = UriComponentsBuilder.fromPath(DELIMITER + ACTIONS_API_VERSION + "/filters-contingency-lists?id={id}") + .buildAndExpand(id) + .toUriString(); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + HttpEntity httpEntity = new HttpEntity<>(content, headers); + restTemplate.exchange(actionsServerBaseUri + path, HttpMethod.POST, httpEntity, Void.class); + } + public UUID duplicateFormContingencyList(UUID formContingencyListsId) { String path = UriComponentsBuilder.fromPath(DELIMITER + ACTIONS_API_VERSION + "/form-contingency-lists") .queryParam(HEADER_DUPLICATE_FROM, formContingencyListsId) @@ -106,6 +116,14 @@ public UUID duplicateIdentifierContingencyList(UUID identifierContingencyListsId return restTemplate.exchange(actionsServerBaseUri + path, HttpMethod.POST, null, UUID.class).getBody(); } + public UUID duplicateFilterBasedContingencyList(UUID filterContingencyListsId) { + String path = UriComponentsBuilder.fromPath(DELIMITER + ACTIONS_API_VERSION + "/filters-contingency-lists") + .queryParam(HEADER_DUPLICATE_FROM, filterContingencyListsId) + .buildAndExpand() + .toUriString(); + return restTemplate.exchange(actionsServerBaseUri + path, HttpMethod.POST, null, UUID.class).getBody(); + } + public void newScriptFromFormContingencyList(UUID id, UUID newId) { String path = UriComponentsBuilder .fromPath(DELIMITER + ACTIONS_API_VERSION + "/form-contingency-lists/{id}/new-script?newId={newId}") diff --git a/src/main/java/org/gridsuite/explore/server/services/ExploreService.java b/src/main/java/org/gridsuite/explore/server/services/ExploreService.java index a7435c4..a849f4c 100644 --- a/src/main/java/org/gridsuite/explore/server/services/ExploreService.java +++ b/src/main/java/org/gridsuite/explore/server/services/ExploreService.java @@ -123,6 +123,7 @@ public void duplicateContingencyList(UUID contingencyListsId, UUID targetDirecto case SCRIPT -> contingencyListService.duplicateScriptContingencyList(contingencyListsId); case FORM -> contingencyListService.duplicateFormContingencyList(contingencyListsId); case IDENTIFIERS -> contingencyListService.duplicateIdentifierContingencyList(contingencyListsId); + case FILTERS -> contingencyListService.duplicateFilterBasedContingencyList(contingencyListsId); }; directoryService.duplicateElement(contingencyListsId, newId, targetDirectoryId, userId); } @@ -159,6 +160,12 @@ public void createIdentifierContingencyList(String listName, String content, Str directoryService.createElement(elementAttributes, parentDirectoryUuid, userId); } + public void createFilterBasedContingencyList(String listName, String content, String description, String userId, UUID parentDirectoryUuid) { + ElementAttributes elementAttributes = new ElementAttributes(UUID.randomUUID(), listName, CONTINGENCY_LIST, userId, 0L, description); + contingencyListService.insertFilterBasedContingencyList(elementAttributes.getElementUuid(), content); + directoryService.createElement(elementAttributes, parentDirectoryUuid, userId); + } + public void createFilter(String filter, String filterName, String description, UUID parentDirectoryUuid, String userId) { ElementAttributes elementAttributes = new ElementAttributes(UUID.randomUUID(), filterName, FILTER, userId, 0, description); filterService.insertFilter(filter, elementAttributes.getElementUuid(), userId); @@ -263,6 +270,7 @@ private String getProperPath(ContingencyListType contingencyListType) { case SCRIPT -> "/script-contingency-lists/{id}"; case FORM -> "/form-contingency-lists/{id}"; case IDENTIFIERS -> "/identifier-contingency-lists/{id}"; + case FILTERS -> "/filters-contingency-lists/{id}"; }; } diff --git a/src/main/java/org/gridsuite/explore/server/utils/ContingencyListType.java b/src/main/java/org/gridsuite/explore/server/utils/ContingencyListType.java index 6ceb506..a7c92dc 100644 --- a/src/main/java/org/gridsuite/explore/server/utils/ContingencyListType.java +++ b/src/main/java/org/gridsuite/explore/server/utils/ContingencyListType.java @@ -13,5 +13,6 @@ public enum ContingencyListType { SCRIPT, FORM, - IDENTIFIERS + IDENTIFIERS, + FILTERS } diff --git a/src/test/java/org/gridsuite/explore/server/ExploreTest.java b/src/test/java/org/gridsuite/explore/server/ExploreTest.java index 0e201c4..482c2ee 100644 --- a/src/test/java/org/gridsuite/explore/server/ExploreTest.java +++ b/src/test/java/org/gridsuite/explore/server/ExploreTest.java @@ -326,6 +326,8 @@ public MockResponse dispatch(RecordedRequest request) { return new MockResponse(200); } else if (path.matches("/v1/identifier-contingency-lists/.*") && "PUT".equals(request.getMethod())) { return new MockResponse(200); + } else if (path.matches("/v1/filters-contingency-lists/.*") && "PUT".equals(request.getMethod())) { + return new MockResponse(200); } else if (path.matches("/v1/parameters\\?duplicateFrom=" + PARAMETERS_UUID) && "POST".equals(request.getMethod())) { return new MockResponse(200, Headers.of(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE), newParametersUuidAsString); } else if (path.matches("/v1/parameters.*")) { @@ -558,6 +560,16 @@ void testCreateIdentifierContingencyList() throws Exception { ).andExpect(status().isOk()); } + @Test + void testCreateFilterBasedContingencyList() throws Exception { + mockMvc.perform(post("/v1/explore/filters-contingency-lists/{listName}?parentDirectoryUuid={parentDirectoryUuid}&description={description}", + "filterBasedContingencyListName", PARENT_DIRECTORY_UUID, null) + .header("userId", USER1) + .contentType(MediaType.APPLICATION_JSON) + .content("\"Contingency list content\"") + ).andExpect(status().isOk()); + } + @Test void testNewScriptFromFormContingencyList() throws Exception { mockMvc.perform(post("/v1/explore/form-contingency-lists/{id}/new-script/{scriptName}?parentDirectoryUuid={parentDirectoryUuid}", @@ -810,6 +822,26 @@ void testDuplicateIdentifierContingencyListInSameDirectory(final MockWebServer m checkAuthorizationRequestDoneForDuplication(mockWebServer, CONTINGENCY_LIST_UUID, CONTINGENCY_LIST_UUID); } + @Test + void testDuplicateFilterBasedContingencyList(final MockWebServer mockWebServer) throws Exception { + mockMvc.perform(post("/v1/explore/contingency-lists?duplicateFrom={contingencyListUuid}&type={contingencyListsType}&parentDirectoryUuid={parentDirectoryUuid}", + CONTINGENCY_LIST_UUID, ContingencyListType.FILTERS, PARENT_DIRECTORY_UUID) + .header("userId", USER1) + ).andExpect(status().isOk()); + + checkAuthorizationRequestDoneForDuplication(mockWebServer, CONTINGENCY_LIST_UUID, PARENT_DIRECTORY_UUID); + } + + @Test + void testDuplicateFilterBasedContingencyListInSameDirectory(final MockWebServer mockWebServer) throws Exception { + mockMvc.perform(post("/v1/explore/contingency-lists?duplicateFrom={contingencyListUuid}&type={contingencyListsType}", + CONTINGENCY_LIST_UUID, ContingencyListType.FILTERS) + .header("userId", USER1) + ).andExpect(status().isOk()); + + checkAuthorizationRequestDoneForDuplication(mockWebServer, CONTINGENCY_LIST_UUID, CONTINGENCY_LIST_UUID); + } + @Test void testDuplicateStudy(final MockWebServer mockWebServer) throws Exception { mockMvc.perform(post("/v1/explore/studies?duplicateFrom={studyUuid}&parentDirectoryUuid={parentDirectoryUuid}", @@ -942,6 +974,24 @@ void testModifyIdentifierContingencyList(final MockWebServer server) throws Exce verifyFilterOrContingencyUpdateRequests(server, "/v1/identifier-contingency-lists/", USER1); } + @Test + void testModifyFilterContingencyList(final MockWebServer server) throws Exception { + final String filters = "{\"filters\":[{\"id\":\"uuid1\",\"name\":\"TD_Sensi\",\"equipmentType\":\"TWO_WINDINGS_TRANSFORMER\"},{\"id\":\"uuid2\",\"name\":\"Ligne ARGIA\",\"equipmentType\":\"LINE\"}]}"; + final String name = "filter based contingencyList name"; + final String description = "filter based contingencyList description"; + mockMvc.perform(put("/v1/explore/contingency-lists/{id}", + SCRIPT_ID_BASE_FORM_CONTINGENCY_LIST_UUID) + .contentType(APPLICATION_JSON) + .content(filters) + .param("name", name) + .param("contingencyListType", ContingencyListType.FILTERS.name()) + .param("description", description) + .header("userId", USER1) + ).andExpect(status().isOk()); + + verifyFilterOrContingencyUpdateRequests(server, "/v1/filters-contingency-lists/", USER1); + } + private void verifyFilterOrContingencyUpdateRequests(final MockWebServer server, String contingencyOrFilterPath, String user) { var requests = TestUtils.getRequestsWithBodyDone(3, server); assertTrue(requests.stream().anyMatch(r -> r.getPath().contains(contingencyOrFilterPath)), "elementAttributes updated");