Ejemplo n.º 1
0
            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
                });
            }
Ejemplo n.º 2
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);
Ejemplo n.º 3
0
        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);