diff --git a/source/java/org/alfresco/rest/api/Nodes.java b/source/java/org/alfresco/rest/api/Nodes.java index 2b2e8bd097..dde2fd15eb 100644 --- a/source/java/org/alfresco/rest/api/Nodes.java +++ b/source/java/org/alfresco/rest/api/Nodes.java @@ -103,8 +103,10 @@ public interface Nodes * Delete the given node. Note: will cascade delete for a folder. * * @param nodeId String id of node (folder or document) + * @param parameters the {@link Parameters} object to get the parameters passed into the request + * - permanent (default false) */ - void deleteNode(String nodeId); + void deleteNode(String nodeId, Parameters parameters); /** * Create node - folder or (empty) file. diff --git a/source/java/org/alfresco/rest/api/impl/NodesImpl.java b/source/java/org/alfresco/rest/api/impl/NodesImpl.java index 30d5110bd3..a4017ec946 100644 --- a/source/java/org/alfresco/rest/api/impl/NodesImpl.java +++ b/source/java/org/alfresco/rest/api/impl/NodesImpl.java @@ -144,6 +144,7 @@ public class NodesImpl implements Nodes private final static String PARAM_RELATIVE_PATH = "relativePath"; private final static String PARAM_AUTO_RENAME = "autoRename"; + private final static String PARAM_PERMANENT = "permanent"; private final static String PARAM_SELECT_PROPERTIES = "properties"; private final static String PARAM_SELECT_PATH = "path"; @@ -1134,9 +1135,19 @@ public class NodesImpl implements Nodes } @Override - public void deleteNode(String nodeId) + public void deleteNode(String nodeId, Parameters parameters) { NodeRef nodeRef = validateNode(nodeId); + + // default false (if not provided) + boolean permanentDelete = Boolean.valueOf(parameters.getParameter(PARAM_PERMANENT)); + + if (permanentDelete == true) + { + // Set as temporary to delete node instead of archiving. + nodeService.addAspect(nodeRef, ContentModel.ASPECT_TEMPORARY, null); + } + fileFolderService.delete(nodeRef); } diff --git a/source/java/org/alfresco/rest/api/nodes/NodesEntityResource.java b/source/java/org/alfresco/rest/api/nodes/NodesEntityResource.java index 45860fd190..e022740dee 100644 --- a/source/java/org/alfresco/rest/api/nodes/NodesEntityResource.java +++ b/source/java/org/alfresco/rest/api/nodes/NodesEntityResource.java @@ -127,7 +127,7 @@ public class NodesEntityResource implements @WebApiDescription(title = "Delete Node", description="Delete the file or folder with id 'nodeId'. Folder will cascade delete") public void delete(String nodeId, Parameters parameters) { - nodes.deleteNode(nodeId); + nodes.deleteNode(nodeId, parameters); } @Operation("copy") diff --git a/source/test-java/org/alfresco/rest/api/tests/NodeApiTest.java b/source/test-java/org/alfresco/rest/api/tests/NodeApiTest.java index 1e08f6066e..80428f3cc4 100644 --- a/source/test-java/org/alfresco/rest/api/tests/NodeApiTest.java +++ b/source/test-java/org/alfresco/rest/api/tests/NodeApiTest.java @@ -26,10 +26,13 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; + +import junit.framework.Assert; import org.alfresco.model.ContentModel; import org.alfresco.model.ForumModel; import org.alfresco.repo.content.ContentLimitProvider.SimpleFixedLimitProvider; import org.alfresco.repo.content.MimetypeMap; +import org.alfresco.repo.node.archive.NodeArchiveService; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback; import org.alfresco.rest.api.Nodes; @@ -58,6 +61,7 @@ import org.alfresco.rest.api.tests.util.MultiPartBuilder.MultiPartRequest; import org.alfresco.rest.api.tests.util.RestApiUtil; import org.alfresco.rest.framework.jacksonextensions.JacksonHelper; import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.StoreRef; import org.alfresco.service.cmr.security.MutableAuthenticationService; import org.alfresco.service.cmr.security.PermissionService; @@ -123,6 +127,9 @@ public class NodeApiTest extends AbstractBaseApiTest protected JacksonUtil jacksonUtil; protected PermissionService permissionService; + protected NodeArchiveService nodeArchiveService; + protected NodeService nodeService; + @Before public void setup() throws Exception @@ -132,6 +139,10 @@ public class NodeApiTest extends AbstractBaseApiTest jacksonUtil = new JacksonUtil(applicationContext.getBean("jsonHelper", JacksonHelper.class)); permissionService = applicationContext.getBean("permissionService", PermissionService.class); + // TODO replace with future V1 REST API for Trashcan + nodeArchiveService = applicationContext.getBean("nodeArchiveService", NodeArchiveService.class); + nodeService = applicationContext.getBean("nodeService", NodeService.class); + user1 = createUser("user1" + System.currentTimeMillis()); user2 = createUser("user2" + System.currentTimeMillis()); // We just need to clean the on-premise-users, @@ -1010,32 +1021,49 @@ public class NodeApiTest extends AbstractBaseApiTest { AuthenticationUtil.setFullyAuthenticatedUser(user1); + long runId = System.currentTimeMillis(); + String myNodeId = getMyNodeId(user1); NodeRef myFilesNodeRef = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, myNodeId); - String content1 = "content" + System.currentTimeMillis() + "_1"; - NodeRef content1Ref = repoService.createDocument(myFilesNodeRef, content1, "The quick brown fox jumps over the lazy dog."); + NodeRef content1Ref = repoService.createDocument(myFilesNodeRef, + "content" + runId + "_1", "The quick brown fox jumps over the lazy dog."); + String content1Id = content1Ref.getId(); // delete file delete("nodes", user1, content1Ref.getId(), 204); + assertTrue(existsArchiveNode(content1Id)); + // -ve test delete("nodes", user1, content1Ref.getId(), 404); - String folder1 = "folder" + System.currentTimeMillis() + "_1"; - String folder1Ref = createFolder(user1, myNodeId, folder1).getId(); + String folder1Id = createFolder(user1, myNodeId, "folder " + runId + "_1").getId(); + String folder2Id = createFolder(user1, folder1Id, "folder " + runId + "_2").getId(); - String folder2 = "folder" + System.currentTimeMillis() + "_2"; - String folder2Ref = createFolder(user1, folder1Ref, folder2).getId(); - - String content2 = "content" + System.currentTimeMillis() + "_2"; - NodeRef content2Ref = repoService.createDocument(new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, folder2Ref), content2, "The quick brown fox jumps over the lazy dog."); + NodeRef content2Ref = repoService.createDocument(new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, folder2Id), + "content " + runId + "_2", "The quick brown fox jumps over the lazy dog."); + String content2Id = content2Ref.getId(); // cascade delete folder - delete("nodes", user1, folder1Ref, 204); + delete("nodes", user1, folder1Id, 204); + + assertTrue(existsArchiveNode(folder1Id)); + assertTrue(existsArchiveNode(folder2Id)); + assertTrue(existsArchiveNode(content2Id)); + + String folder3Id = createFolder(user1, myNodeId, "folder " + runId + "_3").getId(); + String folder4Id = createFolder(user1, folder3Id, "folder " + runId + "_4").getId(); + + // bypass trashcan + Map params = Collections.singletonMap("permanent", "true"); + delete("nodes", user1, folder3Id, params, 204); + + assertFalse(existsArchiveNode(folder3Id)); + assertFalse(existsArchiveNode(folder4Id)); // -ve test - delete("nodes", user1, folder2Ref, 404); + delete("nodes", user1, folder2Id, 404); delete("nodes", user1, content2Ref.getId(), 404); // -ve test @@ -1043,6 +1071,14 @@ public class NodeApiTest extends AbstractBaseApiTest delete("nodes", user1, rootNodeId, 403); } + private boolean existsArchiveNode(String nodeId) + { + // TODO replace with calls to future V1 REST API for Trashcan + NodeRef originalNodeRef = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, nodeId); + NodeRef archiveNodeRef = nodeArchiveService.getArchivedNode(originalNodeRef); + return nodeService.exists(archiveNodeRef); + } + /** * Tests move (file or folder) *

POST: