public async Task CommitBatchAsync(IEnumerable <CelebrityEventBase> events, CancellationToken cancellationToken = default)
        {
            if (events is null)
            {
                throw new ArgumentNullException(nameof(events));
            }

            var celebrityEvents = events.ToList();

            if (celebrityEvents.Any() is false)
            {
                return;
            }

            var table  = _dbContext.GetTargetTable <DynamoDbEventModel>(_configuration);
            var writer = table.CreateBatchWrite();

            var eventModels = ParseToDynamoDbEventModels(celebrityEvents);

            foreach (var document in eventModels.Select(@event => _dbContext.ToDocument(@event)))
            {
                writer.AddDocumentToPut(document);
            }

            await writer.ExecuteAsync(cancellationToken);
        }
Exemple #2
0
        public DataRepository(ILogger <DataRepository> logger)
        {
            _logger = logger;

            AWSConfigsDynamoDB.Context.TypeMappings[typeof(Church)] =
                new TypeMapping(typeof(Church), DdbTableNames.ChurchtableName);
            AWSConfigsDynamoDB.Context.TypeMappings[typeof(Family)] =
                new TypeMapping(typeof(Family), DdbTableNames.FamilytableName);
            AWSConfigsDynamoDB.Context.TypeMappings[typeof(Member)] =
                new TypeMapping(typeof(Member), DdbTableNames.MembertableName);

            var config = new Amazon.DynamoDBv2.DataModel.DynamoDBContextConfig
            {
                Conversion       = DynamoDBEntryConversion.V2,
                IgnoreNullValues = true
            };

            _ddbContext = new DynamoDBContext(new AmazonDynamoDBClient(), config);

            _churchesTable = _ddbContext.GetTargetTable <Church>(new DynamoDBOperationConfig {
                IgnoreNullValues = true
            });
            _familiesTable = _ddbContext.GetTargetTable <Family>(new DynamoDBOperationConfig {
                IgnoreNullValues = true
            });
            _membersTable = _ddbContext.GetTargetTable <Member>(new DynamoDBOperationConfig {
                IgnoreNullValues = true
            });
        }
Exemple #3
0
        public async Task <IActionResult> CountVotesAsync()
        {
            var table      = _context.GetTargetTable <User>();
            var voteResult = await table.GetItemAsync("VoteResult");

            if (voteResult != null)
            {
                return(NoContent());
            }

            var showIdToPhoneNumbers = (await _showsRepository.GetShowsAsync())
                                       .ToDictionary(show => show.Id, ignore => new List <string>());

            var users = await _usersRepository.GetUsersAsync();

            int totalVotes = 0;

            foreach (var user in users)
            {
                foreach (var showId in user.Votes)
                {
                    showIdToPhoneNumbers[showId].Add(user.Id);
                    totalVotes++;
                }
            }

            if (totalVotes == 0)
            {
                return(BadRequest("No votes"));
            }

            var result = showIdToPhoneNumbers.Select(pair =>
            {
                var doc           = new Document();
                doc["showId"]     = pair.Key;
                doc["votesCount"] = pair.Value.Count;
                doc["votes"]      = pair.Value;
                doc["voteRate"]   = (pair.Value.Count / (decimal)totalVotes).ToString("P");
                return(doc);
            })
                         .OrderByDescending(show => show["votesCount"].AsInt())
                         .ToList();

            var doc = new Document();

            doc["Id"]     = "VoteResult";
            doc["Result"] = result;
            await table.PutItemAsync(doc);

            return(NoContent());
        }
        public static async Task <PagedResult <TEntity> > GetPagedQueryResultsAsync <TEntity>(
            this IDynamoDBContext dynamoDbContext, QueryOperationConfig queryConfig) where TEntity : class
        {
            var dbResults = new List <TEntity>();
            var table     = dynamoDbContext.GetTargetTable <TEntity>();

            var search     = table.Query(queryConfig);
            var resultsSet = await search.GetNextSetAsync().ConfigureAwait(false);

            var paginationToken = search.PaginationToken;

            if (resultsSet.Any())
            {
                dbResults.AddRange(dynamoDbContext.FromDocuments <TEntity>(resultsSet));

                // Look ahead for any more, but only if we have a token
                if (!string.IsNullOrEmpty(PaginationDetails.EncodeToken(paginationToken)))
                {
                    queryConfig.PaginationToken = paginationToken;
                    queryConfig.Limit           = 1;
                    search     = table.Query(queryConfig);
                    resultsSet = await search.GetNextSetAsync().ConfigureAwait(false);

                    if (!resultsSet.Any())
                    {
                        paginationToken = null;
                    }
                }
            }

            return(new PagedResult <TEntity>(dbResults, new PaginationDetails(paginationToken)));
        }
Exemple #5
0
        public async Task Create(TDTO dto)
        {
            var table = DynamoDbContext.GetTargetTable <TDTO>();

            var document = DynamoDbContext.ToDocument(dto);

            var expectedState = _dynamoDbResourcePolicy.GetExpectedState(false, dto);

            try
            {
                await table.PutItemAsync(document, new PutItemOperationConfig { ExpectedState = expectedState });
            }
            catch (ConditionalCheckFailedException)
            {
                throw new ValidationException(ErrorCodes.DuplicateItem, $"The same key {_dynamoDbResourcePolicy.GetKey(dto)} already exists");
            }
        }
 public static Table TryGetTargetTable<T>(
     this IDynamoDBContext dynamoDBContext,
     DynamoDBOperationConfig operationConfig = null)
 {
     try
     {
         return dynamoDBContext.GetTargetTable<T>(operationConfig);
     }
     catch
     {
         return default(Table);
     }
 }
        public async Task <PagedResult <Note> > GetByTargetIdAsync(GetNotesByTargetIdQuery query)
        {
            int pageSize = query.PageSize.HasValue ? query.PageSize.Value : MAX_RESULTS;
            var dbNotes  = new List <NoteDb>();
            var table    = _dynamoDbContext.GetTargetTable <NoteDb>();

            var queryConfig = new QueryOperationConfig
            {
                IndexName       = GETNOTESBYTARGETIDINDEX,
                BackwardSearch  = true,
                ConsistentRead  = true,
                Limit           = pageSize,
                PaginationToken = PaginationDetails.DecodeToken(query.PaginationToken),
                Filter          = new QueryFilter(TARGETID, QueryOperator.Equal, query.TargetId)
            };
            var search = table.Query(queryConfig);

            _logger.LogDebug($"Querying {queryConfig.IndexName} index for targetId {query.TargetId}");
            var resultsSet = await search.GetNextSetAsync().ConfigureAwait(false);

            var paginationToken = search.PaginationToken;

            if (resultsSet.Any())
            {
                dbNotes.AddRange(_dynamoDbContext.FromDocuments <NoteDb>(resultsSet));

                // Look ahead for any more, but only if we have a token
                if (!string.IsNullOrEmpty(PaginationDetails.EncodeToken(paginationToken)))
                {
                    queryConfig.PaginationToken = paginationToken;
                    queryConfig.Limit           = 1;
                    search     = table.Query(queryConfig);
                    resultsSet = await search.GetNextSetAsync().ConfigureAwait(false);

                    if (!resultsSet.Any())
                    {
                        paginationToken = null;
                    }
                }
            }

            return(new PagedResult <Note>(dbNotes.Select(x => x.ToDomain()), new PaginationDetails(paginationToken)));
        }
Exemple #8
0
 protected Repository(IDynamoDBContext context)
 {
     _context = context;
     _table   = _context.GetTargetTable <TModel>();
 }