/* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. * A copy of the License is located at * http://aws.amazon.com/apache2.0 * or in the "license" file accompanying this file. This file is distributed * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the License for the specific language governing * permissions and limitations under the License. */ using System; using System.IO; using System.Threading.Tasks; using Amazon.Util; using Amazon.WorkDocs.Model; using System.Collections.Generic; namespace Amazon.WorkDocs.Utils { /// /// Implementation of IContentManager interface. /// public class ContentManager : IContentManager, IDisposable { private readonly IAmazonWorkDocs client; private readonly String authenticationToken; private readonly AWSHttpClient httpClient; private bool disposed = false; /// /// Initializes ContentManager object. /// /// Paramteres. public ContentManager(ContentManagerParams param) { client = param.WorkDocsClient; authenticationToken = param.AuthenticationToken; httpClient = new AWSHttpClient(); } /// /// Gets document stream of latest version of given document ID. /// If version ID is null, it retrieves latest version of requested document ID. /// /// Request parameters. /// Response for stream of latest version of requested document. public async Task GetDocumentStreamAsync(GetDocumentStreamRequest getDocumentStreamRequest) { String versionId = getDocumentStreamRequest.VersionId; if (versionId == null) { GetDocumentRequest getDocumentRequest = new GetDocumentRequest() { DocumentId = getDocumentStreamRequest.DocumentId, AuthenticationToken = authenticationToken }; GetDocumentResponse response = await client.GetDocumentAsync(getDocumentRequest).ConfigureAwait(false); versionId = response.Metadata.LatestVersionMetadata.Id; } Stream documentVersionStream = await GetDocumentVersionStreamAsync(getDocumentStreamRequest.DocumentId, versionId).ConfigureAwait(false); GetDocumentStreamResponse getDocumentStreamResponse = new GetDocumentStreamResponse(getDocumentStreamRequest) { Stream = documentVersionStream }; return getDocumentStreamResponse; } private async Task GetDocumentVersionStreamAsync(String documentId, String versionId) { GetDocumentVersionRequest getDocumentVersionRequest = new GetDocumentVersionRequest() { DocumentId = documentId, VersionId = versionId, Fields = "SOURCE", AuthenticationToken = authenticationToken }; GetDocumentVersionResponse response = await client.GetDocumentVersionAsync(getDocumentVersionRequest).ConfigureAwait(false); String downloadUrl = response.Metadata.Source[DocumentSourceType.ORIGINAL.Value]; return await httpClient.GetStreamAsync(downloadUrl).ConfigureAwait(false); } /// /// Uploads stream to given folder and document name. /// /// Request parameters. /// Response for document details. public async Task UploadDocumentStreamAsync(UploadDocumentStreamRequest uploadDocumentStreamRequest) { InitiateDocumentVersionUploadRequest initiateDocumentVersionUploadRequest = new InitiateDocumentVersionUploadRequest() { ParentFolderId = uploadDocumentStreamRequest.ParentFolderId, Name = uploadDocumentStreamRequest.DocumentName, ContentType = uploadDocumentStreamRequest.ContentType, ContentCreatedTimestamp = uploadDocumentStreamRequest.ContentCreatedTimestamp, ContentModifiedTimestamp = uploadDocumentStreamRequest.ContentModifiedTimestamp, DocumentSizeInBytes = uploadDocumentStreamRequest.DocumentSizeInBytes, Id = uploadDocumentStreamRequest.DocumentId, AuthenticationToken = authenticationToken }; InitiateDocumentVersionUploadResponse response = await client.InitiateDocumentVersionUploadAsync(initiateDocumentVersionUploadRequest).ConfigureAwait(false); UploadMetadata uploadMetadata = response.UploadMetadata; String documentId = response.Metadata.Id; String versionId = response.Metadata.LatestVersionMetadata.Id; String uploadUrl = uploadMetadata.UploadUrl; AWSStreamContent content = new AWSStreamContent(uploadDocumentStreamRequest.Stream); try { IDictionary requestHeaders = new Dictionary(); requestHeaders.Add("x-amz-server-side-encryption", "AES256"); content.RemoveHttpContentHeader("Content-Type"); content.AddHttpContentHeader("Content-Type", uploadDocumentStreamRequest.ContentType); await httpClient.PutRequestUriAsync(uploadUrl, content, requestHeaders).ConfigureAwait(false); var task = CompleteUpload(documentId, versionId); UploadDocumentStreamResponse uploadDocumentStreamResponse = new UploadDocumentStreamResponse(uploadDocumentStreamRequest) { DocumentId = task.Result, VersionId = versionId }; return uploadDocumentStreamResponse; } finally { content.Dispose(); } } private async Task CompleteUpload(String documentId, String versionId) { UpdateDocumentVersionRequest updateDocumentVersionRequest = new UpdateDocumentVersionRequest() { DocumentId = documentId, VersionId = versionId, VersionStatus = DocumentVersionStatus.ACTIVE, AuthenticationToken = authenticationToken }; await client.UpdateDocumentVersionAsync(updateDocumentVersionRequest).ConfigureAwait(false); return documentId; } /// /// Disposes ContentManager resources. /// public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } private void Dispose(bool disposing) { if (!disposed) { if (disposing) { httpClient.Dispose(); } disposed = true; } } ~ContentManager() { Dispose(false); } } }