diff --git a/remote-api/src/main/java/org/alfresco/rest/api/DeletedNodes.java b/remote-api/src/main/java/org/alfresco/rest/api/DeletedNodes.java index 1b2a568e4d..ef26600d7a 100644 --- a/remote-api/src/main/java/org/alfresco/rest/api/DeletedNodes.java +++ b/remote-api/src/main/java/org/alfresco/rest/api/DeletedNodes.java @@ -2,7 +2,7 @@ * #%L * Alfresco Remote API * %% - * Copyright (C) 2005 - 2016 Alfresco Software Limited + * Copyright (C) 2005 - 2021 Alfresco Software Limited * %% * This file is part of the Alfresco software. * If the software was purchased under a paid Alfresco license, the terms of @@ -34,6 +34,7 @@ import org.alfresco.rest.api.model.UserInfo; import org.alfresco.rest.framework.resource.content.BinaryResource; import org.alfresco.rest.framework.resource.parameters.CollectionWithPagingInfo; import org.alfresco.rest.framework.resource.parameters.Parameters; +import org.alfresco.service.cmr.repository.DirectAccessUrl; /** * Handles trashcan / deleted nodes @@ -99,4 +100,27 @@ public interface DeletedNodes * @return */ CollectionWithPagingInfo getRenditions(String archivedId, Parameters parameters); + + /** + * Gets a presigned URL to directly access content. + * + * @param archivedId The node id for which to obtain the direct access {@code URL} + * @param attachment {@code true} if an attachment {@code URL} is requested, {@code false} for an embedded {@code URL}, {@code true} by default. + * @return A direct access {@code URL} object for the content. + */ + default DirectAccessUrl requestContentDirectUrl(String archivedId, boolean attachment) + { + return requestContentDirectUrl(archivedId, attachment, null); + } + + /** + * Gets a presigned URL to directly access content. + * + * @param archivedId The node id for which to obtain the direct access {@code URL} + * @param attachment {@code true} if an attachment {@code URL} is requested, {@code false} for an embedded {@code URL}, {@code true} by default. + * @param validFor The time at which the direct access {@code URL} will expire. + * @return A direct access {@code URL} object for the content. + */ + DirectAccessUrl requestContentDirectUrl(String archivedId, boolean attachment, Long validFor); + } diff --git a/remote-api/src/main/java/org/alfresco/rest/api/impl/DeletedNodesImpl.java b/remote-api/src/main/java/org/alfresco/rest/api/impl/DeletedNodesImpl.java index 2398a37067..969d4f83aa 100644 --- a/remote-api/src/main/java/org/alfresco/rest/api/impl/DeletedNodesImpl.java +++ b/remote-api/src/main/java/org/alfresco/rest/api/impl/DeletedNodesImpl.java @@ -2,7 +2,7 @@ * #%L * Alfresco Remote API * %% - * Copyright (C) 2005 - 2016 Alfresco Software Limited + * Copyright (C) 2005 - 2021 Alfresco Software Limited * %% * This file is part of the Alfresco software. * If the software was purchased under a paid Alfresco license, the terms of @@ -55,6 +55,7 @@ import org.alfresco.rest.framework.resource.content.BinaryResource; import org.alfresco.rest.framework.resource.parameters.CollectionWithPagingInfo; import org.alfresco.rest.framework.resource.parameters.Parameters; import org.alfresco.rest.framework.tools.RecognizedParamsExtractor; +import org.alfresco.service.cmr.repository.DirectAccessUrl; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.StoreRef; @@ -244,4 +245,15 @@ public class DeletedNodesImpl implements DeletedNodes, RecognizedParamsExtractor NodeRef nodeRef = new NodeRef(StoreRef.STORE_REF_ARCHIVE_SPACESSTORE, archivedId); return renditions.getRenditions(nodeRef, parameters); } + + /** + * {@inheritDoc} + */ + @Override + public DirectAccessUrl requestContentDirectUrl(String originalNodeId, boolean attachment, Long validFor) + { + //First check the node is valid and has been archived. + NodeRef validatedNodeRef = nodes.validateNode(StoreRef.STORE_REF_ARCHIVE_SPACESSTORE, originalNodeId); + return nodes.requestContentDirectUrl(validatedNodeRef, attachment, validFor); + } } diff --git a/remote-api/src/main/java/org/alfresco/rest/api/trashcan/TrashcanEntityResource.java b/remote-api/src/main/java/org/alfresco/rest/api/trashcan/TrashcanEntityResource.java index 1a831ef320..60abf8da32 100644 --- a/remote-api/src/main/java/org/alfresco/rest/api/trashcan/TrashcanEntityResource.java +++ b/remote-api/src/main/java/org/alfresco/rest/api/trashcan/TrashcanEntityResource.java @@ -2,7 +2,7 @@ * #%L * Alfresco Remote API * %% - * Copyright (C) 2005 - 2016 Alfresco Software Limited + * Copyright (C) 2005 - 2021 Alfresco Software Limited * %% * This file is part of the Alfresco software. * If the software was purchased under a paid Alfresco license, the terms of @@ -28,7 +28,10 @@ package org.alfresco.rest.api.trashcan; import javax.servlet.http.HttpServletResponse; +import org.alfresco.repo.content.directurl.DirectAccessUrlDisabledException; import org.alfresco.rest.api.DeletedNodes; +import org.alfresco.rest.api.DirectAccessUrlHelper; +import org.alfresco.rest.api.model.DirectAccessUrlRequest; import org.alfresco.rest.api.model.Node; import org.alfresco.rest.api.model.NodeTargetAssoc; import org.alfresco.rest.framework.BinaryProperties; @@ -36,6 +39,7 @@ import org.alfresco.rest.framework.Operation; import org.alfresco.rest.framework.WebApiDescription; import org.alfresco.rest.framework.WebApiParam; import org.alfresco.rest.framework.core.ResourceParameter; +import org.alfresco.rest.framework.core.exceptions.DisabledServiceException; import org.alfresco.rest.framework.core.exceptions.EntityNotFoundException; import org.alfresco.rest.framework.resource.EntityResource; import org.alfresco.rest.framework.resource.actions.interfaces.BinaryResourceAction; @@ -44,6 +48,7 @@ import org.alfresco.rest.framework.resource.content.BinaryResource; import org.alfresco.rest.framework.resource.parameters.CollectionWithPagingInfo; import org.alfresco.rest.framework.resource.parameters.Parameters; import org.alfresco.rest.framework.webscripts.WithResponse; +import org.alfresco.service.cmr.repository.DirectAccessUrl; /** * An implementation of an Entity Resource for handling archived content @@ -55,12 +60,18 @@ public class TrashcanEntityResource implements EntityResourceAction.ReadById, EntityResourceAction.Read, EntityResourceAction.Delete, BinaryResourceAction.Read { private DeletedNodes deletedNodes; + private DirectAccessUrlHelper directAccessUrlHelper; public void setDeletedNodes(DeletedNodes deletedNodes) { this.deletedNodes = deletedNodes; } + public void setDirectAccessUrlHelper(DirectAccessUrlHelper directAccessUrlHelper) + { + this.directAccessUrlHelper = directAccessUrlHelper; + } + @Override public CollectionWithPagingInfo readAll(Parameters params) { @@ -89,6 +100,27 @@ public class TrashcanEntityResource implements return deletedNodes.getContent(nodeId, null, parameters); } + @Operation("requestDeletedNodeDirectAccessUrl") + @WebApiParam(name = "requestDeletedNodeDirectAccessUrl", title = "Request direct access url", description = "Request direct access url", kind = ResourceParameter.KIND.HTTP_BODY_OBJECT) + @WebApiDescription(title = "Request content url", + description="Generates a direct access URL.", + successStatus = HttpServletResponse.SC_OK) + public DirectAccessUrl requestContentDirectUrl(String originalNodeId, DirectAccessUrlRequest directAccessUrlRequest, Parameters parameters, WithResponse withResponse) + { + boolean attachment = directAccessUrlHelper.getAttachment(directAccessUrlRequest); + Long validFor = directAccessUrlHelper.getDefaultExpiryTimeInSec(); + DirectAccessUrl directAccessUrl; + try + { + directAccessUrl = deletedNodes.requestContentDirectUrl(originalNodeId, attachment, validFor); + } + catch (DirectAccessUrlDisabledException ex) + { + throw new DisabledServiceException(ex.getMessage()); + } + return directAccessUrl; + } + @Override public void delete(String nodeId, Parameters parameters) { diff --git a/remote-api/src/main/resources/alfresco/public-rest-context.xml b/remote-api/src/main/resources/alfresco/public-rest-context.xml index 6c75c154e8..5e826848d5 100644 --- a/remote-api/src/main/resources/alfresco/public-rest-context.xml +++ b/remote-api/src/main/resources/alfresco/public-rest-context.xml @@ -995,9 +995,9 @@ + -