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); }