public async Task PostAsync(S3FileKey key, TValue source)
        {
            if (key == null)
            {
                throw new ArgumentNullException(nameof(key));
            }
            if (source == null)
            {
                throw new ArgumentNullException(nameof(source));
            }

            var stream   = _containerConverter.GetStream(source);
            var metaData = _containerConverter.GetMetaData(source);

            stream.Position = 0;
            var request = new PutObjectRequest
            {
                BucketName      = BucketNameConstructor.GetBucketName(key),
                Key             = key.Key,
                InputStream     = stream,
                TagSet          = metaData.ToTagSet(_containerConverter.GetOriginKey()).ToList(),
                AutoCloseStream = false
            };

            metaData.CopyToMetadataCollection(request.Metadata, _containerConverter.GetOriginKey());
            await AmazonS3.PutObjectAsync(request);

            stream.Position = 0;
        }
        public async Task <IEnumerable <S3FileKey> > GetS3FileKeyVersionsAsync(S3FileKey key)
        {
            IEnumerable <S3FileKey> response = Enumerable.Empty <S3FileKey>();

            await ExcecuteAsync(async() => response = await _repositoryHistoryReader.GetS3FileKeyVersionsAsync(key), key);

            return(response);
        }
        public async Task <IEnumerable <TValue> > GetHistoryAsync(S3FileKey key, bool includeMetadata)
        {
            IEnumerable <TValue> response = Enumerable.Empty <TValue>();

            await ExcecuteAsync(async() => response = await _repositoryHistoryReader.GetHistoryAsync(key, includeMetadata), key);

            return(response);
        }
        public async Task <TValue> GetAsync(S3FileKey key, bool includeMetadata)
        {
            TValue response = default(TValue);

            await ExcecuteAsync(async() => response = await _s3ClientReader.GetAsync(key, includeMetadata), key);

            return(response);
        }
Beispiel #5
0
        public async Task <TValue> GetAsync(S3FileKey key, bool includeMetadata)
        {
            if (key == null)
            {
                throw new ArgumentNullException(nameof(key));
            }

            return(includeMetadata ? await GetWithMetadataAsync(key)
                                   : await GetWithoutMetadataAsync(key));
        }
Beispiel #6
0
        public async Task <IEnumerable <S3FileKey> > GetS3FileKeyVersionsAsync(S3FileKey key)
        {
            if (key == null)
            {
                throw new ArgumentNullException(nameof(key));
            }

            var objectVersions = await GetS3ObjectVersions(key);

            return(objectVersions.Select(x => x.ToVersionedS3FileKey(key)));
        }
Beispiel #7
0
        private async Task <GetObjectResponse> GetObjectAsync(S3FileKey key)
        {
            var request = new GetObjectRequest
            {
                BucketName = BucketNameConstructor.GetBucketName(key),
                Key        = key.Key,
                VersionId  = key.VersionId
            };

            return(await AmazonS3.GetObjectAsync(request));
        }
Beispiel #8
0
        private async Task <IDictionary <string, string> > GetTagsAsync(S3FileKey key)
        {
            var getTagsRequest = new GetObjectTaggingRequest
            {
                BucketName = BucketNameConstructor.GetBucketName(key),
                Key        = key.Key,
                VersionId  = key.VersionId
            };

            var objectTags = await AmazonS3.GetObjectTaggingAsync(getTagsRequest);

            return(objectTags.Tagging.ToDictionary());
        }
Beispiel #9
0
        private async Task <TValue> GetWithoutMetadataAsync(S3FileKey key)
        {
            var getObjectsTask = GetObjectAsync(key);

            var result = new MemoryStream();

            using (var response = await getObjectsTask)
            {
                await response.ResponseStream.CopyToAsync(result);
            }
            result.Position = 0;

            return(_containerConverter.GetDataContainer(result, new Dictionary <string, string>()));
        }
Beispiel #10
0
        public async Task <IEnumerable <TValue> > GetHistoryAsync(S3FileKey key, bool includeMetadata)
        {
            if (key == null)
            {
                throw new ArgumentNullException(nameof(key));
            }

            var fileVersions = await GetS3ObjectVersions(key);

            var recentVersions = fileVersions.TakeWhile(item => !item.IsDeleteMarker).ToList();
            var recentFileKeys = recentVersions.Select(x => x.ToVersionedS3FileKey(key)).ToList();
            var recentFiles    = await GetOrderedVersionsAsync(recentFileKeys, includeMetadata);

            return(recentFiles);
        }
Beispiel #11
0
        private async Task <TValue> GetWithMetadataAsync(S3FileKey key)
        {
            var getObjectsTask = GetObjectAsync(key);
            var getTagsTask    = GetTagsAsync(key);
            await Task.WhenAll(getObjectsTask, getTagsTask);

            var result = new MemoryStream();
            IDictionary <string, string> metaData;

            using (var response = await getObjectsTask)
            {
                await response.ResponseStream.CopyToAsync(result);

                metaData = response.Metadata.ToDictionary();
            }
            result.Position = 0;

            var tags = await getTagsTask;

            return(_containerConverter.GetDataContainer(result, Merge(metaData, tags)));
        }
Beispiel #12
0
        private async Task <IEnumerable <S3ObjectVersion> > GetS3ObjectVersions(S3FileKey key)
        {
            var request = new ListVersionsRequest
            {
                BucketName = BucketNameConstructor.GetBucketName(key),
                Prefix     = key.Key
            };

            var result = new List <S3ObjectVersion>();
            ListVersionsResponse response;

            do
            {
                response = await AmazonS3.ListVersionsAsync(request);

                result.AddRange(response.Versions);

                request.VersionIdMarker = response.NextVersionIdMarker;
                request.KeyMarker       = response.NextKeyMarker;
            } while (response.IsTruncated);

            return(result);
        }
Beispiel #13
0
 public async Task <TValue> GetAsync(S3FileKey key, bool includeMetadata)
 {
     return(await RetryPolicy.ExecuteAsync(() => _repositoryReader.GetAsync(key, includeMetadata)));
 }
 public async Task PostAsync(S3FileKey key, TValue fileContainer)
 {
     await CircuitBreakerPolicy.ExecuteAsync(() =>
                                             _repositoryWriter.PostAsync(key, fileContainer));
 }
 public async Task PostAsync(S3FileKey key, TValue value)
 {
     await RetryPolicy.ExecuteAsync(() => _repositoryWriter.PostAsync(key, value));
 }
 public async Task PostAsync(S3FileKey key, TValue fileContainer)
 {
     await ExcecuteAsync(async() => await _s3ClientWriter.PostAsync(key, fileContainer), key);
 }
        public static S3FileKey ToVersionedS3FileKey(this S3ObjectVersion objectVersion, S3FileKey initialKey)
        {
            if (objectVersion == null)
            {
                throw new ArgumentNullException(nameof(objectVersion));
            }
            if (initialKey == null)
            {
                throw new ArgumentNullException(nameof(initialKey));
            }

            return(FileKeyGenerator.New()
                   .WithFileName(initialKey.FileName)
                   .WithFolderPath(initialKey.FolderPath)
                   .WithBucketType(initialKey.BucketType)
                   .WithVersion(objectVersion.VersionId)
                   .Build());
        }