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); }
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); }
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); }
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()); }
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("追加更新に失敗しました"); }
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; } }