コード例 #1
0
        public async Task UpdateByCurrencyAndOperationType(UpdateVoucherOperationsStatistic partnerStatistic)
        {
            using (var context = _contextFactory.CreateDataContext())
            {
                var entity = await context.VoucherOperationsStatistics
                             .FirstOrDefaultAsync(x =>
                                                  x.PartnerId == partnerStatistic.PartnerId &&
                                                  x.Currency == partnerStatistic.Currency &&
                                                  x.OperationType == partnerStatistic.OperationType);

                if (entity != null)
                {
                    entity.TotalCount++;
                    entity.Sum += partnerStatistic.Amount;

                    context.Update(entity);
                }
                else
                {
                    var newEntity = new VoucherOperationsStatisticsEntity()
                    {
                        PartnerId     = partnerStatistic.PartnerId,
                        Currency      = partnerStatistic.Currency,
                        Sum           = partnerStatistic.Amount,
                        OperationType = partnerStatistic.OperationType,
                        TotalCount    = 1
                    };

                    context.VoucherOperationsStatistics.Add(newEntity);
                }

                await context.SaveChangesAsync();
            }
        }
        public async Task UpdateVoucherOperationsStatistic(UpdateVoucherOperationsStatistic partnerStatistic)
        {
            var lockValue = $"{partnerStatistic.PartnerId}_{partnerStatistic.OperationType}_{partnerStatistic.Currency}";

            for (var i = 0; i < MaxAttemptsCount; ++i)
            {
                var locked = await _redisLocksService.TryAcquireLockAsync(
                    lockValue,
                    lockValue,
                    _lockTimeOut);

                if (!locked)
                {
                    await Task.Delay(_lockTimeOut);

                    continue;
                }

                await _voucherOperationsStatisticRepository.UpdateByCurrencyAndOperationType(partnerStatistic);

                await _partnerVouchersDailyStatsRepository.UpdateByDateAndCurrencyAndOperationType(partnerStatistic);

                await _redisLocksService.ReleaseLockAsync(lockValue, lockValue);

                return;
            }

            throw new InvalidOperationException("Couldn't acquire a lock in Redis");
        }
        public async Task AddRegistrationDateAsync(Guid customerId, Guid?partnerId, DateTime registrationDate,
                                                   VoucherOperationType operationType, decimal amount, string currency)
        {
            await _customerRegistrationRepository.InsertIfNotExistsAsync(customerId, partnerId, registrationDate);

            var model = new UpdateVoucherOperationsStatistic()
            {
                PartnerId     = partnerId.GetValueOrDefault(),
                Amount        = amount,
                OperationType = operationType,
                Currency      = currency,
            };

            await _voucherOperationsStatisticService.UpdateVoucherOperationsStatistic(model);
        }