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);
        }
Exemplo n.º 2
0
        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);
            }
        }