public async Task CreateSnapshotItemAsync(Guid ownerId, Guid scoreId, ScoreSnapshotDetail snapshotDetail, ScoreObjectAccessControls accessControl) { var key = ScoreSnapshotStorageUtils.CreateSnapshotKey(ownerId, scoreId, snapshotDetail.Id); var json = ScoreSnapshotStorageUtils.ConvertToJson(snapshotDetail); await using var jsonStream = new MemoryStream(json); var acl = accessControl switch { ScoreObjectAccessControls.Private => S3CannedACL.Private, ScoreObjectAccessControls.Public => S3CannedACL.PublicRead, _ => throw new NotSupportedException(), }; var request = new PutObjectRequest() { BucketName = ScoreDataSnapshotS3Bucket, Key = key, CannedACL = acl, InputStream = jsonStream, }; await _s3Client.PutObjectAsync(request); }
public async Task SetScoreItemAccessControlPolicyAsync(Guid ownerId, Guid scoreId, ScoreObjectAccessControls accessControl) { var prefix = $"{ownerId:D}/{scoreId:D}/{ScoreItemStorageConstant.FolderName}"; var objectKeyList = new List <string>(); string continuationToken = default; do { var listRequest = new ListObjectsV2Request() { BucketName = ScoreItemS3Bucket, Prefix = prefix, ContinuationToken = string.IsNullOrWhiteSpace(continuationToken) ? null : continuationToken, }; var listResponse = await _s3Client.ListObjectsV2Async(listRequest); objectKeyList.AddRange(listResponse.S3Objects.Select(x => x.Key)); continuationToken = listResponse.NextContinuationToken; } while (!string.IsNullOrEmpty(continuationToken)); var acl = accessControl switch { ScoreObjectAccessControls.Private => S3CannedACL.Private, ScoreObjectAccessControls.Public => S3CannedACL.PublicRead, _ => throw new NotSupportedException(), }; foreach (var key in objectKeyList) { var request = new PutACLRequest() { BucketName = ScoreItemS3Bucket, CannedACL = acl, Key = key, }; await _s3Client.PutACLAsync(request); } }