/*
* 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);
}
}
}