public async Task CreateAsync(ScoreItemDatabaseItemDataBase itemData) { var now = ScoreDatabaseUtils.UnixTimeMillisecondsNow(); var maxSize = _quota.OwnerItemMaxSize; await PutDataAsync(_dynamoDbClient, ScoreTableName, itemData, maxSize, now);
CreateSnapshotAsync(Guid ownerId, Guid scoreId, Guid snapshotId, string snapshotName) { var dynamoDbScore = await GetAsync(_dynamoDbClient, ScoreTableName, ownerId, scoreId); var hashSet = await GetAnnotationsAsync(_dynamoDbClient, ScoreDataTableName, ownerId, scoreId); var descriptionHash = dynamoDbScore.Data.GetDescriptionHash(); var(success, description) = await TryGetDescriptionAsync(_dynamoDbClient, ScoreDataTableName, ownerId, scoreId, descriptionHash); var itemRelationIds = dynamoDbScore.Data.GetPages().Select(x => x.ItemId).ToArray(); if (success) { hashSet[descriptionHash] = description; } var now = ScoreDatabaseUtils.UnixTimeMillisecondsNow(); var maxSnapshotCount = _quota.SnapshotCountMax; await UpdateAsync( _dynamoDbClient, ScoreTableName, ownerId, scoreId, snapshotId , snapshotName, now, maxSnapshotCount); await PutItemRelations(_dynamoDbClient, ScoreItemRelationTableName, ownerId, snapshotId, itemRelationIds); return(dynamoDbScore, hashSet);
public async Task RemoveAnnotationsAsync(Guid ownerId, Guid scoreId, List <long> annotationIds) { if (annotationIds.Count == 0) { throw new ArgumentException(nameof(annotationIds)); } var(data, oldHash) = await GetAsync(_dynamoDbClient, ScoreTableName, ownerId, scoreId); data.Annotations ??= new List <DynamoDbScoreAnnotationV1>(); var existedIdSet = new HashSet <long>(); annotationIds.ForEach(id => existedIdSet.Add(id)); var removeIndices = data.Annotations.Select((x, index) => (x, index)) .Where(x => x.x != null && existedIdSet.Contains(x.x.Id)) .Select(x => x.index) .ToArray(); var removeHashSet = new HashSet <string>(); foreach (var index in removeIndices.Reverse()) { removeHashSet.Add(data.Annotations[index].ContentHash); data.Annotations.RemoveAt(index); } foreach (var annotation in data.Annotations) { if (removeHashSet.Contains(annotation.ContentHash)) { removeHashSet.Remove(annotation.ContentHash); } } var newHash = data.CalcDataHash(); var now = ScoreDatabaseUtils.UnixTimeMillisecondsNow(); await UpdateAsync(_dynamoDbClient, ScoreTableName, ownerId, scoreId, removeIndices, newHash, oldHash, now); if (removeHashSet.Count != 0) { await RemoveDataAsync(_dynamoDbClient, ScoreDataTableName, ownerId, scoreId, removeHashSet); }
public async Task RemovePagesAsync(Guid ownerId, Guid scoreId, List <long> pageIds) { if (pageIds.Count == 0) { throw new ArgumentException(nameof(pageIds)); } var(data, oldHash) = await GetAsync(_dynamoDbClient, ScoreTableName, ownerId, scoreId); data.Page ??= new List <DynamoDbScorePageV1>(); var removeItemRelationSet = new HashSet <string>(); foreach (var pageV1 in data.Page) { removeItemRelationSet.Add(pageV1.ItemId); } var existedIdSet = new HashSet <long>(); pageIds.ForEach(id => existedIdSet.Add(id)); var removeIndices = data.Page.Select((x, index) => (x, index)) .Where(x => x.x != null && existedIdSet.Contains(x.x.Id)) .Select(x => x.index) .ToArray(); foreach (var index in removeIndices.Reverse()) { data.Page.RemoveAt(index); } foreach (var pageV1 in data.Page) { removeItemRelationSet.Remove(pageV1.ItemId); } var newHash = data.CalcDataHash(); var now = ScoreDatabaseUtils.UnixTimeMillisecondsNow(); await UpdateAsync(_dynamoDbClient, ScoreTableName, ownerId, scoreId, removeIndices, newHash, oldHash, now); await DeleteItemRelations(_dynamoDbClient, ScoreItemRelationTableName, ownerId, scoreId, removeItemRelationSet);
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);
public async Task ReplaceAnnotationsAsync(Guid ownerId, Guid scoreId, List <PatchScoreAnnotation> annotations) { if (annotations.Count == 0) { throw new ArgumentException(nameof(annotations)); } var(data, oldHash) = await GetAsync(_dynamoDbClient, ScoreTableName, ownerId, scoreId); data.Annotations ??= new List <DynamoDbScoreAnnotationV1>(); // Key id, Value index var annotationIndices = new Dictionary <long, int>(); foreach (var(ann, index) in data.Annotations.Select((x, index) => (x, index))) { annotationIndices[ann.Id] = index; } var replacingAnnotations = new List <(DynamoDbScoreAnnotationV1 data, int targetIndex)>(); var existedAnnData = new HashSet <string>(); data.Annotations.ForEach(x => existedAnnData.Add(x.ContentHash)); var addAnnData = new Dictionary <string, PatchScoreAnnotation>(); foreach (var ann in annotations) { var id = ann.TargetAnnotationId; if (!annotationIndices.TryGetValue(id, out var index)) { throw new InvalidOperationException(); } var hash = DynamoDbScoreDataUtils.CalcHash(DynamoDbScoreDataUtils.AnnotationPrefix, ann.Content); if (!existedAnnData.Contains(hash)) { addAnnData[hash] = ann; } var a = new DynamoDbScoreAnnotationV1() { Id = id, ContentHash = hash, }; replacingAnnotations.Add((a, index)); data.Annotations[index] = a; } var removeAnnData = existedAnnData.ToHashSet(); foreach (var annotation in data.Annotations) { if (removeAnnData.Contains(annotation.ContentHash)) { removeAnnData.Remove(annotation.ContentHash); } } var newHash = data.CalcDataHash(); var now = ScoreDatabaseUtils.UnixTimeMillisecondsNow(); await UpdateAsync(_dynamoDbClient, ScoreTableName, ownerId, scoreId, replacingAnnotations, newHash, oldHash, now); await AddAnnListAsync(_dynamoDbClient, ScoreDataTableName, ownerId, scoreId, addAnnData); await RemoveAnnListAsync(_dynamoDbClient, ScoreDataTableName, ownerId, scoreId, removeAnnData);