static AttributeValue ConvertFromPage(DynamoDbScorePageV1 page) { var p = new Dictionary <string, AttributeValue>() { [DynamoDbScorePropertyNames.DataPropertyNames.PagesPropertyNames.Id] = new AttributeValue() { N = page.Id.ToString(), } }; if (page.Page != null) { p[DynamoDbScorePropertyNames.DataPropertyNames.PagesPropertyNames.Page] = new AttributeValue(page.Page); } if (page.ItemId != null) { p[DynamoDbScorePropertyNames.DataPropertyNames.PagesPropertyNames.ItemId] = new AttributeValue(page.ItemId); } if (page.ObjectName != null) { p[DynamoDbScorePropertyNames.DataPropertyNames.PagesPropertyNames.ObjectName] = new AttributeValue(page.ObjectName); } if (p.Count == 0) { return(null); } return(new AttributeValue() { M = p }); }
public async Task AddPagesAsync(Guid ownerId, Guid scoreId, List <NewScorePage> pages) { if (pages.Count == 0) { throw new ArgumentException(nameof(pages)); } var(data, oldHash) = await GetAsync(_dynamoDbClient, ScoreTableName, ownerId, scoreId); data.Page ??= new List <DynamoDbScorePageV1>(); var newPages = new List <DynamoDbScorePageV1>(); var newItemRelationSet = new HashSet <string>(); var pageId = data.Page.Count == 0 ? 0 : data.Page.Select(x => x.Id).Max() + 1; foreach (var page in pages) { var itemId = ScoreDatabaseUtils.ConvertToBase64(page.ItemId); var p = new DynamoDbScorePageV1() { Id = pageId++, ItemId = itemId, Page = page.Page, ObjectName = page.ObjectName, }; newPages.Add(p); data.Page.Add(p); newItemRelationSet.Add(itemId); } var newHash = data.CalcDataHash(); var now = ScoreDatabaseUtils.UnixTimeMillisecondsNow(); // TODO ページの追加上限値判定を追加 await UpdateAsync(_dynamoDbClient, ScoreTableName, ownerId, scoreId, newPages, newHash, oldHash, now); await PutItemRelations(_dynamoDbClient, ScoreItemRelationTableName, ownerId, scoreId, newItemRelationSet);
public async Task ReplacePagesAsync(Guid ownerId, Guid scoreId, List <PatchScorePage> pages) { if (pages.Count == 0) { throw new ArgumentException(nameof(pages)); } var(data, oldHash) = await GetAsync(_dynamoDbClient, ScoreTableName, ownerId, scoreId); data.Page ??= new List <DynamoDbScorePageV1>(); var removeRelationItemSet = new HashSet <string>(); var newRelationItemSet = new HashSet <string>(); foreach (var pageV1 in data.Page) { removeRelationItemSet.Add(pageV1.ItemId); } // Key id, Value index var pageIndices = new Dictionary <long, int>(); foreach (var(databaseScoreDataPageV1, index) in data.Page.Select((x, index) => (x, index))) { pageIndices[databaseScoreDataPageV1.Id] = index; } var replacingPages = new List <(DynamoDbScorePageV1 data, int targetIndex)>(); foreach (var page in pages) { var id = page.TargetPageId; if (!pageIndices.TryGetValue(id, out var index)) { throw new InvalidOperationException(); } var itemId = ScoreDatabaseUtils.ConvertToBase64(page.ItemId); var p = new DynamoDbScorePageV1() { Id = id, ItemId = itemId, Page = page.Page, ObjectName = page.ObjectName, }; replacingPages.Add((p, index)); data.Page[index] = p; newRelationItemSet.Add(itemId); } foreach (var pageV1 in data.Page) { removeRelationItemSet.Remove(pageV1.ItemId); } var newHash = data.CalcDataHash(); var now = ScoreDatabaseUtils.UnixTimeMillisecondsNow(); await UpdateAsync(_dynamoDbClient, ScoreTableName, ownerId, scoreId, replacingPages, newHash, oldHash, now); await PutItemRelations(_dynamoDbClient, ScoreItemRelationTableName, ownerId, scoreId, newRelationItemSet); await DeleteItemRelations(_dynamoDbClient, ScoreItemRelationTableName, ownerId, scoreId, removeRelationItemSet);