From bb758dbdd66c4f987d3ee2c248f7414eaaee5840 Mon Sep 17 00:00:00 2001 From: Etienne LESOT Date: Fri, 11 Sep 2026 16:23:08 +0200 Subject: [PATCH 01/12] extract composite to share description Signed-off-by: Etienne LESOT --- .../study/server/service/NetworkModificationService.java | 4 +++- .../java/org/gridsuite/study/server/service/StudyService.java | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/gridsuite/study/server/service/NetworkModificationService.java b/src/main/java/org/gridsuite/study/server/service/NetworkModificationService.java index 4f75facea..65a80a51a 100644 --- a/src/main/java/org/gridsuite/study/server/service/NetworkModificationService.java +++ b/src/main/java/org/gridsuite/study/server/service/NetworkModificationService.java @@ -52,6 +52,7 @@ public class NetworkModificationService { private static final String NETWORK_MODIFICATIONS_COUNT_PATH = "network-modifications-count"; private static final String QUERY_PARAM_ACTION = "action"; private static final String QUERY_PARAM_NAME = "name"; + private static final String QUERY_PARAM_DESCRIPTION = "description"; private static final String QUERY_PARAM_GROUP_UUID = "groupUuid"; private static final String QUERY_PARAM_ROOT_NETWORK_TAG = "rootNetworkTag"; private static final String QUERY_PARAM_GROUP_UUIDS = "groupUuids"; @@ -506,9 +507,10 @@ public NetworkModificationsResult insertCompositeModifications(UUID groupUuid, * by a reference to it, so that it can be stored as an element in the directory server. The composite modification * keeps its own uuid. */ - public void extractCompositeModificationToShare(@NonNull UUID groupUuid, @NonNull UUID modificationUuid, @NonNull String name) { + public void extractCompositeModificationToShare(@NonNull UUID groupUuid, @NonNull UUID modificationUuid, @NonNull String name, String description) { String path = UriComponentsBuilder.fromPath(COMPOSITE_PATH + "{modificationUuid}" + DELIMITER + "share") .queryParam(QUERY_PARAM_NAME, name) + .queryParam(QUERY_PARAM_DESCRIPTION, description) .queryParam(QUERY_PARAM_GROUP_UUID, groupUuid) .buildAndExpand(modificationUuid) .toUriString(); diff --git a/src/main/java/org/gridsuite/study/server/service/StudyService.java b/src/main/java/org/gridsuite/study/server/service/StudyService.java index 8d9526345..694ad00b9 100644 --- a/src/main/java/org/gridsuite/study/server/service/StudyService.java +++ b/src/main/java/org/gridsuite/study/server/service/StudyService.java @@ -2025,7 +2025,7 @@ public void shareCompositeNetworkModification( List childrenUuids = networkModificationTreeService.getChildrenUuids(nodeUuid); try { // the applied modifications are left unchanged : the node does not need to be rebuilt - networkModificationService.extractCompositeModificationToShare(groupUuid, modificationUuid, name); + networkModificationService.extractCompositeModificationToShare(groupUuid, modificationUuid, name, description); // the composite modification keeps its uuid when extracted, so it is shared under that same uuid directoryService.createElement(parentDirectoryUuid, description, modificationUuid, name, DirectoryService.MODIFICATION, userId); // extraction replaced the local composite by a new reference-modification pointing at modificationUuid From f83c2a35d668cbb70728d6ed248f6cd58e225500 Mon Sep 17 00:00:00 2001 From: Etienne LESOT Date: Thu, 17 Sep 2026 07:33:54 +0200 Subject: [PATCH 02/12] add userId Signed-off-by: Etienne LESOT --- .../study/server/service/NetworkModificationService.java | 3 ++- .../java/org/gridsuite/study/server/service/StudyService.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/gridsuite/study/server/service/NetworkModificationService.java b/src/main/java/org/gridsuite/study/server/service/NetworkModificationService.java index 1536f3813..9df7d587e 100644 --- a/src/main/java/org/gridsuite/study/server/service/NetworkModificationService.java +++ b/src/main/java/org/gridsuite/study/server/service/NetworkModificationService.java @@ -251,13 +251,14 @@ public void stashModifications(UUID groupUUid, List modificationsUuids) { restTemplate.exchange(path, HttpMethod.PUT, httpEntity, Void.class); } - public void updateModificationsMetadata(UUID groupUUid, List modificationsUuids, NetworkModificationMetadata metadata) { + public void updateModificationsMetadata(UUID groupUUid, List modificationsUuids, NetworkModificationMetadata metadata, String userId) { Objects.requireNonNull(groupUUid); Objects.requireNonNull(modificationsUuids); var path = UriComponentsBuilder .fromUriString(getNetworkModificationServerURI(false) + NETWORK_MODIFICATIONS_PATH) .queryParam(UUIDS, modificationsUuids) .queryParam(GROUP_UUID, groupUUid) + .queryParam(HEADER_USER_ID, userId) .buildAndExpand() .toUriString(); diff --git a/src/main/java/org/gridsuite/study/server/service/StudyService.java b/src/main/java/org/gridsuite/study/server/service/StudyService.java index ccd13936f..311f35098 100644 --- a/src/main/java/org/gridsuite/study/server/service/StudyService.java +++ b/src/main/java/org/gridsuite/study/server/service/StudyService.java @@ -1594,7 +1594,7 @@ public void updateNetworkModificationsMetadata(UUID studyUuid, UUID nodeUuid, Li throw new StudyException(NOT_ALLOWED); } UUID groupId = networkModificationTreeService.getModificationGroupUuid(nodeUuid); - networkModificationService.updateModificationsMetadata(groupId, modificationsUuids, metadata); + networkModificationService.updateModificationsMetadata(groupId, modificationsUuids, metadata, userId); if (metadata.getActivated() != null || metadata.getName() != null) { invalidateNodeTree(studyUuid, nodeUuid); } From 5a099e4edbe5de3d8b2ff62b8a5d429686d297d3 Mon Sep 17 00:00:00 2001 From: Etienne LESOT Date: Fri, 25 Sep 2026 09:25:02 +0200 Subject: [PATCH 03/12] review Signed-off-by: Etienne LESOT --- .../study/server/service/NetworkModificationService.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/org/gridsuite/study/server/service/NetworkModificationService.java b/src/main/java/org/gridsuite/study/server/service/NetworkModificationService.java index 184341ae0..9d1fb6ff1 100644 --- a/src/main/java/org/gridsuite/study/server/service/NetworkModificationService.java +++ b/src/main/java/org/gridsuite/study/server/service/NetworkModificationService.java @@ -278,7 +278,6 @@ public void updateModificationsMetadata(UUID groupUUid, List modifications .fromUriString(getNetworkModificationServerURI(false) + NETWORK_MODIFICATIONS_PATH) .queryParam(UUIDS, modificationsUuids) .queryParam(GROUP_UUID, groupUUid) - .queryParam(HEADER_USER_ID, userId) .buildAndExpand() .toUriString(); @@ -535,7 +534,7 @@ public NetworkModificationsResult insertCompositeModifications(UUID groupUuid, public ModificationReference extractCompositeModificationToShare(@NonNull UUID groupUuid, @NonNull UUID modificationUuid, @NonNull String name, String description) { String path = UriComponentsBuilder.fromPath(COMPOSITE_PATH + "{modificationUuid}" + DELIMITER + "share") .queryParam(QUERY_PARAM_NAME, name) - .queryParam(QUERY_PARAM_DESCRIPTION, description) + .queryParam(QUERY_PARAM_DESCRIPTION, URLEncoder.encode(description)) .queryParam(QUERY_PARAM_GROUP_UUID, groupUuid) .buildAndExpand(modificationUuid) .toUriString(); From 283b81c50b69d2c844a82c09cbaa56110500d94b Mon Sep 17 00:00:00 2001 From: Etienne LESOT Date: Mon, 28 Sep 2026 10:12:56 +0200 Subject: [PATCH 04/12] fix encode Signed-off-by: Etienne LESOT --- .../study/server/service/NetworkModificationService.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/gridsuite/study/server/service/NetworkModificationService.java b/src/main/java/org/gridsuite/study/server/service/NetworkModificationService.java index 49b016fda..66e1bc39f 100644 --- a/src/main/java/org/gridsuite/study/server/service/NetworkModificationService.java +++ b/src/main/java/org/gridsuite/study/server/service/NetworkModificationService.java @@ -523,9 +523,10 @@ public NetworkModificationsResult insertCompositeModifications(UUID groupUuid, * or in a parent composite */ public ModificationReference extractCompositeModificationToShare(@NonNull UUID groupUuid, @NonNull UUID modificationUuid, @NonNull String name, String description) { + String path = UriComponentsBuilder.fromPath(COMPOSITE_PATH + "{modificationUuid}" + DELIMITER + "share") .queryParam(QUERY_PARAM_NAME, name) - .queryParam(QUERY_PARAM_DESCRIPTION, URLEncoder.encode(description)) + .queryParam(QUERY_PARAM_DESCRIPTION, description) .queryParam(QUERY_PARAM_GROUP_UUID, groupUuid) .buildAndExpand(modificationUuid) .toUriString(); From 3ec13ac59a22612fed0d5b7b629dda94d0549769 Mon Sep 17 00:00:00 2001 From: Etienne LESOT Date: Mon, 28 Sep 2026 10:34:01 +0200 Subject: [PATCH 05/12] put description in body request Signed-off-by: Etienne LESOT --- .../study/server/service/NetworkModificationService.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/org/gridsuite/study/server/service/NetworkModificationService.java b/src/main/java/org/gridsuite/study/server/service/NetworkModificationService.java index 66e1bc39f..dce6c7984 100644 --- a/src/main/java/org/gridsuite/study/server/service/NetworkModificationService.java +++ b/src/main/java/org/gridsuite/study/server/service/NetworkModificationService.java @@ -526,7 +526,6 @@ public ModificationReference extractCompositeModificationToShare(@NonNull UUID g String path = UriComponentsBuilder.fromPath(COMPOSITE_PATH + "{modificationUuid}" + DELIMITER + "share") .queryParam(QUERY_PARAM_NAME, name) - .queryParam(QUERY_PARAM_DESCRIPTION, description) .queryParam(QUERY_PARAM_GROUP_UUID, groupUuid) .buildAndExpand(modificationUuid) .toUriString(); @@ -534,7 +533,7 @@ public ModificationReference extractCompositeModificationToShare(@NonNull UUID g return restTemplate.exchange( getNetworkModificationServerURI(false) + path, HttpMethod.POST, - null, + new HttpEntity<>(description), ModificationReference.class ).getBody(); } From f49aee0509a5f42a86eb900d36eb89444b685f77 Mon Sep 17 00:00:00 2001 From: Etienne LESOT Date: Mon, 28 Sep 2026 10:44:44 +0200 Subject: [PATCH 06/12] clean Signed-off-by: Etienne LESOT --- .../study/server/service/NetworkModificationService.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/gridsuite/study/server/service/NetworkModificationService.java b/src/main/java/org/gridsuite/study/server/service/NetworkModificationService.java index dce6c7984..ba8d474c0 100644 --- a/src/main/java/org/gridsuite/study/server/service/NetworkModificationService.java +++ b/src/main/java/org/gridsuite/study/server/service/NetworkModificationService.java @@ -51,7 +51,6 @@ public class NetworkModificationService { private static final String NETWORK_MODIFICATIONS_COUNT_PATH = "network-modifications-count"; private static final String QUERY_PARAM_ACTION = "action"; private static final String QUERY_PARAM_NAME = "name"; - private static final String QUERY_PARAM_DESCRIPTION = "description"; private static final String QUERY_PARAM_GROUP_UUID = "groupUuid"; private static final String QUERY_PARAM_ROOT_NETWORK_TAG = "rootNetworkTag"; private static final String QUERY_PARAM_GROUP_UUIDS = "groupUuids"; From 144db76934e1ef62c1d163f660312c8a580de0ae Mon Sep 17 00:00:00 2001 From: Etienne LESOT Date: Thu, 1 Oct 2026 15:00:32 +0200 Subject: [PATCH 07/12] clean Signed-off-by: Etienne LESOT --- .../server/controller/StudyController.java | 14 +++++++++++++ .../service/NetworkModificationService.java | 9 +++++++++ .../server/service/RebuildNodeService.java | 5 +++++ .../study/server/service/StudyService.java | 20 ++++++++++++++++++- 4 files changed, 47 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/gridsuite/study/server/controller/StudyController.java b/src/main/java/org/gridsuite/study/server/controller/StudyController.java index 093d7f7e5..c181c8d2c 100644 --- a/src/main/java/org/gridsuite/study/server/controller/StudyController.java +++ b/src/main/java/org/gridsuite/study/server/controller/StudyController.java @@ -1048,6 +1048,20 @@ public ResponseEntity updateNetworkModificationsMetadata(@Parameter(descri return ResponseEntity.ok().build(); } + @PutMapping(value = "/studies/{studyUuid}/nodes/{nodeUuid}/network-modifications/name-and-description/{uuid}") + @Operation(summary = "Updates the metadata of a network modification") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Update the metadata of a network modification"), @ApiResponse(responseCode = "404", + description = "The study/node is not found")}) + public ResponseEntity updateNetworkModificationsMetadata(@Parameter(description = "Study UUID") @PathVariable("studyUuid") UUID studyUuid, + @Parameter(description = "Node UUID") @PathVariable("nodeUuid") UUID nodeUuid, + @Parameter(description = "modification UUID") @PathVariable("uuid") UUID networkModificationUuid, + @RequestBody NetworkModificationMetadata metadata, + @RequestHeader(HEADER_USER_ID) String userId) { + studyService.assertIsNodeNotReadOnly(nodeUuid); + rebuildNodeService.updateNetworkModificationsNameAndDescription(studyUuid, nodeUuid, networkModificationUuid, userId, metadata); + return ResponseEntity.ok().build(); + } + @PutMapping(value = "/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/network-modifications", params = "applicable") @Operation(summary = "Update the applicability of network modifications for a node on a specific root network") @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Update the applicability of network modifications on a node in a specific root network"), diff --git a/src/main/java/org/gridsuite/study/server/service/NetworkModificationService.java b/src/main/java/org/gridsuite/study/server/service/NetworkModificationService.java index ba8d474c0..9360874e2 100644 --- a/src/main/java/org/gridsuite/study/server/service/NetworkModificationService.java +++ b/src/main/java/org/gridsuite/study/server/service/NetworkModificationService.java @@ -286,6 +286,15 @@ public void updateModificationsMetadata(UUID groupUUid, List modifications restTemplate.exchange(path, HttpMethod.PUT, httpEntity, Void.class); } + public void updateNetworkModificationNameAndDescription(UUID networkModificationUuid, NetworkModificationMetadata metadata, String userId) { + String path = UriComponentsBuilder.fromPath(NETWORK_MODIFICATIONS_PATH + DELIMITER + "name-and-description" + DELIMITER + networkModificationUuid.toString()) + .build().toUriString(); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + headers.set(HEADER_USER_ID, userId); + restTemplate.exchange(getNetworkModificationServerURI(false) + path, HttpMethod.PUT, new HttpEntity<>(metadata, headers), Void.class); + } + public void restoreModifications(UUID groupUUid, List modificationsUuids) { Objects.requireNonNull(groupUUid); Objects.requireNonNull(modificationsUuids); diff --git a/src/main/java/org/gridsuite/study/server/service/RebuildNodeService.java b/src/main/java/org/gridsuite/study/server/service/RebuildNodeService.java index 837eba1e5..1c74bcd52 100644 --- a/src/main/java/org/gridsuite/study/server/service/RebuildNodeService.java +++ b/src/main/java/org/gridsuite/study/server/service/RebuildNodeService.java @@ -61,6 +61,11 @@ public void updateNetworkModificationsMetadata(UUID studyUuid, UUID nodeUuid, Li () -> studyService.updateNetworkModificationsMetadata(studyUuid, nodeUuid, modificationsUuids, userId, metadata)); } + public void updateNetworkModificationsNameAndDescription(UUID studyUuid, UUID nodeUuid, UUID modificationsUuid, String userId, NetworkModificationMetadata metadata) { + handleRebuildNode(studyUuid, nodeUuid, userId, + () -> studyService.updateNetworkModificationsNameAndDescription(studyUuid, nodeUuid, modificationsUuid, userId, metadata)); + } + public void updateNetworkModificationsApplicability(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid, Set modificationsUuids, String userId, boolean applicable) { handleRebuildNode(studyUuid, nodeUuid, userId, () -> studyService.updateNetworkModificationsApplicabilityInRootNetwork(studyUuid, nodeUuid, rootNetworkUuid, modificationsUuids, userId, applicable)); diff --git a/src/main/java/org/gridsuite/study/server/service/StudyService.java b/src/main/java/org/gridsuite/study/server/service/StudyService.java index 8db8e96e6..8894ccd20 100644 --- a/src/main/java/org/gridsuite/study/server/service/StudyService.java +++ b/src/main/java/org/gridsuite/study/server/service/StudyService.java @@ -1639,6 +1639,23 @@ public void updateNetworkModificationsMetadata(UUID studyUuid, UUID nodeUuid, Li notificationService.emitElementUpdated(studyUuid, userId); } + @Transactional + public void updateNetworkModificationsNameAndDescription(UUID studyUuid, UUID nodeUuid, UUID modificationsUuid, String userId, NetworkModificationMetadata metadata) { + List childrenUuids = networkModificationTreeService.getChildrenUuids(nodeUuid); + try { + if (!networkModificationTreeService.getStudyUuidForNodeId(nodeUuid).equals(studyUuid)) { + throw new StudyException(NOT_ALLOWED); + } + networkModificationService.updateNetworkModificationNameAndDescription(modificationsUuid, metadata, userId); + if (metadata.getActivated() != null || metadata.getName() != null) { + invalidateNodeTree(studyUuid, nodeUuid); + } + } finally { + notificationService.emitModificationsUpdated(studyUuid, nodeUuid, childrenUuids); + } + notificationService.emitElementUpdated(studyUuid, userId); + } + /** * A shared modification holds the applicabilities used by every study referencing it: only a user allowed to write * on the shared element may change them. @@ -2000,7 +2017,8 @@ public void shareCompositeNetworkModification( // the applied modifications are left unchanged : the node does not need to be rebuilt ModificationReference newReference = networkModificationService.extractCompositeModificationToShare(groupUuid, modificationUuid, name, description); // the composite modification keeps its uuid when extracted, so it is shared under that same uuid - directoryService.createElement(parentDirectoryUuid, description, modificationUuid, name, DirectoryService.MODIFICATION, userId); + // description is null as it is provided by the referenced modification + directoryService.createElement(parentDirectoryUuid, null, modificationUuid, name, DirectoryService.MODIFICATION, userId); // extraction replaced the local composite by a new reference modification, in the node group or in a parent // composite: register it on the shared element createElementsReferences(List.of(newReference), studyUuid, nodeUuid, userId); From a5d6b0e33a0c8c872226c2f11885e714f013032a Mon Sep 17 00:00:00 2001 From: Etienne LESOT Date: Fri, 2 Oct 2026 08:23:47 +0200 Subject: [PATCH 08/12] clean and add test Signed-off-by: Etienne LESOT --- .../NetworkModificationController.java | 10 ++++++++ .../server/controller/StudyController.java | 14 ----------- .../service/NetworkModificationService.java | 2 +- .../server/service/RebuildNodeService.java | 5 ---- .../study/server/service/StudyService.java | 17 ------------- .../NetworkModificationControllerTest.java | 24 ++++++++++++++++++- 6 files changed, 34 insertions(+), 38 deletions(-) diff --git a/src/main/java/org/gridsuite/study/server/controller/NetworkModificationController.java b/src/main/java/org/gridsuite/study/server/controller/NetworkModificationController.java index ece979d6c..7ea80af17 100644 --- a/src/main/java/org/gridsuite/study/server/controller/NetworkModificationController.java +++ b/src/main/java/org/gridsuite/study/server/controller/NetworkModificationController.java @@ -15,6 +15,8 @@ import java.util.List; import java.util.UUID; +import static org.gridsuite.study.server.StudyConstants.HEADER_USER_ID; + @RestController @RequestMapping(value = "/" + StudyApi.API_VERSION) public class NetworkModificationController { @@ -71,6 +73,14 @@ public ResponseEntity updateNetworkModificationsMetadata(@RequestParam("uu return ResponseEntity.ok().build(); } + @PutMapping(value = "/network-modifications/name-and-description/{uuid}") + public ResponseEntity updateModificationNameAndDescription(@PathVariable UUID uuid, + @RequestHeader(HEADER_USER_ID) String userId, + @RequestBody String metadata) { + networkModificationService.updateNetworkModificationNameAndDescription(uuid, metadata, userId); + return ResponseEntity.ok().build(); + } + @GetMapping(value = "/containers/references/exists") public ResponseEntity hasModificationReferences(@RequestParam("uuids") List containerUuids) { return ResponseEntity.ok().body(networkModificationService.hasModificationReferences(containerUuids)); diff --git a/src/main/java/org/gridsuite/study/server/controller/StudyController.java b/src/main/java/org/gridsuite/study/server/controller/StudyController.java index c181c8d2c..093d7f7e5 100644 --- a/src/main/java/org/gridsuite/study/server/controller/StudyController.java +++ b/src/main/java/org/gridsuite/study/server/controller/StudyController.java @@ -1048,20 +1048,6 @@ public ResponseEntity updateNetworkModificationsMetadata(@Parameter(descri return ResponseEntity.ok().build(); } - @PutMapping(value = "/studies/{studyUuid}/nodes/{nodeUuid}/network-modifications/name-and-description/{uuid}") - @Operation(summary = "Updates the metadata of a network modification") - @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Update the metadata of a network modification"), @ApiResponse(responseCode = "404", - description = "The study/node is not found")}) - public ResponseEntity updateNetworkModificationsMetadata(@Parameter(description = "Study UUID") @PathVariable("studyUuid") UUID studyUuid, - @Parameter(description = "Node UUID") @PathVariable("nodeUuid") UUID nodeUuid, - @Parameter(description = "modification UUID") @PathVariable("uuid") UUID networkModificationUuid, - @RequestBody NetworkModificationMetadata metadata, - @RequestHeader(HEADER_USER_ID) String userId) { - studyService.assertIsNodeNotReadOnly(nodeUuid); - rebuildNodeService.updateNetworkModificationsNameAndDescription(studyUuid, nodeUuid, networkModificationUuid, userId, metadata); - return ResponseEntity.ok().build(); - } - @PutMapping(value = "/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/network-modifications", params = "applicable") @Operation(summary = "Update the applicability of network modifications for a node on a specific root network") @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Update the applicability of network modifications on a node in a specific root network"), diff --git a/src/main/java/org/gridsuite/study/server/service/NetworkModificationService.java b/src/main/java/org/gridsuite/study/server/service/NetworkModificationService.java index ab47d60f7..b3c40b560 100644 --- a/src/main/java/org/gridsuite/study/server/service/NetworkModificationService.java +++ b/src/main/java/org/gridsuite/study/server/service/NetworkModificationService.java @@ -289,7 +289,7 @@ public void updateModificationsMetadata(UUID groupUUid, List modifications restTemplate.exchange(path, HttpMethod.PUT, httpEntity, Void.class); } - public void updateNetworkModificationNameAndDescription(UUID networkModificationUuid, NetworkModificationMetadata metadata, String userId) { + public void updateNetworkModificationNameAndDescription(UUID networkModificationUuid, String metadata, String userId) { String path = UriComponentsBuilder.fromPath(NETWORK_MODIFICATIONS_PATH + DELIMITER + "name-and-description" + DELIMITER + networkModificationUuid.toString()) .build().toUriString(); HttpHeaders headers = new HttpHeaders(); diff --git a/src/main/java/org/gridsuite/study/server/service/RebuildNodeService.java b/src/main/java/org/gridsuite/study/server/service/RebuildNodeService.java index 1c74bcd52..837eba1e5 100644 --- a/src/main/java/org/gridsuite/study/server/service/RebuildNodeService.java +++ b/src/main/java/org/gridsuite/study/server/service/RebuildNodeService.java @@ -61,11 +61,6 @@ public void updateNetworkModificationsMetadata(UUID studyUuid, UUID nodeUuid, Li () -> studyService.updateNetworkModificationsMetadata(studyUuid, nodeUuid, modificationsUuids, userId, metadata)); } - public void updateNetworkModificationsNameAndDescription(UUID studyUuid, UUID nodeUuid, UUID modificationsUuid, String userId, NetworkModificationMetadata metadata) { - handleRebuildNode(studyUuid, nodeUuid, userId, - () -> studyService.updateNetworkModificationsNameAndDescription(studyUuid, nodeUuid, modificationsUuid, userId, metadata)); - } - public void updateNetworkModificationsApplicability(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid, Set modificationsUuids, String userId, boolean applicable) { handleRebuildNode(studyUuid, nodeUuid, userId, () -> studyService.updateNetworkModificationsApplicabilityInRootNetwork(studyUuid, nodeUuid, rootNetworkUuid, modificationsUuids, userId, applicable)); diff --git a/src/main/java/org/gridsuite/study/server/service/StudyService.java b/src/main/java/org/gridsuite/study/server/service/StudyService.java index ec5a868de..18c6cc4d1 100644 --- a/src/main/java/org/gridsuite/study/server/service/StudyService.java +++ b/src/main/java/org/gridsuite/study/server/service/StudyService.java @@ -1639,23 +1639,6 @@ public void updateNetworkModificationsMetadata(UUID studyUuid, UUID nodeUuid, Li notificationService.emitElementUpdated(studyUuid, userId); } - @Transactional - public void updateNetworkModificationsNameAndDescription(UUID studyUuid, UUID nodeUuid, UUID modificationsUuid, String userId, NetworkModificationMetadata metadata) { - List childrenUuids = networkModificationTreeService.getChildrenUuids(nodeUuid); - try { - if (!networkModificationTreeService.getStudyUuidForNodeId(nodeUuid).equals(studyUuid)) { - throw new StudyException(NOT_ALLOWED); - } - networkModificationService.updateNetworkModificationNameAndDescription(modificationsUuid, metadata, userId); - if (metadata.getActivated() != null || metadata.getName() != null) { - invalidateNodeTree(studyUuid, nodeUuid); - } - } finally { - notificationService.emitModificationsUpdated(studyUuid, nodeUuid, childrenUuids); - } - notificationService.emitElementUpdated(studyUuid, userId); - } - /** * A shared modification holds the applicabilities used by every study referencing it: only a user allowed to write * on the shared element may change them. diff --git a/src/test/java/org/gridsuite/study/server/controller/NetworkModificationControllerTest.java b/src/test/java/org/gridsuite/study/server/controller/NetworkModificationControllerTest.java index 1838dde26..91e9daec6 100644 --- a/src/test/java/org/gridsuite/study/server/controller/NetworkModificationControllerTest.java +++ b/src/test/java/org/gridsuite/study/server/controller/NetworkModificationControllerTest.java @@ -12,13 +12,16 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import java.util.List; +import java.util.Map; import java.util.UUID; +import static org.gridsuite.study.server.StudyConstants.HEADER_USER_ID; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; @@ -160,7 +163,26 @@ void testUpdateNetworkModificationsMetadata() throws Exception { } @Test - void testhasModificationReference() throws Exception { + void testUpdateNetworkModificationsNameAndDescription() throws Exception { + UUID modificationUuid = UUID.randomUUID(); + String userId = "user"; + String metadata = "{\"message\":{\"name\":\"newName\",\"description\":\"newDescription\"}}"; + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + headers.set(HEADER_USER_ID, userId); + + mockMvc.perform(put(BASE_URL + "/network-modifications/name-and-description/" + modificationUuid) + .headers(headers) + .content(metadata) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().string("")); + + verify(networkModificationService).updateNetworkModificationNameAndDescription(modificationUuid, metadata, userId); + } + + @Test + void testHasModificationReference() throws Exception { UUID firstUuid = UUID.randomUUID(); UUID secondUuid = UUID.randomUUID(); From e8a6e50e8a7eb2c6173e5bd1b51cd75933b4599d Mon Sep 17 00:00:00 2001 From: Etienne LESOT Date: Fri, 2 Oct 2026 08:33:28 +0200 Subject: [PATCH 09/12] checkstyle Signed-off-by: Etienne LESOT --- .../server/controller/NetworkModificationControllerTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/org/gridsuite/study/server/controller/NetworkModificationControllerTest.java b/src/test/java/org/gridsuite/study/server/controller/NetworkModificationControllerTest.java index 91e9daec6..531912832 100644 --- a/src/test/java/org/gridsuite/study/server/controller/NetworkModificationControllerTest.java +++ b/src/test/java/org/gridsuite/study/server/controller/NetworkModificationControllerTest.java @@ -18,7 +18,6 @@ import org.springframework.test.web.servlet.setup.MockMvcBuilders; import java.util.List; -import java.util.Map; import java.util.UUID; import static org.gridsuite.study.server.StudyConstants.HEADER_USER_ID; From 168050e13c9484479ac93af644efcb44ccb96827 Mon Sep 17 00:00:00 2001 From: Etienne LESOT Date: Fri, 2 Oct 2026 09:45:28 +0200 Subject: [PATCH 10/12] add test Signed-off-by: Etienne LESOT --- .../server/service/NetworkModificationServiceTest.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/test/java/org/gridsuite/study/server/service/NetworkModificationServiceTest.java b/src/test/java/org/gridsuite/study/server/service/NetworkModificationServiceTest.java index cc23136ad..2a88baace 100644 --- a/src/test/java/org/gridsuite/study/server/service/NetworkModificationServiceTest.java +++ b/src/test/java/org/gridsuite/study/server/service/NetworkModificationServiceTest.java @@ -263,4 +263,14 @@ void testHasModificationReferences() { networkModificationService.hasModificationReferences(List.of(modificationUuid)); verify(restTemplate).getForObject(eq(expectedUrl), eq(Boolean.class)); } + + @Test + void testUpdateNetworkModificationsNameAndDescription() { + UUID modificationUuid = UUID.randomUUID(); + String metadata = ""; + String expectedUrl = NETWORK_MODIFICATION_SERVER_URI + "/v1/network-modifications/name-and-description/" + modificationUuid; + + networkModificationService.updateNetworkModificationNameAndDescription(modificationUuid, metadata, USER_ID); + verify(restTemplate).exchange(eq(expectedUrl), eq(HttpMethod.PUT), org.mockito.ArgumentMatchers.>any(), eq(Void.class)); + } } From a6dcc625ec3d88ec4b3245f134c2814b5ccec4bb Mon Sep 17 00:00:00 2001 From: Etienne LESOT Date: Tue, 6 Oct 2026 09:29:39 +0200 Subject: [PATCH 11/12] review Signed-off-by: Etienne LESOT --- .../study/server/controller/NetworkModificationController.java | 2 +- .../study/server/service/NetworkModificationService.java | 2 +- .../server/controller/NetworkModificationControllerTest.java | 2 +- .../study/server/service/NetworkModificationServiceTest.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/gridsuite/study/server/controller/NetworkModificationController.java b/src/main/java/org/gridsuite/study/server/controller/NetworkModificationController.java index c55864078..5750456ce 100644 --- a/src/main/java/org/gridsuite/study/server/controller/NetworkModificationController.java +++ b/src/main/java/org/gridsuite/study/server/controller/NetworkModificationController.java @@ -74,7 +74,7 @@ public ResponseEntity updateNetworkModificationsMetadata(@RequestParam("uu return ResponseEntity.ok().build(); } - @PutMapping(value = "/network-modifications/name-and-description/{uuid}") + @PutMapping(value = "/network-modifications/{uuid}/name-and-description") public ResponseEntity updateModificationNameAndDescription(@PathVariable UUID uuid, @RequestHeader(HEADER_USER_ID) String userId, @RequestBody String metadata) { diff --git a/src/main/java/org/gridsuite/study/server/service/NetworkModificationService.java b/src/main/java/org/gridsuite/study/server/service/NetworkModificationService.java index 25dce8161..52983484a 100644 --- a/src/main/java/org/gridsuite/study/server/service/NetworkModificationService.java +++ b/src/main/java/org/gridsuite/study/server/service/NetworkModificationService.java @@ -289,7 +289,7 @@ public void updateModificationsMetadata(UUID groupUUid, List modifications } public void updateNetworkModificationNameAndDescription(UUID networkModificationUuid, String metadata, String userId) { - String path = UriComponentsBuilder.fromPath(NETWORK_MODIFICATIONS_PATH + DELIMITER + "name-and-description" + DELIMITER + networkModificationUuid.toString()) + String path = UriComponentsBuilder.fromPath(NETWORK_MODIFICATIONS_PATH + DELIMITER + networkModificationUuid.toString() + DELIMITER + "name-and-description") .build().toUriString(); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); diff --git a/src/test/java/org/gridsuite/study/server/controller/NetworkModificationControllerTest.java b/src/test/java/org/gridsuite/study/server/controller/NetworkModificationControllerTest.java index 459ed983e..b0b643446 100644 --- a/src/test/java/org/gridsuite/study/server/controller/NetworkModificationControllerTest.java +++ b/src/test/java/org/gridsuite/study/server/controller/NetworkModificationControllerTest.java @@ -172,7 +172,7 @@ void testUpdateNetworkModificationsNameAndDescription() throws Exception { headers.setContentType(MediaType.APPLICATION_JSON); headers.set(HEADER_USER_ID, userId); - mockMvc.perform(put(BASE_URL + "/network-modifications/name-and-description/" + modificationUuid) + mockMvc.perform(put(BASE_URL + "/network-modifications/" + modificationUuid + "/name-and-description") .headers(headers) .content(metadata) .contentType(MediaType.APPLICATION_JSON)) diff --git a/src/test/java/org/gridsuite/study/server/service/NetworkModificationServiceTest.java b/src/test/java/org/gridsuite/study/server/service/NetworkModificationServiceTest.java index 134e76317..fb38285a6 100644 --- a/src/test/java/org/gridsuite/study/server/service/NetworkModificationServiceTest.java +++ b/src/test/java/org/gridsuite/study/server/service/NetworkModificationServiceTest.java @@ -271,7 +271,7 @@ void testHasModificationReferences() { void testUpdateNetworkModificationsNameAndDescription() { UUID modificationUuid = UUID.randomUUID(); String metadata = ""; - String expectedUrl = NETWORK_MODIFICATION_SERVER_URI + "/v1/network-modifications/name-and-description/" + modificationUuid; + String expectedUrl = NETWORK_MODIFICATION_SERVER_URI + "/v1/network-modifications/" + modificationUuid + "/name-and-description"; networkModificationService.updateNetworkModificationNameAndDescription(modificationUuid, metadata, USER_ID); verify(restTemplate).exchange(eq(expectedUrl), eq(HttpMethod.PUT), org.mockito.ArgumentMatchers.>any(), eq(Void.class)); From ed7515d90cb77cdf69fd3dd4e55e94f83bee5763 Mon Sep 17 00:00:00 2001 From: Etienne LESOT Date: Tue, 6 Oct 2026 11:05:34 +0200 Subject: [PATCH 12/12] clean Signed-off-by: Etienne LESOT --- .../controller/NetworkModificationControllerTest.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/test/java/org/gridsuite/study/server/controller/NetworkModificationControllerTest.java b/src/test/java/org/gridsuite/study/server/controller/NetworkModificationControllerTest.java index b0b643446..0fe8ab0fe 100644 --- a/src/test/java/org/gridsuite/study/server/controller/NetworkModificationControllerTest.java +++ b/src/test/java/org/gridsuite/study/server/controller/NetworkModificationControllerTest.java @@ -167,7 +167,13 @@ void testUpdateNetworkModificationsMetadata() throws Exception { void testUpdateNetworkModificationsNameAndDescription() throws Exception { UUID modificationUuid = UUID.randomUUID(); String userId = "user"; - String metadata = "{\"message\":{\"name\":\"newName\",\"description\":\"newDescription\"}}"; + String metadata = + "{\"message\":" + + "{" + + "\"name\":\"newName\"," + + "\"description\":\"newDescription\"" + + "}" + + "}"; HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); headers.set(HEADER_USER_ID, userId);