From c5e6d55c9255626a99d36379e743bcca8470d9b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oscar=20Chac=C3=B3n?= <167455436+oscar-escire@users.noreply.github.com> Date: Fri, 24 Jan 2025 10:08:22 -0600 Subject: [PATCH] added expunge request param and enabled workflowitem delete based on it (#9950) * added expunge request param and enabled workflowitem delete based on it * enabled expunge param only in workflowitem delete endpoint and IT * Remove invalid param from JavaDocs --------- Co-authored-by: Tim Donohue --- .../WorkflowItemRestRepository.java | 15 ++++- .../rest/WorkflowItemRestRepositoryIT.java | 65 +++++++++++++++++++ 2 files changed, 79 insertions(+), 1 deletion(-) diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/WorkflowItemRestRepository.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/WorkflowItemRestRepository.java index f6c879b3efdf..3d852e9aabf0 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/WorkflowItemRestRepository.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/WorkflowItemRestRepository.java @@ -71,6 +71,7 @@ public class WorkflowItemRestRepository extends DSpaceRestRepository { public static final String OPERATION_PATH_SECTIONS = "sections"; + public static final String REQUESTPARAMETER_EXPUNGE = "expunge"; private static final Logger log = LogManager.getLogger(); @@ -239,13 +240,25 @@ public void patch(Context context, HttpServletRequest request, String apiCategor * move the workflowitem back to the submitter workspace regardless to how the workflow is designed */ protected void delete(Context context, Integer id) { + String expungeParam = getRequestService() + .getCurrentRequest() + .getServletRequest() + .getParameter(REQUESTPARAMETER_EXPUNGE); + boolean expunge = false; + if (expungeParam != null) { + expunge = Boolean.parseBoolean(expungeParam); + } XmlWorkflowItem witem = null; try { witem = wis.find(context, id); if (witem == null) { throw new ResourceNotFoundException("WorkflowItem ID " + id + " not found"); } - wfs.abort(context, witem, context.getCurrentUser()); + if (expunge) { + wis.delete(context, witem); + } else { + wfs.abort(context, witem, context.getCurrentUser()); + } } catch (AuthorizeException e) { throw new RESTAuthorizationException(e); } catch (SQLException e) { diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/WorkflowItemRestRepositoryIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/WorkflowItemRestRepositoryIT.java index 6275360b3c5b..a9bbc752f875 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/WorkflowItemRestRepositoryIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/WorkflowItemRestRepositoryIT.java @@ -686,6 +686,71 @@ public void deleteOneTest() throws Exception { .andExpect(jsonPath("$.page.totalElements", is(1))); } + @Test + /** + * A delete request over a workflowitem with expunge param should result in delete item over detabase + * workspace + * + * @throws Exception + */ + public void deleteOneWithExpungeTest() throws Exception { + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community with one collection. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, parentCommunity).withName("Collection 1") + .withWorkflowGroup(1, admin).build(); + + //2. create a normal user to use as submitter + EPerson submitter = EPersonBuilder.createEPerson(context) + .withEmail("submitter@example.com") + .withPassword("dspace") + .build(); + + context.setCurrentUser(submitter); + + //3. a workflow item + XmlWorkflowItem witem = WorkflowItemBuilder.createWorkflowItem(context, col1) + .withTitle("Workflow Item 1") + .withIssueDate("2017-10-17") + .build(); + + Item item = witem.getItem(); + + //Add a bitstream to the item + String bitstreamContent = "ThisIsSomeDummyText"; + Bitstream bitstream = null; + try (InputStream is = IOUtils.toInputStream(bitstreamContent, Charset.defaultCharset())) { + bitstream = BitstreamBuilder + .createBitstream(context, item, is) + .withName("Bitstream1") + .withMimeType("text/plain").build(); + } + + context.restoreAuthSystemState(); + + String token = getAuthToken(admin.getEmail(), password); + + // Delete the workflowitem + getClient(token).perform(delete("/api/workflow/workflowitems/" + witem.getID() + "?expunge=true")) + .andExpect(status().is(204)); + + // Trying to get deleted workflowitem should fail with 404 + getClient(token).perform(get("/api/workflow/workflowitems/" + witem.getID())) + .andExpect(status().is(404)); + + // the workflowitem's item should fail with 404 + getClient(token).perform(get("/api/core/items/" + item.getID())) + .andExpect(status().is(404)); + + // the workflowitem's bitstream should fail with 404 + getClient(token).perform(get("/api/core/bitstreams/" + bitstream.getID())) + .andExpect(status().is(404)); + } + @Test /** * Test the deposit of a workspaceitem POSTing to the resource workflowitems collection endpoint a workspaceitem (as