From f3b2c4ea2095bafbe789a7109408f7ae3e46abc0 Mon Sep 17 00:00:00 2001 From: Anis Touri Date: Thu, 2 May 2024 17:24:47 +0200 Subject: [PATCH] Refactor duplication endpoint (#85) * Refactor duplication endpoint --------- Signed-off-by: TOURI ANIS --- .../explore/server/ExploreController.java | 106 +++++++----------- .../explore/server/services/CaseService.java | 5 +- .../services/ContingencyListService.java | 24 ++-- .../server/services/DirectoryService.java | 18 +++ .../server/services/ExploreService.java | 68 +++++------ .../server/services/FilterService.java | 12 +- .../services/NetworkModificationService.java | 19 +--- .../server/services/ParametersService.java | 8 +- .../explore/server/services/StudyService.java | 10 +- .../gridsuite/explore/server/ExploreTest.java | 64 ++++++++--- 10 files changed, 172 insertions(+), 162 deletions(-) diff --git a/src/main/java/org/gridsuite/explore/server/ExploreController.java b/src/main/java/org/gridsuite/explore/server/ExploreController.java index 302bdfee..81d63b19 100644 --- a/src/main/java/org/gridsuite/explore/server/ExploreController.java +++ b/src/main/java/org/gridsuite/explore/server/ExploreController.java @@ -35,7 +35,7 @@ public class ExploreController { // /!\ This query parameter is used by the gateway to control access private static final String QUERY_PARAM_PARENT_DIRECTORY_ID = "parentDirectoryUuid"; - private static final String QUERY_PARAM_PARAMETERS_TYPE = "type"; + private static final String QUERY_PARAM_TYPE = "type"; private final ExploreService exploreService; private final DirectoryService directoryService; @@ -61,15 +61,13 @@ public ResponseEntity createStudy(@PathVariable("studyName") String studyN return ResponseEntity.ok().build(); } - @PostMapping(value = "/explore/studies") + @PostMapping(value = "/explore/studies", params = "duplicateFrom") @Operation(summary = "Duplicate a study") @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Study creation request delegated to study server")}) - public ResponseEntity duplicateStudy(@RequestParam("duplicateFrom") UUID sourceStudyUuid, - @RequestParam("studyName") String studyName, - @RequestParam("description") String description, - @RequestParam(QUERY_PARAM_PARENT_DIRECTORY_ID) UUID parentDirectoryUuid, + public ResponseEntity duplicateStudy(@RequestParam("duplicateFrom") UUID studyId, + @RequestParam(name = QUERY_PARAM_PARENT_DIRECTORY_ID, required = false) UUID targetDirectoryId, @RequestHeader("userId") String userId) { - exploreService.duplicateStudy(sourceStudyUuid, studyName, description, userId, parentDirectoryUuid); + exploreService.duplicateStudy(studyId, targetDirectoryId, userId); return ResponseEntity.ok().build(); } @@ -85,15 +83,14 @@ public ResponseEntity createCase(@PathVariable("caseName") String caseName return ResponseEntity.ok().build(); } - @PostMapping(value = "/explore/cases") + @PostMapping(value = "/explore/cases", params = "duplicateFrom") @Operation(summary = "Duplicate a case") @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Case duplication request delegated to case server")}) - public ResponseEntity duplicateCase(@RequestParam("duplicateFrom") UUID parentCaseUuid, - @RequestParam("caseName") String caseName, - @RequestParam("description") String description, - @RequestParam(QUERY_PARAM_PARENT_DIRECTORY_ID) UUID parentDirectoryUuid, - @RequestHeader("userId") String userId) { - exploreService.duplicateCase(caseName, description, userId, parentCaseUuid, parentDirectoryUuid); + public ResponseEntity duplicateCase( + @RequestParam("duplicateFrom") UUID caseId, + @RequestParam(name = QUERY_PARAM_PARENT_DIRECTORY_ID, required = false) UUID targetDirectoryId, + @RequestHeader("userId") String userId) { + exploreService.duplicateCase(caseId, targetDirectoryId, userId); return ResponseEntity.ok().build(); } @@ -109,15 +106,15 @@ public ResponseEntity createScriptContingencyList(@PathVariable("listName" return ResponseEntity.ok().build(); } - @PostMapping(value = "/explore/script-contingency-lists") - @Operation(summary = "Duplicate a script contingency list") - @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Script contingency list has been created")}) - public ResponseEntity duplicateScriptContingencyList(@RequestParam("duplicateFrom") UUID parentListId, - @RequestParam("listName") String listName, - @RequestParam("description") String description, - @RequestParam(QUERY_PARAM_PARENT_DIRECTORY_ID) UUID parentDirectoryUuid, - @RequestHeader("userId") String userId) { - exploreService.duplicateScriptContingencyList(parentListId, listName, description, userId, parentDirectoryUuid); + @PostMapping(value = "/explore/contingency-lists", params = "duplicateFrom") + @Operation(summary = "Duplicate a contingency list") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Contingency list has been created")}) + public ResponseEntity duplicateContingencyList( + @RequestParam("duplicateFrom") UUID contingencyListUuid, + @RequestParam(name = QUERY_PARAM_TYPE) ContingencyListType contingencyListType, + @RequestParam(name = QUERY_PARAM_PARENT_DIRECTORY_ID, required = false) UUID targetDirectoryId, + @RequestHeader("userId") String userId) { + exploreService.duplicateContingencyList(contingencyListUuid, targetDirectoryId, userId, contingencyListType); return ResponseEntity.ok().build(); } @@ -133,18 +130,6 @@ public ResponseEntity createFormContingencyList(@PathVariable("listName") return ResponseEntity.ok().build(); } - @PostMapping(value = "/explore/form-contingency-lists") - @Operation(summary = "Duplicate a form contingency list") - @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Form contingency list has been created")}) - public ResponseEntity duplicateFormContingencyList(@RequestParam("duplicateFrom") UUID parentListId, - @RequestParam("listName") String listName, - @RequestParam("description") String description, - @RequestParam(QUERY_PARAM_PARENT_DIRECTORY_ID) UUID parentDirectoryUuid, - @RequestHeader("userId") String userId) { - exploreService.duplicateFormContingencyList(parentListId, listName, description, userId, parentDirectoryUuid); - return ResponseEntity.ok().build(); - } - @PostMapping(value = "/explore/form-contingency-lists/{id}/new-script/{scriptName}") @Operation(summary = "Create a new script contingency list from a form contingency list") @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The script contingency list have been created successfully")}) @@ -177,18 +162,6 @@ public ResponseEntity createIdentifierContingencyList(@PathVariable("listN return ResponseEntity.ok().build(); } - @PostMapping(value = "/explore/identifier-contingency-lists") - @Operation(summary = "Duplicate a identifier contingency list") - @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Identifier contingency list has been created")}) - public ResponseEntity duplicateIdentifierContingencyList(@RequestParam("duplicateFrom") UUID parentListId, - @RequestParam("listName") String listName, - @RequestParam("description") String description, - @RequestParam(QUERY_PARAM_PARENT_DIRECTORY_ID) UUID parentDirectoryUuid, - @RequestHeader("userId") String userId) { - exploreService.duplicateIdentifierContingencyList(parentListId, listName, 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")}) @@ -201,15 +174,14 @@ public ResponseEntity createFilter(@RequestBody String filter, return ResponseEntity.ok().build(); } - @PostMapping(value = "/explore/filters") + @PostMapping(value = "/explore/filters", params = "duplicateFrom") @Operation(summary = "Duplicate a filter") @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The script has been created successfully")}) - public ResponseEntity duplicateFilter(@RequestParam("duplicateFrom") UUID parentFilterId, - @RequestParam("name") String filterName, - @RequestParam("description") String description, - @RequestParam(QUERY_PARAM_PARENT_DIRECTORY_ID) UUID parentDirectoryUuid, + public ResponseEntity duplicateFilter( + @RequestParam("duplicateFrom") UUID filterId, + @RequestParam(name = QUERY_PARAM_PARENT_DIRECTORY_ID, required = false) UUID targetDirectoryId, @RequestHeader("userId") String userId) { - exploreService.duplicateFilter(filterName, description, parentFilterId, parentDirectoryUuid, userId); + exploreService.duplicateFilter(filterId, targetDirectoryId, userId); return ResponseEntity.ok().build(); } @@ -288,7 +260,7 @@ public ResponseEntity updateContingencyList( @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "parameters creation request delegated to corresponding server")}) public ResponseEntity createParameters(@RequestBody String parameters, @RequestParam("name") String parametersName, - @RequestParam(name = QUERY_PARAM_PARAMETERS_TYPE, defaultValue = "") ParametersType parametersType, + @RequestParam(name = QUERY_PARAM_TYPE, defaultValue = "") ParametersType parametersType, @RequestParam(QUERY_PARAM_PARENT_DIRECTORY_ID) UUID parentDirectoryUuid, @RequestHeader("userId") String userId) { exploreService.createParameters(parameters, parametersType, parametersName, parentDirectoryUuid, userId); @@ -300,23 +272,21 @@ public ResponseEntity createParameters(@RequestBody String parameters, @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "parameters have been successfully modified")}) public ResponseEntity updateParameters(@PathVariable UUID id, @RequestBody String parameters, - @RequestParam(name = QUERY_PARAM_PARAMETERS_TYPE, defaultValue = "") ParametersType parametersType, + @RequestParam(name = QUERY_PARAM_TYPE, defaultValue = "") ParametersType parametersType, @RequestHeader("userId") String userId, @RequestParam("name") String name) { exploreService.updateParameters(id, parameters, parametersType, userId, name); return ResponseEntity.ok().build(); } - @PostMapping(value = "/explore/parameters") + @PostMapping(value = "/explore/parameters", params = "duplicateFrom") @Operation(summary = "Duplicate parameters") @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "parameters have been successfully duplicated")}) - public ResponseEntity duplicateParameters(@RequestParam("duplicateFrom") UUID parentParameterId, - @RequestParam("name") String parametersName, - @RequestParam(name = QUERY_PARAM_PARAMETERS_TYPE, defaultValue = "") ParametersType parametersType, - @RequestParam(name = "description", required = false, defaultValue = "") String description, - @RequestParam(QUERY_PARAM_PARENT_DIRECTORY_ID) UUID parentDirectoryUuid, - @RequestHeader("userId") String userId) { - exploreService.duplicateParameters(parentParameterId, parametersType, parametersName, description, parentDirectoryUuid, userId); + public ResponseEntity duplicateParameters(@RequestParam("duplicateFrom") UUID parametersId, + @RequestParam(name = QUERY_PARAM_PARENT_DIRECTORY_ID, required = false) UUID targetDirectoryId, + @RequestParam(name = QUERY_PARAM_TYPE) ParametersType parametersType, + @RequestHeader("userId") String userId) { + exploreService.duplicateParameters(parametersId, targetDirectoryId, parametersType, userId); return ResponseEntity.ok().build(); } @@ -329,4 +299,14 @@ public ResponseEntity createNetworkModifications(@RequestBody List duplicateNetworkModifications(@RequestParam("duplicateFrom") UUID networkModificationId, + @RequestParam(name = QUERY_PARAM_PARENT_DIRECTORY_ID, required = false) UUID targetDirectoryId, + @RequestHeader("userId") String userId) { + exploreService.duplicateNetworkModifications(networkModificationId, targetDirectoryId, userId); + return ResponseEntity.ok().build(); + } } diff --git a/src/main/java/org/gridsuite/explore/server/services/CaseService.java b/src/main/java/org/gridsuite/explore/server/services/CaseService.java index 49a123d8..4568ee82 100644 --- a/src/main/java/org/gridsuite/explore/server/services/CaseService.java +++ b/src/main/java/org/gridsuite/explore/server/services/CaseService.java @@ -78,9 +78,10 @@ UUID importCase(MultipartFile multipartFile) { return caseUuid; } - UUID duplicateCase(UUID sourceCaseUuid) { + UUID duplicateCase(UUID caseId) { String path = UriComponentsBuilder.fromPath(DELIMITER + CASE_SERVER_API_VERSION + "/cases") - .queryParam("duplicateFrom", sourceCaseUuid) + .queryParam("duplicateFrom", caseId) + .buildAndExpand() .toUriString(); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); 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 746ede0d..58500a46 100644 --- a/src/main/java/org/gridsuite/explore/server/services/ContingencyListService.java +++ b/src/main/java/org/gridsuite/explore/server/services/ContingencyListService.java @@ -61,12 +61,12 @@ public void insertScriptContingencyList(UUID id, String content) { restTemplate.exchange(actionsServerBaseUri + path, HttpMethod.POST, httpEntity, Void.class); } - public void insertScriptContingencyList(UUID sourceListId, UUID id) { + public UUID duplicateScriptContingencyList(UUID scriptContingencyListsId) { String path = UriComponentsBuilder.fromPath(DELIMITER + ACTIONS_API_VERSION + "/script-contingency-lists") - .queryParam(HEADER_DUPLICATE_FROM, sourceListId) - .queryParam("id", id) + .queryParam(HEADER_DUPLICATE_FROM, scriptContingencyListsId) + .buildAndExpand() .toUriString(); - restTemplate.exchange(actionsServerBaseUri + path, HttpMethod.POST, null, Void.class); + return restTemplate.exchange(actionsServerBaseUri + path, HttpMethod.POST, null, UUID.class).getBody(); } public void insertFormContingencyList(UUID id, String content) { @@ -89,20 +89,20 @@ public void insertIdentifierContingencyList(UUID id, String content) { restTemplate.exchange(actionsServerBaseUri + path, HttpMethod.POST, httpEntity, Void.class); } - public void insertFormContingencyList(UUID sourceListId, UUID id) { + public UUID duplicateFormContingencyList(UUID formContingencyListsId) { String path = UriComponentsBuilder.fromPath(DELIMITER + ACTIONS_API_VERSION + "/form-contingency-lists") - .queryParam(HEADER_DUPLICATE_FROM, sourceListId) - .queryParam("id", id) + .queryParam(HEADER_DUPLICATE_FROM, formContingencyListsId) + .buildAndExpand() .toUriString(); - restTemplate.exchange(actionsServerBaseUri + path, HttpMethod.POST, null, Void.class); + return restTemplate.exchange(actionsServerBaseUri + path, HttpMethod.POST, null, UUID.class).getBody(); } - public void insertIdentifierContingencyList(UUID sourceListId, UUID id) { + public UUID duplicateIdentifierContingencyList(UUID identifierContingencyListsId) { String path = UriComponentsBuilder.fromPath(DELIMITER + ACTIONS_API_VERSION + "/identifier-contingency-lists") - .queryParam(HEADER_DUPLICATE_FROM, sourceListId) - .queryParam("id", id) + .queryParam(HEADER_DUPLICATE_FROM, identifierContingencyListsId) + .buildAndExpand() .toUriString(); - restTemplate.exchange(actionsServerBaseUri + path, HttpMethod.POST, null, Void.class); + return restTemplate.exchange(actionsServerBaseUri + path, HttpMethod.POST, null, UUID.class).getBody(); } public void newScriptFromFormContingencyList(UUID id, UUID newId) { diff --git a/src/main/java/org/gridsuite/explore/server/services/DirectoryService.java b/src/main/java/org/gridsuite/explore/server/services/DirectoryService.java index 262e9048..0523968c 100644 --- a/src/main/java/org/gridsuite/explore/server/services/DirectoryService.java +++ b/src/main/java/org/gridsuite/explore/server/services/DirectoryService.java @@ -87,6 +87,24 @@ public ElementAttributes createElementWithNewName(ElementAttributes elementAttri .getBody(); } + public ElementAttributes duplicateElement(UUID elementUuid, UUID newElementUuid, UUID targetDirectoryId, String userId) { + UriComponentsBuilder uri = UriComponentsBuilder + .fromPath(ELEMENTS_SERVER_ROOT_PATH) + .queryParam("duplicateFrom", elementUuid) + .queryParam("newElementUuid", newElementUuid); + if (targetDirectoryId != null) { + uri.queryParam("targetDirectoryId", targetDirectoryId); + } + String path = uri.buildAndExpand() + .toUriString(); + HttpHeaders headers = new HttpHeaders(); + headers.add(HEADER_USER_ID, userId); + headers.setContentType(MediaType.APPLICATION_JSON); + return restTemplate + .exchange(directoryServerBaseUri + path, HttpMethod.POST, new HttpEntity<>(headers), ElementAttributes.class) + .getBody(); + } + public void deleteDirectoryElement(UUID elementUuid, String userId) { String path = UriComponentsBuilder .fromPath(ELEMENTS_SERVER_ROOT_PATH + "/{elementUuid}") 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 e6b9b051..f2137a37 100644 --- a/src/main/java/org/gridsuite/explore/server/services/ExploreService.java +++ b/src/main/java/org/gridsuite/explore/server/services/ExploreService.java @@ -72,11 +72,9 @@ public void createStudy(String studyName, CaseInfo caseInfo, String description, directoryService.createElement(elementAttributes, parentDirectoryUuid, userId); } - public void duplicateStudy(UUID sourceStudyUuid, String studyName, String description, String userId, UUID parentDirectoryUuid) { - ElementAttributes elementAttributes = new ElementAttributes(UUID.randomUUID(), studyName, STUDY, - null, userId, 0L, description); - studyService.duplicateStudy(sourceStudyUuid, elementAttributes.getElementUuid(), userId); - directoryService.createElement(elementAttributes, parentDirectoryUuid, userId); + public void duplicateStudy(UUID sourceStudyUuid, UUID targetDirectoryId, String userId) { + UUID newStudyId = studyService.duplicateStudy(sourceStudyUuid, userId); + directoryService.duplicateElement(sourceStudyUuid, newStudyId, targetDirectoryId, userId); } public void createCase(String caseName, MultipartFile caseFile, String description, String userId, UUID parentDirectoryUuid) { @@ -85,10 +83,9 @@ public void createCase(String caseName, MultipartFile caseFile, String descripti parentDirectoryUuid, userId); } - public void duplicateCase(String caseName, String description, String userId, UUID sourceCaseUuid, UUID parentDirectoryUuid) { - UUID uuid = caseService.duplicateCase(sourceCaseUuid); - directoryService.createElement(new ElementAttributes(uuid, caseName, CASE, - null, userId, 0L, description), parentDirectoryUuid, userId); + public void duplicateCase(UUID sourceCaseUuid, UUID targetDirectoryId, String userId) { + UUID newCaseId = caseService.duplicateCase(sourceCaseUuid); + directoryService.duplicateElement(sourceCaseUuid, newCaseId, targetDirectoryId, userId); } public void createScriptContingencyList(String listName, String content, String description, String userId, UUID parentDirectoryUuid) { @@ -98,11 +95,13 @@ public void createScriptContingencyList(String listName, String content, String directoryService.createElement(elementAttributes, parentDirectoryUuid, userId); } - public void duplicateScriptContingencyList(UUID sourceListId, String listName, String description, String userId, UUID parentDirectoryUuid) { - ElementAttributes elementAttributes = new ElementAttributes(UUID.randomUUID(), listName, CONTINGENCY_LIST, - null, userId, 0L, description); - contingencyListService.insertScriptContingencyList(sourceListId, elementAttributes.getElementUuid()); - directoryService.createElement(elementAttributes, parentDirectoryUuid, userId); + public void duplicateContingencyList(UUID contingencyListsId, UUID targetDirectoryId, String userId, ContingencyListType contingencyListType) { + UUID newId = switch (contingencyListType) { + case SCRIPT -> contingencyListService.duplicateScriptContingencyList(contingencyListsId); + case FORM -> contingencyListService.duplicateFormContingencyList(contingencyListsId); + case IDENTIFIERS -> contingencyListService.duplicateIdentifierContingencyList(contingencyListsId); + }; + directoryService.duplicateElement(contingencyListsId, newId, targetDirectoryId, userId); } public void createFormContingencyList(String listName, String content, String description, String userId, UUID parentDirectoryUuid) { @@ -112,20 +111,6 @@ public void createFormContingencyList(String listName, String content, String de directoryService.createElement(elementAttributes, parentDirectoryUuid, userId); } - public void duplicateFormContingencyList(UUID sourceListId, String listName, String description, String userId, UUID parentDirectoryUuid) { - ElementAttributes elementAttributes = new ElementAttributes(UUID.randomUUID(), listName, CONTINGENCY_LIST, - null, userId, 0L, description); - contingencyListService.insertFormContingencyList(sourceListId, elementAttributes.getElementUuid()); - directoryService.createElement(elementAttributes, parentDirectoryUuid, userId); - } - - public void duplicateIdentifierContingencyList(UUID sourceListId, String listName, String description, String userId, UUID parentDirectoryUuid) { - ElementAttributes elementAttributes = new ElementAttributes(UUID.randomUUID(), listName, CONTINGENCY_LIST, - null, userId, 0L, description); - contingencyListService.insertIdentifierContingencyList(sourceListId, elementAttributes.getElementUuid()); - directoryService.createElement(elementAttributes, parentDirectoryUuid, userId); - } - public void newScriptFromFormContingencyList(UUID id, String scriptName, String userId, UUID parentDirectoryUuid) { ElementAttributes elementAttribute = directoryService.getElementInfos(id); if (!elementAttribute.getType().equals(CONTINGENCY_LIST)) { @@ -163,11 +148,9 @@ public void createFilter(String filter, String filterName, String description, U directoryService.createElement(elementAttributes, parentDirectoryUuid, userId); } - public void duplicateFilter(String filterName, String description, UUID sourceFilterUuid, UUID parentDirectoryUuid, String userId) { - ElementAttributes elementAttributes = new ElementAttributes(UUID.randomUUID(), filterName, FILTER, - null, userId, 0, description); - filterService.insertFilter(sourceFilterUuid, elementAttributes.getElementUuid(), userId); - directoryService.createElement(elementAttributes, parentDirectoryUuid, userId); + public void duplicateFilter(UUID sourceFilterId, UUID targetDirectoryId, String userId) { + UUID newFilterId = filterService.duplicateFilter(sourceFilterId); + directoryService.duplicateElement(sourceFilterId, newFilterId, targetDirectoryId, userId); } public void newScriptFromFilter(UUID filterId, String scriptName, String userId, UUID parentDirectoryUuid) { @@ -259,11 +242,9 @@ public void updateParameters(UUID id, String parameters, ParametersType paramete updateElementName(id, name, userId); } - public void duplicateParameters(UUID parentParameterId, ParametersType parametersType, String parametersName, String description, UUID parentDirectoryUuid, String userId) { - UUID parametersUuid = parametersService.createParameters(parentParameterId, parametersType); - ElementAttributes elementAttributes = new ElementAttributes(parametersUuid, parametersName, parametersType.name(), - null, userId, 0L, description); - directoryService.createElement(elementAttributes, parentDirectoryUuid, userId); + public void duplicateParameters(UUID sourceId, UUID targetDirectoryId, ParametersType parametersType, String userId) { + UUID newParametersUuid = parametersService.duplicateParameters(sourceId, parametersType); + directoryService.duplicateElement(sourceId, newParametersUuid, targetDirectoryId, userId); } public void createNetworkModifications(List modificationAttributesList, String userId, UUID parentDirectoryUuid) { @@ -272,7 +253,7 @@ public void createNetworkModifications(List modificationAttri .toList(); // create all duplicated modifications - Map newModificationsUuids = networkModificationService.createModifications(existingModificationsUuids); + Map newModificationsUuids = networkModificationService.duplicateModifications(existingModificationsUuids); // create all corresponding directory elements modificationAttributesList.forEach(m -> { @@ -285,4 +266,13 @@ public void createNetworkModifications(List modificationAttri } }); } + + public void duplicateNetworkModifications(UUID sourceId, UUID parentDirectoryUuid, String userId) { + // create duplicated modification + Map newModificationsUuids = networkModificationService.duplicateModifications(List.of(sourceId)); + UUID newNetworkModification = newModificationsUuids.get(sourceId); + // create corresponding directory element + directoryService.duplicateElement(sourceId, newNetworkModification, parentDirectoryUuid, userId); + } + } diff --git a/src/main/java/org/gridsuite/explore/server/services/FilterService.java b/src/main/java/org/gridsuite/explore/server/services/FilterService.java index c1e9dc86..31619cd9 100644 --- a/src/main/java/org/gridsuite/explore/server/services/FilterService.java +++ b/src/main/java/org/gridsuite/explore/server/services/FilterService.java @@ -79,13 +79,15 @@ public void insertFilter(String filter, UUID filterId, String userId) { restTemplate.exchange(filterServerBaseUri + path, HttpMethod.POST, httpEntity, Void.class); } - public void insertFilter(UUID sourceFilterId, UUID filterId, String userId) { + public UUID duplicateFilter(UUID filterId) { String path = UriComponentsBuilder.fromPath(DELIMITER + FILTER_SERVER_API_VERSION + "/filters") - .queryParam("duplicateFrom", sourceFilterId) - .queryParam("id", filterId) + .queryParam("duplicateFrom", filterId) + .buildAndExpand() .toUriString(); - restTemplate.exchange(filterServerBaseUri + path, HttpMethod.POST, new HttpEntity<>(getHeaders(userId)), - Void.class); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + return restTemplate.exchange(filterServerBaseUri + path, HttpMethod.POST, new HttpEntity<>(headers), + UUID.class).getBody(); } @Override diff --git a/src/main/java/org/gridsuite/explore/server/services/NetworkModificationService.java b/src/main/java/org/gridsuite/explore/server/services/NetworkModificationService.java index 209615d5..069f5c90 100644 --- a/src/main/java/org/gridsuite/explore/server/services/NetworkModificationService.java +++ b/src/main/java/org/gridsuite/explore/server/services/NetworkModificationService.java @@ -6,8 +6,6 @@ */ package org.gridsuite.explore.server.services; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.HttpEntity; @@ -18,7 +16,6 @@ import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; -import java.io.UncheckedIOException; import java.util.List; import java.util.Map; import java.util.UUID; @@ -36,32 +33,24 @@ public class NetworkModificationService implements IDirectoryElementsService { private static final String NETWORK_MODIFICATIONS_PATH = "network-modifications"; private String networkModificationServerBaseUri; private final RestTemplate restTemplate; - private final ObjectMapper objectMapper; @Autowired - public NetworkModificationService(RestTemplate restTemplate, RemoteServicesProperties remoteServicesProperties, ObjectMapper objectMapper) { + public NetworkModificationService(RestTemplate restTemplate, RemoteServicesProperties remoteServicesProperties) { this.networkModificationServerBaseUri = remoteServicesProperties.getServiceUri("network-modification-server"); this.restTemplate = restTemplate; - this.objectMapper = objectMapper; } public void setNetworkModificationServerBaseUri(String networkModificationServerBaseUri) { this.networkModificationServerBaseUri = networkModificationServerBaseUri; } - public Map createModifications(List modificationUuids) { - String path = UriComponentsBuilder.fromPath(DELIMITER + NETWORK_MODIFICATION_API_VERSION + DELIMITER + NETWORK_MODIFICATIONS_PATH + "/duplicate") + public Map duplicateModifications(List modificationUuids) { + String path = UriComponentsBuilder.fromPath(DELIMITER + NETWORK_MODIFICATION_API_VERSION + DELIMITER + NETWORK_MODIFICATIONS_PATH) .buildAndExpand() .toUriString(); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); - HttpEntity httpEntity; - try { - httpEntity = new HttpEntity<>(objectMapper.writeValueAsString(modificationUuids), headers); - } catch (JsonProcessingException e) { - throw new UncheckedIOException(e); - } - return restTemplate.exchange(networkModificationServerBaseUri + path, HttpMethod.POST, httpEntity, new ParameterizedTypeReference>() { }) + return restTemplate.exchange(networkModificationServerBaseUri + path, HttpMethod.POST, new HttpEntity<>(modificationUuids, headers), new ParameterizedTypeReference>() { }) .getBody(); } diff --git a/src/main/java/org/gridsuite/explore/server/services/ParametersService.java b/src/main/java/org/gridsuite/explore/server/services/ParametersService.java index 213d2bd1..f2ce123f 100644 --- a/src/main/java/org/gridsuite/explore/server/services/ParametersService.java +++ b/src/main/java/org/gridsuite/explore/server/services/ParametersService.java @@ -28,7 +28,7 @@ public class ParametersService implements IDirectoryElementsService { private static final String DELIMITER = "/"; private static final String HEADER_USER_ID = "userId"; - private static final String HEADER_DUPLICATE_FROM = "duplicateFrom"; + private static final String DUPLICATE_FROM_PARAMETER = "duplicateFrom"; private final RestTemplate restTemplate; @@ -86,12 +86,12 @@ public void updateParameters(UUID parametersUuid, String parameters, ParametersT restTemplate.exchange(parametersServerBaseUri + path, HttpMethod.PUT, httpEntity, UUID.class); } - public UUID createParameters(UUID sourceParametersUuid, ParametersType parametersType) { + public UUID duplicateParameters(UUID sourceParametersUuid, ParametersType parametersType) { String parametersServerBaseUri = remoteServicesProperties.getServiceUri(genericParametersServices.get(parametersType)); Objects.requireNonNull(sourceParametersUuid); - String urlParams = parametersType == ParametersType.VOLTAGE_INIT_PARAMETERS ? "?" + HEADER_DUPLICATE_FROM + "=" + sourceParametersUuid : "/" + sourceParametersUuid; var path = UriComponentsBuilder - .fromPath(DELIMITER + SERVER_API_VERSION + "/parameters" + urlParams) + .fromPath(DELIMITER + SERVER_API_VERSION + "/parameters") + .queryParam(DUPLICATE_FROM_PARAMETER, sourceParametersUuid) .buildAndExpand() .toUriString(); HttpHeaders headers = new HttpHeaders(); diff --git a/src/main/java/org/gridsuite/explore/server/services/StudyService.java b/src/main/java/org/gridsuite/explore/server/services/StudyService.java index 9736f86e..9816bc18 100644 --- a/src/main/java/org/gridsuite/explore/server/services/StudyService.java +++ b/src/main/java/org/gridsuite/explore/server/services/StudyService.java @@ -54,14 +54,14 @@ public void insertStudyWithExistingCaseFile(UUID studyUuid, String userId, UUID restTemplate.exchange(studyServerBaseUri + path, HttpMethod.POST, request, Void.class); } - public void duplicateStudy(UUID sourceStudyUuid, UUID studyUuid, String userId) { + public UUID duplicateStudy(UUID studyId, String userId) { String path = UriComponentsBuilder.fromPath(DELIMITER + STUDY_SERVER_API_VERSION + "/studies") - .queryParam("duplicateFrom", sourceStudyUuid) - .queryParam("studyUuid", studyUuid) + .queryParam("duplicateFrom", studyId) + .buildAndExpand(studyId) .toUriString(); - restTemplate.exchange(studyServerBaseUri + path, HttpMethod.POST, new HttpEntity<>(getHeaders(userId)), - Void.class); + return restTemplate.exchange(studyServerBaseUri + path, HttpMethod.POST, new HttpEntity<>(getHeaders(userId)), + UUID.class).getBody(); } @Override diff --git a/src/test/java/org/gridsuite/explore/server/ExploreTest.java b/src/test/java/org/gridsuite/explore/server/ExploreTest.java index 2f35f0b5..5903c4f2 100644 --- a/src/test/java/org/gridsuite/explore/server/ExploreTest.java +++ b/src/test/java/org/gridsuite/explore/server/ExploreTest.java @@ -72,6 +72,13 @@ public class ExploreTest { private static final UUID INVALID_ELEMENT_UUID = UUID.randomUUID(); private static final UUID PARAMETERS_UUID = UUID.randomUUID(); private static final UUID MODIFICATION_UUID = UUID.randomUUID(); + private static final UUID STUDY_COPY_UUID = UUID.randomUUID(); + private static final UUID CASE_COPY_UUID = UUID.randomUUID(); + private static final UUID CONTINGENCY_LIST_COPY_UUID = UUID.randomUUID(); + private static final UUID FILTER_COPY_UUID = UUID.randomUUID(); + private static final UUID MODIFICATION_COPY_UUID = UUID.randomUUID(); + private static final UUID PARAMETER_COPY_UUID = UUID.randomUUID(); + private static final UUID ELEMENT_COPY_UUID = UUID.randomUUID(); private static final String STUDY_ERROR_NAME = "studyInError"; private static final String STUDY1 = "study1"; private static final String CASE1 = "case1"; @@ -140,8 +147,13 @@ public void setup() throws IOException { String caseInfosAttributesAsString = mapper.writeValueAsString(List.of(caseSpecificMetadata)); String modificationElementAttributesAsString = mapper.writeValueAsString(new ElementAttributes(MODIFICATION_UUID, "one modif", "MODIFICATION", new AccessRightsAttributes(true), USER1, 0L, null)); String modificationInfosAttributesAsString = mapper.writeValueAsString(List.of(modificationSpecificMetadata)); - String modificationIdsAsString = mapper.writeValueAsString(Map.of(MODIFICATION_UUID, MODIFICATION_UUID)); - + String modificationIdsAsString = mapper.writeValueAsString(Map.of(MODIFICATION_UUID, MODIFICATION_COPY_UUID)); + String newStudyUuidAsString = mapper.writeValueAsString(STUDY_COPY_UUID); + String newCaseUuidAsString = mapper.writeValueAsString(CASE_COPY_UUID); + String newContingencyUuidAsString = mapper.writeValueAsString(CONTINGENCY_LIST_COPY_UUID); + String newFilterUuidAsString = mapper.writeValueAsString(FILTER_COPY_UUID); + String newParametersUuidAsString = mapper.writeValueAsString(PARAMETER_COPY_UUID); + String newElementUuidAsString = mapper.writeValueAsString(ELEMENT_COPY_UUID); final Dispatcher dispatcher = new Dispatcher() { @SneakyThrows @Override @@ -151,6 +163,9 @@ public MockResponse dispatch(RecordedRequest request) { if (path.matches("/v1/studies/cases/" + NON_EXISTING_CASE_UUID + ".*") && "POST".equals(request.getMethod())) { return new MockResponse().setResponseCode(404); + } else if (path.matches("/v1/studies\\?duplicateFrom=" + PUBLIC_STUDY_UUID + ".*") && "POST".equals(request.getMethod())) { + return new MockResponse().setBody(newStudyUuidAsString).setResponseCode(200) + .addHeader("Content-Type", "application/json; charset=utf-8"); } else if (path.matches("/v1/studies.*") && "POST".equals(request.getMethod())) { String bodyStr = body.readUtf8(); if (bodyStr.contains("filename=\"" + TEST_FILE_WITH_ERRORS + "\"")) { // import file with errors @@ -158,6 +173,9 @@ public MockResponse dispatch(RecordedRequest request) { } else { return new MockResponse().setResponseCode(200); } + } else if (path.matches("/v1/cases\\?duplicateFrom=" + CASE_UUID + ".*") && "POST".equals(request.getMethod())) { + return new MockResponse().setBody(newCaseUuidAsString).setResponseCode(200) + .addHeader("Content-Type", "application/json; charset=utf-8"); } else if (path.matches("/v1/cases.*") && "POST".equals(request.getMethod())) { String bodyStr = body.readUtf8(); if (bodyStr.contains("filename=\"" + TEST_FILE_WITH_ERRORS + "\"")) { // import file with errors @@ -219,11 +237,17 @@ public MockResponse dispatch(RecordedRequest request) { return new MockResponse().setBody(listElementsAttributesAsString).setResponseCode(200) .addHeader("Content-Type", "application/json; charset=utf-8"); } else if (path.matches("/v1/elements/.*") && "PUT".equals(request.getMethod())) { + return new MockResponse().setBody(newElementUuidAsString).setResponseCode(200) + .addHeader("Content-Type", "application/json; charset=utf-8"); + } else if (path.matches("/v1/elements\\?duplicateFrom=.*&newElementUuid=.*") && "POST".equals(request.getMethod())) { return new MockResponse().setResponseCode(200) .addHeader("Content-Type", "application/json; charset=utf-8"); } else if (path.matches("/v1/contingency-lists/metadata[?]ids=" + CONTINGENCY_LIST_UUID) && "GET".equals(request.getMethod())) { return new MockResponse().setBody(listOfFormContingencyListAttributesAsString.replace("elementUuid", "id")).setResponseCode(200) .addHeader("Content-Type", "application/json; charset=utf-8"); + } else if (path.matches("/v1/.*contingency-lists\\?duplicateFrom=" + CONTINGENCY_LIST_UUID) && "POST".equals(request.getMethod())) { + return new MockResponse().setBody(newContingencyUuidAsString).setResponseCode(200) + .addHeader("Content-Type", "application/json; charset=utf-8"); } else if (path.matches("/v1/script-contingency-lists\\?id=" + PARENT_DIRECTORY_WITH_ERROR_UUID) && "POST".equals(request.getMethod())) { return new MockResponse().setResponseCode(500); } else if (path.matches("/v1/script-contingency-lists.*") && "POST".equals(request.getMethod())) { @@ -236,6 +260,9 @@ public MockResponse dispatch(RecordedRequest request) { return new MockResponse().setResponseCode(200); } else if (path.matches("/v1/filters/.*/new-script.*") && "POST".equals(request.getMethod())) { return new MockResponse().setResponseCode(200); + } else if (path.matches("/v1/filters\\?duplicateFrom=" + FILTER_UUID) && "POST".equals(request.getMethod())) { + return new MockResponse().setBody(newFilterUuidAsString).setResponseCode(200) + .addHeader("Content-Type", "application/json; charset=utf-8"); } else if (path.matches("/v1/filters.*") && "POST".equals(request.getMethod())) { return new MockResponse().setResponseCode(200); } else if (path.matches("/v1/filters\\?id=.*") && "POST".equals(request.getMethod())) { @@ -250,9 +277,12 @@ public MockResponse dispatch(RecordedRequest request) { return new MockResponse().setResponseCode(200); } else if (path.matches("/v1/identifier-contingency-lists/.*") && "PUT".equals(request.getMethod())) { return new MockResponse().setResponseCode(200); + } else if (path.matches("/v1/parameters\\?duplicateFrom=" + PARAMETERS_UUID) && "POST".equals(request.getMethod())) { + return new MockResponse().setBody(newParametersUuidAsString).setResponseCode(200) + .addHeader("Content-Type", "application/json; charset=utf-8"); } else if (path.matches("/v1/parameters.*")) { return new MockResponse().setResponseCode(200); - } else if (path.matches("/v1/network-modifications/duplicate")) { + } else if (path.matches("/v1/network-modifications")) { return new MockResponse().setBody(modificationIdsAsString).setResponseCode(200).addHeader("Content-Type", "application/json; charset=utf-8"); } else if ("GET".equals(request.getMethod())) { if (path.matches("/v1/elements/" + INVALID_ELEMENT_UUID)) { @@ -522,54 +552,54 @@ public void testGetElementsMetadata() throws Exception { @Test public void testDuplicateCase() throws Exception { - mockMvc.perform(post("/v1/explore/cases?duplicateFrom={parentCaseUuid}&caseName={caseName}&description={description}&parentDirectoryUuid={parentDirectoryUuid}", - CASE_UUID, CASE1, "description", PARENT_DIRECTORY_UUID).header("userId", USER1)) + mockMvc.perform(post("/v1/explore/cases?duplicateFrom={caseUuid}&parentDirectoryUuid={parentDirectoryUuid}", + CASE_UUID, PARENT_DIRECTORY_UUID).header("userId", USER1)) .andExpect(status().isOk()); } @Test public void testDuplicateFilter() throws Exception { - mockMvc.perform(post("/v1/explore/filters?duplicateFrom={parentFilterId}&name={filterName}&description={description}&parentDirectoryUuid={parentDirectoryUuid}", - FILTER_UUID, FILTER1, "description", PARENT_DIRECTORY_UUID) + mockMvc.perform(post("/v1/explore/filters?duplicateFrom={filterUuid}&parentDirectoryUuid={parentDirectoryUuid}", + FILTER_UUID, PARENT_DIRECTORY_UUID) .header("userId", USER1)).andExpect(status().isOk()); } @Test public void testDuplicateScriptContingencyList() throws Exception { - mockMvc.perform(post("/v1/explore/script-contingency-lists?duplicateFrom={parentListId}&listName={listName}&description={description}&parentDirectoryUuid={parentDirectoryUuid}", - CONTINGENCY_LIST_UUID, STUDY1, "description", PARENT_DIRECTORY_UUID) + mockMvc.perform(post("/v1/explore/contingency-lists?duplicateFrom={scriptContingencyListUuid}&type={contingencyListsType}&parentDirectoryUuid={parentDirectoryUuid}", + CONTINGENCY_LIST_UUID, ContingencyListType.SCRIPT, PARENT_DIRECTORY_UUID) .header("userId", USER1)) .andExpect(status().isOk()); } @Test public void testDuplicateFormContingencyList() throws Exception { - mockMvc.perform(post("/v1/explore/form-contingency-lists?duplicateFrom={parentListId}&listName={listName}&description={description}&parentDirectoryUuid={parentDirectoryUuid}", - CONTINGENCY_LIST_UUID, STUDY1, "description", PARENT_DIRECTORY_UUID) + mockMvc.perform(post("/v1/explore/contingency-lists?duplicateFrom={formContingencyListUuid}&type={contingencyListsType}&parentDirectoryUuid={parentDirectoryUuid}", + CONTINGENCY_LIST_UUID, ContingencyListType.FORM, PARENT_DIRECTORY_UUID) .header("userId", USER1) ).andExpect(status().isOk()); } @Test public void testDuplicateIdentifierContingencyList() throws Exception { - mockMvc.perform(post("/v1/explore/identifier-contingency-lists?duplicateFrom={parentListId}&listName={listName}&description={description}&parentDirectoryUuid={parentDirectoryUuid}", - CONTINGENCY_LIST_UUID, STUDY1, "description", PARENT_DIRECTORY_UUID) + mockMvc.perform(post("/v1/explore/contingency-lists?duplicateFrom={identifierContingencyListUuid}&type={contingencyListsType}&parentDirectoryUuid={parentDirectoryUuid}", + CONTINGENCY_LIST_UUID, ContingencyListType.IDENTIFIERS, PARENT_DIRECTORY_UUID) .header("userId", USER1) ).andExpect(status().isOk()); } @Test public void testDuplicateStudy() throws Exception { - mockMvc.perform(post("/v1/explore/studies?duplicateFrom={parentStudyUuid}&studyName={studyName}&description={description}&parentDirectoryUuid={parentDirectoryUuid}", - PUBLIC_STUDY_UUID, STUDY1, "description", PARENT_DIRECTORY_UUID) + mockMvc.perform(post("/v1/explore/studies?duplicateFrom={studyUuid}&parentDirectoryUuid={parentDirectoryUuid}", + PUBLIC_STUDY_UUID, PARENT_DIRECTORY_UUID) .header("userId", USER1) ).andExpect(status().isOk()); } @Test public void testDuplicateParameters() throws Exception { - mockMvc.perform(post("/v1/explore/parameters?duplicateFrom={parentParametersId}&name={parametersName}&type={type}&description={description}&parentDirectoryUuid={parentDirectoryUuid}", - PARAMETERS_UUID, STUDY1, ParametersType.VOLTAGE_INIT_PARAMETERS, "description", PARENT_DIRECTORY_UUID) + mockMvc.perform(post("/v1/explore/parameters?duplicateFrom={parameterUuid}&type={type}&parentDirectoryUuid={parentDirectoryUuid}", + PARAMETERS_UUID, ParametersType.LOADFLOW_PARAMETERS, PARENT_DIRECTORY_UUID) .header("userId", USER1)) .andExpect(status().isOk()); }