Пример #1
0
        public async Task <ScoreVersionMeta> GetVersionMetaAsync(string versionFileKey)
        {
            var convertor = new ScoreMetaConvertor();

            Stream currentStream;

            try
            {
                var request = new GetObjectRequest
                {
                    BucketName = BucketName,
                    Key        = versionFileKey,
                };

                var response = await this.S3Client.GetObjectAsync(request);

                currentStream = response.ResponseStream;
            }
            catch (AmazonS3Exception e)
            {
                if (e.ErrorCode == "NoSuchKey")
                {
                    throw new InvalidOperationException($"'{versionFileKey}' は存在しません");
                }

                throw;
            }

            var meta = await convertor.ConvertToScoreVersionMeta(currentStream);

            return(meta);
        }
Пример #2
0
        public async Task <string> SaveVersionMetaAsync(string versionFileKey, ScoreVersionMeta versionMeta)
        {
            var metaConvertor = new ScoreMetaConvertor();

            var stream = await metaConvertor.ConvertToUtf(versionMeta);

            var putRequest = new PutObjectRequest
            {
                BucketName  = BucketName,
                Key         = versionFileKey,
                InputStream = stream,
                CannedACL   = S3CannedACL.PublicRead,
            };

            try
            {
                await this.S3Client.PutObjectAsync(putRequest);
            }
            catch (AmazonS3Exception e)
            {
                throw new InvalidOperationException(e.Message, e);
            }

            return(versionFileKey);
        }
Пример #3
0
        public async Task <ScoreVersion> GetVersion(
            [FromRoute(Name = "score_name")] string scoreName,
            [FromRoute(Name = "version")] int version)
        {
            var metaFileOperator = new MetaFileOperator(S3Client, BucketName);

            var scoreMeta = await metaFileOperator.GetScoreMetaAsync(scoreName);

            var scoreContentMeta = scoreMeta.GetLastScoreContent();

            var versionText = version.ToString("00000");

            if (scoreContentMeta.VersionFileKeys.TryGetValue(versionText, out var versionFileKey) == false)
            {
                throw new InvalidOperationException($"'{scoreName}' にバージョン '{version}' は存在しません");
            }

            var versionMeta = await metaFileOperator.GetVersionMetaAsync(versionFileKey);

            var urlConvertor = new MinioUrlConvertor(S3Client.Config.ServiceURL, BucketName);

            var metaConvertor = new ScoreMetaConvertor();

            var scoreVersion = metaConvertor.ConvertTo(versionMeta, urlConvertor);

            return(scoreVersion);
        }
Пример #4
0
        public async Task <IActionResult> CreateScoreAsync(
            [FromRoute(Name = "score_name")] string scoreName,
            [FromBody] PatchScore patchScore)
        {
            var convertor        = new ScoreMetaConvertor();
            var metaFileOperator = new MetaFileOperator(S3Client, BucketName);

            var key = $"{scoreName}/{ScoreMeta.FileName}";


            ScoreMeta scoreMeta;

            try
            {
                scoreMeta = await metaFileOperator.GetScoreMetaAsync(scoreName);
            }
            catch (AmazonS3Exception e)
            {
                Logger.LogError(e, e.Message);
                throw;
            }

            var newCurrentScoreMeta = convertor.ConvertToContent(scoreMeta.GetLastScoreContent(), patchScore);

            var newScoreMetaKey = ScoreMeta.CreateKey();

            scoreMeta[newScoreMetaKey] = newCurrentScoreMeta;

            try
            {
                await metaFileOperator.SaveScoreMetaAsync(scoreName, scoreMeta, newScoreMetaKey);
            }
            catch (Exception e)
            {
                Logger.LogError(e, e.Message);
                throw;
            }

            return(Ok());
        }
Пример #5
0
        public async Task SaveScoreMetaAsync(string scoreName, ScoreMeta scoreMeta, string metaKey)
        {
            var convertor = new ScoreMetaConvertor();
            var key       = $"{scoreName}/{ScoreMeta.FileName}";

            int retryCount = 5;

            for (int i = 0; i < retryCount; i++)
            {
                try
                {
                    var stream = await convertor.ConvertToUtf(scoreMeta);

                    var putRequest = new PutObjectRequest
                    {
                        BucketName  = BucketName,
                        Key         = key,
                        InputStream = stream,
                        CannedACL   = S3CannedACL.PublicRead,
                    };
                    await this.S3Client.PutObjectAsync(putRequest);
                }
                catch (AmazonS3Exception)
                {
                    // Error
                    throw;
                }


                try
                {
                    var request = new GetObjectRequest
                    {
                        BucketName = BucketName,
                        Key        = key,
                    };

                    var response = await this.S3Client.GetObjectAsync(request);

                    var stream = response.ResponseStream;

                    var checkedMeta = await convertor.ConvertToScoreMeta(stream);

                    // 同一のキーが登録される可能性があるがキーには少数3桁の時間を指定してるので
                    // ほぼキーが重なる自体はないと考える
                    // もしキーの重複が問題になる用であれば内容の比較も行う
                    if (checkedMeta.ContainsKey(metaKey))
                    {
                        return;
                    }
                }
                catch (AmazonS3Exception)
                {
                    // skip
                }

                if (i < (retryCount - 1))
                {
                    Thread.Sleep(2000);
                }
            }

            throw new InvalidOperationException("追加更新に失敗しました");
        }
Пример #6
0
        public async Task <IActionResult> CreateScoreAsync([FromBody] NewScore newScore)
        {
            var convertor = new ScoreMetaConvertor();

            var meta    = convertor.Convert(newScore);
            var content = meta.GetLastScoreContent();

            var prefix = $"{content.Name}/{ScoreMeta.FileName}";


            try
            {
                var request = new ListObjectsRequest
                {
                    BucketName = BucketName,
                    Prefix     = prefix,
                };

                var response = await this.S3Client.ListObjectsAsync(request);

                Logger.LogInformation($"List object from bucket {this.BucketName}. Prefix: '{prefix}', Request Id: {response.ResponseMetadata.RequestId}");

                if (response.S3Objects.Any())
                {
                    throw new InvalidOperationException($"'{content.Name}' は存在します");
                }
            }
            catch (AmazonS3Exception e)
            {
                Logger.LogError(e, e.Message);
                throw;
            }
            catch (Exception e)
            {
                Logger.LogError(e, e.Message);
                throw;
            }


            try
            {
                var fileName = ScoreMeta.FileName;

                var stream = await convertor.ConvertToUtf(meta);

                var key        = $"{content.Name}/{fileName}";
                var putRequest = new PutObjectRequest
                {
                    BucketName  = BucketName,
                    Key         = key,
                    InputStream = stream,
                    CannedACL   = S3CannedACL.PublicRead,
                };
                var response = await this.S3Client.PutObjectAsync(putRequest);

                Logger.LogInformation($"Uploaded object {key} to bucket {this.BucketName}. Request Id: {response.ResponseMetadata.RequestId}");

                return(Ok());
            }
            catch (AmazonS3Exception e)
            {
                Logger.LogError(e, e.Message);
                throw;
            }
            catch (Exception e)
            {
                Logger.LogError(e, e.Message);
                throw;
            }
        }