Skip to content
Merged
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 @@ -147,6 +147,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 @@ -71,6 +71,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 @@ -87,6 +97,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();
}

@Override
public List<Map<String, Object>> getMetadata(List<UUID> contingencyListsUuids) {
var ids = contingencyListsUuids.stream().map(UUID::toString).collect(Collectors.joining(","));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@ public void duplicateContingencyList(UUID contingencyListsId, UUID targetDirecto
UUID newId = switch (contingencyListType) {
case FORM -> contingencyListService.duplicateFormContingencyList(contingencyListsId);
case IDENTIFIERS -> contingencyListService.duplicateIdentifierContingencyList(contingencyListsId);
case FILTERS -> contingencyListService.duplicateFilterBasedContingencyList(contingencyListsId);
};
directoryService.duplicateElement(contingencyListsId, newId, targetDirectoryId, userId);
}
Expand All @@ -132,6 +133,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 @@ -212,6 +219,7 @@ private String getProperPath(ContingencyListType contingencyListType) {
return switch (contingencyListType) {
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 @@ -11,5 +11,6 @@
*/
public enum ContingencyListType {
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 @@ -314,6 +314,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 @@ -526,6 +528,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 testCreateFilter() throws Exception {
mockMvc.perform(post("/v1/explore/filters?name={name}&type={type}&parentDirectoryUuid={parentDirectoryUuid}&description={description}",
Expand Down Expand Up @@ -726,6 +738,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 @@ -840,6 +872,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