diff --git a/src/main/java/org/gridsuite/explore/server/ExploreController.java b/src/main/java/org/gridsuite/explore/server/ExploreController.java index 20652dbf..b6bc9c95 100644 --- a/src/main/java/org/gridsuite/explore/server/ExploreController.java +++ b/src/main/java/org/gridsuite/explore/server/ExploreController.java @@ -242,6 +242,16 @@ public ResponseEntity deleteElement(@PathVariable("elementUuid") UUID elem return ResponseEntity.ok().build(); } + @DeleteMapping(value = "/explore/elements/{directoryUuid}/delete-stashed") + @Operation(summary = "Remove directories/elements") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "directories/elements was successfully removed")}) + public ResponseEntity deleteElements(@RequestParam("ids") List elementsUuid, + @RequestHeader("userId") String userId, + @PathVariable String directoryUuid) { + exploreService.deleteElements(elementsUuid, userId); + return ResponseEntity.ok().build(); + } + @GetMapping(value = "/explore/elements/metadata", produces = MediaType.APPLICATION_JSON_VALUE) @Operation(summary = "get element infos from ids given as parameters") @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The elements information")}) 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 b989bc77..66073443 100644 --- a/src/main/java/org/gridsuite/explore/server/services/DirectoryService.java +++ b/src/main/java/org/gridsuite/explore/server/services/DirectoryService.java @@ -96,6 +96,17 @@ public void deleteDirectoryElement(UUID elementUuid, String userId) { restTemplate.exchange(directoryServerBaseUri + path, HttpMethod.DELETE, new HttpEntity<>(headers), Void.class); } + public void deleteDirectoryElements(List elementUuids, String userId) { + var ids = elementUuids.stream().map(UUID::toString).collect(Collectors.joining(",")); + String path = UriComponentsBuilder + .fromPath(ELEMENTS_SERVER_ROOT_PATH + "?ids=" + ids) + .buildAndExpand() + .toUriString(); + HttpHeaders headers = new HttpHeaders(); + headers.add(HEADER_USER_ID, userId); + restTemplate.exchange(directoryServerBaseUri + path, HttpMethod.DELETE, new HttpEntity<>(headers), Void.class); + } + public ElementAttributes getElementInfos(UUID elementUuid) { 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 3a5d8629..d966a7f5 100644 --- a/src/main/java/org/gridsuite/explore/server/services/ExploreService.java +++ b/src/main/java/org/gridsuite/explore/server/services/ExploreService.java @@ -204,6 +204,17 @@ public void deleteElement(UUID id, String userId) { } } + public void deleteElements(List uuids, String userId) { + try { + uuids.forEach(id -> directoryService.deleteElement(id, userId)); + // FIXME dirty fix to ignore errors and still delete the elements in the directory-server. To delete when handled properly. + } catch (Exception e) { + LOGGER.error(e.toString(), e); + } finally { + directoryService.deleteDirectoryElements(uuids, userId); + } + } + public void updateFilter(UUID id, String filter, String userId, String name) { filterService.updateFilter(id, filter, userId); updateElementName(id, name, userId); diff --git a/src/test/java/org/gridsuite/explore/server/ExploreTest.java b/src/test/java/org/gridsuite/explore/server/ExploreTest.java index cd749a95..f609a465 100644 --- a/src/test/java/org/gridsuite/explore/server/ExploreTest.java +++ b/src/test/java/org/gridsuite/explore/server/ExploreTest.java @@ -39,6 +39,7 @@ import java.io.IOException; import java.io.InputStream; import java.util.*; +import java.util.stream.Collectors; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -297,6 +298,8 @@ public MockResponse dispatch(RecordedRequest request) { return new MockResponse().setResponseCode(200); } else if (path.matches("/v1/parameters/" + PARAMETERS_UUID)) { return new MockResponse().setResponseCode(200); + } else if (path.matches("\\/v1\\/elements\\?ids=([^,]+,){2,}[^,]+$")) { + return new MockResponse().setResponseCode(200); } return new MockResponse().setResponseCode(404); } @@ -460,6 +463,13 @@ public void deleteElement(UUID elementUUid) throws Exception { .andExpect(status().isOk()); } + public void deleteElements(List elementUuids, UUID parentUuid) throws Exception { + var ids = elementUuids.stream().map(UUID::toString).collect(Collectors.joining(",")); + mockMvc.perform(delete("/v1/explore/elements/{parentUuid}/delete-stashed?ids=" + ids, parentUuid) + .header("userId", USER1)) + .andExpect(status().isOk()); + } + public void deleteElementInvalidType(UUID elementUUid) throws Exception { mockMvc.perform(delete("/v1/explore/elements/{elementUuid}", elementUUid) .header("userId", USER1)) @@ -468,6 +478,7 @@ public void deleteElementInvalidType(UUID elementUUid) throws Exception { @Test public void testDeleteElement() throws Exception { + deleteElements(List.of(FILTER_UUID, PRIVATE_STUDY_UUID, CONTINGENCY_LIST_UUID, CASE_UUID), PARENT_DIRECTORY_UUID); deleteElement(FILTER_UUID); deleteElement(PRIVATE_STUDY_UUID); deleteElement(CONTINGENCY_LIST_UUID);