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
13 changes: 13 additions & 0 deletions src/main/java/org/gridsuite/explore/server/ExploreController.java
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,19 @@ public ResponseEntity<Void> 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<Void> 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")})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<String> 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)
Expand All @@ -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}")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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}";
};
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,6 @@ public enum ContingencyListType {

SCRIPT,
FORM,
IDENTIFIERS
IDENTIFIERS,
FILTERS
}
50 changes: 50 additions & 0 deletions src/test/java/org/gridsuite/explore/server/ExploreTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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.*")) {
Expand Down Expand Up @@ -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}",
Expand Down Expand Up @@ -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}",
Expand Down Expand Up @@ -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");
Expand Down