public async Task <IReadOnlyCollection <VersionedObjectDescriptor <string> > > GetObjectLatestVersions(long id) { var versionsResponse = await _s3Client.ListVersionsAsync(_bucketName, id.ToString() + "/"); return(versionsResponse.Versions .Where(x => !x.IsDeleteMarker && x.IsLatest && !x.Key.EndsWith("/")) .Select(x => new VersionedObjectDescriptor <string>(x.Key, x.VersionId, x.LastModified)) .ToList()); }
/// <inheritdoc /> public async Task <VersionedObjectDescriptor <string> > GetObjectLatestVersion(long id) { var versionsResponse = await _s3Client.ListVersionsAsync(_bucketName, id.AsS3ObjectKey(Tokens.ObjectPostfix)); return(versionsResponse.Versions .Where(x => !x.IsDeleteMarker && x.IsLatest) .Select(x => new VersionedObjectDescriptor <string>(x.Key, x.VersionId, x.LastModified)) .SingleOrDefault()); }
public async Task <string> GetTemplateLatestVersion(long id) { var idAsString = id.ToString(); var versionsResponse = await _s3Client.ListVersionsAsync(_bucketName, idAsString); var version = versionsResponse.Versions.Find(x => x.Key == idAsString && !x.IsDeleteMarker && x.IsLatest); if (version == null) { throw new ObjectNotFoundException($"Template '{id}' versions not found"); } return(version.VersionId); }
public async Task <ListVersionsResponse> ListVersionsAsync(string bucketName, string key) => await _s3Client.ListVersionsAsync(bucketName, key);
public async Task <IReadOnlyCollection <ObjectVersionRecord> > GetObjectVersions(long id, string initialVersionId) { var objectDescriptors = new List <ObjectDescriptor>(); async Task <(bool IsTruncated, int NextVersionIndex, string NextVersionIdMarker)> ListVersions(int nextVersionIndex, string nextVersionIdMarker) { await _distributedLockManager.EnsureLockNotExistsAsync(id); var response = await _s3Client.ListVersionsAsync( new ListVersionsRequest { BucketName = _bucketName, Prefix = id.AsS3ObjectKey(Tokens.ObjectPostfix), VersionIdMarker = nextVersionIdMarker }); var nonDeletedVersions = response.Versions.FindAll(x => !x.IsDeleteMarker); nextVersionIndex += nonDeletedVersions.Count; var initialVersionIdReached = false; var versionInfos = nonDeletedVersions .Aggregate( new List <(string VersionId, DateTime LastModified)>(), (list, next) => { initialVersionIdReached = initialVersionIdReached || !string.IsNullOrEmpty(initialVersionId) && initialVersionId.Equals(next.VersionId, StringComparison.OrdinalIgnoreCase); if (!initialVersionIdReached) { list.Add((next.VersionId, next.LastModified)); } return(list); }); var descriptors = new ObjectDescriptor[versionInfos.Count]; var partitioner = Partitioner.Create(versionInfos); var tasks = partitioner.GetOrderablePartitions(_degreeOfParallelism) .Select(async partition => { while (partition.MoveNext()) { var index = partition.Current.Key; var versionInfo = partition.Current.Value; descriptors[index] = await GetObjectDescriptor(id, versionInfo.VersionId, CancellationToken.None); } }); await Task.WhenAll(tasks); objectDescriptors.AddRange(descriptors); return(!initialVersionIdReached && response.IsTruncated, nextVersionIndex, response.NextVersionIdMarker); } var result = await ListVersions(0, null); if (objectDescriptors.Count == 0) { if (!await IsObjectExists(id)) { throw new ObjectNotFoundException($"Object '{id}' not found."); } return(Array.Empty <ObjectVersionRecord>()); } while (result.IsTruncated) { result = await ListVersions(result.NextVersionIndex, result.NextVersionIdMarker); } var maxVersionIndex = result.NextVersionIndex; var records = new ObjectVersionRecord[objectDescriptors.Count]; for (var index = 0; index < objectDescriptors.Count; ++index) { var descriptor = objectDescriptors[index]; records[index] = new ObjectVersionRecord( descriptor.Id, descriptor.VersionId, --maxVersionIndex, descriptor.LastModified, new AuthorInfo(descriptor.Metadata.Author, descriptor.Metadata.AuthorLogin, descriptor.Metadata.AuthorLogin), descriptor.Properties, descriptor.Elements.Select(x => new ObjectVersionRecord.ElementRecord(x.TemplateCode, x.Value)).ToList(), descriptor.Metadata.ModifiedElements); } return(records); }
public async Task <ListVersionsResponse> ListVersionsAsync(string bucketName, string key) => await ExecuteS3Request(() => _s3Client.ListVersionsAsync(bucketName, key), bucketName);