async Task PutScoreAsync( Guid ownerId, Guid newScoreId, int maxCount, string title, string description, DateTimeOffset now) { var client = _dynamoDbClient; var tableName = ScoreTableName; var scorePartitionKey = PartitionPrefix.Score + _commonLogic.ConvertIdFromGuid(ownerId); var newScore = _commonLogic.ConvertIdFromGuid(newScoreId); var createAt = now.ToUnixTimeMilliseconds(); var updateAt = createAt; var newLockSummary = _commonLogic.NewGuid(); var newLockSummaryValue = _commonLogic.ConvertIdFromGuid(newLockSummary); var newLockMainValue = _commonLogic.NewLock(); var actions = new List <TransactWriteItem>() { new() { Update = new Update() { Key = new Dictionary <string, AttributeValue>() {
public async Task InitializeScoreAsync(Guid ownerId) { var partitionKey = PartitionPrefix.Score + _commonLogic.ConvertIdFromGuid(ownerId); var newLockValue = _commonLogic.NewGuid(); var newLock = _commonLogic.ConvertIdFromGuid(newLockValue); await PutAsync(_dynamoDbClient, ScoreTableName, partitionKey, newLock);
public async Task UpdateTitleAsync(Guid ownerId, Guid scoreId, string title) { var partitionKey = "sc:" + _commonLogic.ConvertIdFromGuid(ownerId); var sortKey = _commonLogic.ConvertIdFromGuid(scoreId); var newLockValue = _commonLogic.NewLock(); var now = _commonLogic.Now; var at = now.ToUnixTimeMilliseconds(); var request = new UpdateItemRequest() { Key = new Dictionary <string, AttributeValue>() {
public async Task DeleteMainAsync(Guid ownerId, Guid scoreId) { var partitionKey = PartitionPrefix.Score + _commonLogic.ConvertIdFromGuid(ownerId); var score = _commonLogic.ConvertIdFromGuid(scoreId); var newLockSummary = _commonLogic.NewGuid(); var newLockSummaryValue = _commonLogic.ConvertIdFromGuid(newLockSummary); var actions = new List <TransactWriteItem>() { new() { Delete = new Delete() { Key = new Dictionary <string, AttributeValue>() {
public async Task SetAccessAsync(Guid ownerId, Guid scoreId, ScoreAccesses access) { var now = _commonLogic.Now; var tableName = ScoreTableName; var client = _dynamoDbClient; var partitionKey = PartitionPrefix.Score + _commonLogic.ConvertIdFromGuid(ownerId); var score = _commonLogic.ConvertIdFromGuid(scoreId); var updateAt = now.ToUnixTimeMilliseconds(); var accessText = access switch { ScoreAccesses.Public => ScoreAccessKind.Public, _ => ScoreAccessKind.Private }; var request = new UpdateItemRequest() { Key = new Dictionary <string, AttributeValue>() {
async Task UpdateAnnotationsAsync(Guid ownerId, Guid scoreId, HashSet <string> oldChunks, List <AnnotationOnData> newAnnotations, DateTimeOffset timeout) { var partitionKey = PartitionPrefix.Score + _commonLogic.ConvertIdFromGuid(ownerId); var score = _commonLogic.ConvertIdFromGuid(scoreId); const int oneChunkLength = 240; const int oneChunkCountMax = 200; var chunkDataList = newAnnotations.SelectMany(an => { var extraCount = Math.Max(0, (int)Math.Ceiling(an.Content.Length / (double)oneChunkLength)); var chunks = Enumerable.Range(0, extraCount).Select(index => { var chunk = $"{(an.Id / oneChunkCountMax):00}{index:0}"; var start = index * oneChunkLength; var length = Math.Min(an.Content.Length - start, oneChunkLength); var content = an.Content.Substring(start, length); return(chunk, id: an.Id, content); }) .ToArray(); return(chunks); }).ToArray(); var chunkDataGroup = chunkDataList.GroupBy(x => x.chunk, x => x); foreach (var chunkData in chunkDataGroup) { var chunk = chunkData.Key; if (oldChunks.Contains(chunk)) { UpdateItemRequest request = new() { TableName = ScoreTableName, Key = new Dictionary <string, AttributeValue>() {
public async Task <IReadOnlyList <ScoreSummary> > GetScoreSummariesAsync(Guid ownerId) { var partitionKey = PartitionPrefix.Score + _commonLogic.ConvertIdFromGuid(ownerId); var request = new QueryRequest() { TableName = ScoreTableName, ExpressionAttributeNames = new Dictionary <string, string>() { ["#o"] = ScoreMainPn.PartitionKey, ["#s"] = ScoreMainPn.SortKey, ["#d"] = ScoreMainPn.Data, ["#title"] = ScoreMainPn.DataPn.Title, ["#desc"] = ScoreMainPn.DataPn.Description, }, ExpressionAttributeValues = new Dictionary <string, AttributeValue>() { [":o"] = new AttributeValue(partitionKey), //[":sum"] = new AttributeValue(DynamoDbConstant.SummarySortKey), }, // TODO DynamoDB のキーの比較では先頭の文字から比較しているっぽいので以下のような比較でも絞り込みができるよう // 先頭は必ず f までのアルファベットになるので summary の s より必ず小さくなる // 検証を行う // KeyConditionExpression = "#o = :o AND #s < :sum", KeyConditionExpression = "#o = :o", ProjectionExpression = "#s, #d.#title, #d.#desc", }; try { var response = await _dynamoDbClient.QueryAsync(request); return(response.Items .Where(x => x[ScoreMainPn.SortKey].S != DynamoDbConstant.SummarySortKey) .Select(x => { var scoreId64 = x[ScoreMainPn.SortKey].S; var title = x[ScoreMainPn.Data].M[ScoreMainPn.DataPn.Title].S; var description = x[ScoreMainPn.Data].M[ScoreMainPn.DataPn.Description].S; var scoreId = _commonLogic.ConvertIdFromDynamo(scoreId64); return new ScoreSummary() { Id = scoreId, OwnerId = ownerId, Title = title, Description = description }; }) .ToArray()); } catch (InternalServerErrorException ex) { Console.WriteLine(ex.Message); throw; } catch (ProvisionedThroughputExceededException ex) { Console.WriteLine(ex.Message); throw; } catch (RequestLimitExceededException ex) { Console.WriteLine(ex.Message); throw; } catch (ResourceNotFoundException ex) { Console.WriteLine(ex.Message); throw; } catch (Exception ex) { Console.WriteLine(ex.Message); throw; } }