示例#1
0
        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);
示例#3
0
        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);
示例#5
0
        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);
示例#7
0
        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);