private OrderGamesDto GetOrderGamesDto(PaymentInfoCache paymentInfoCache) => new OrderGamesDto { Id = 0, Name = paymentInfoCache.Game.Name, Description = paymentInfoCache.Game.Description };
/// <summary> /// Добавление сведений о заказе в историю заказов /// </summary> public async Task <OrderInfo> AddOrder(User user, PaymentInfoCache paymentInfoCache, SessionInfo sessionInfo) { using (var transaction = await dbContext.Database.BeginTransactionAsync()) { var orderGamesDto = await AddOrderGamesDto(paymentInfoCache); var orderSellersDto = await AddOrderSellersDto(paymentInfoCache); var orderSessionsDto = await AddOrderSessionsDto(sessionInfo); var orderDto = GetOrderDto(orderGamesDto, orderSellersDto, orderSessionsDto, paymentInfoCache, user); await dbContext.Orders.AddAsync(orderDto); await dbContext.SaveChangesAsync(); await transaction.CommitAsync(); return(new OrderInfo { Id = orderDto.Id, UserId = orderDto.UserId, Key = orderDto.Key, DateTime = orderDto.DateTime.ToString(CultureInfo.InvariantCulture), RecipientEmail = orderDto.RecipientEmail, Amount = orderDto.Amount, Game = orderGamesDto }); } }
/// <summary> /// Распределение денежных средств между плафтормой и продацом /// </summary> private async Task <Earnings> DistributeMoney(PaymentInfoCache paymentInfoCache) { var commission = paymentInfoCache.Amount / 100 * CommissionPercentage; var sellerBalance = dbContext.Balances.FirstOrDefault(balance => balance.UserId == paymentInfoCache.Game.SellerId); var platformStats = dbContext.PlatformStatistics.FirstOrDefault(); if (sellerBalance == null || platformStats == null) { throw new ArgumentException("Не удалось выполнить пополнение баланса"); } var sellerIncome = paymentInfoCache.Amount - commission; sellerBalance.Value += sellerIncome; platformStats.Balance += commission; using (var transaction = await dbContext.Database.BeginTransactionAsync()) { dbContext.Balances.Update(sellerBalance); dbContext.PlatformStatistics.Update(platformStats); await dbContext.SaveChangesAsync(); await transaction.CommitAsync(); } return(new Earnings { Commission = commission, Income = sellerIncome }); }
private OrderDto GetOrderDto(OrderGamesDto orderGamesDto, OrderSellersDto orderSellersDto, OrderSessionsDto orderSessionsDto, PaymentInfoCache paymentInfoCache, User user) => new OrderDto { Id = 0, UserId = user.Id, SellerId = orderSellersDto.Id, GameId = orderGamesDto.Id, SessionId = orderSessionsDto.Id, Key = paymentInfoCache.KeyDto.Key, DateTime = DateTime.Now, RecipientEmail = user.Email, Amount = paymentInfoCache.Amount };
private async Task <OrderSellersDto> GetOrderSellersDto(PaymentInfoCache paymentInfoCache) { var seller = await dbContext.Users.FindAsync(paymentInfoCache.Game.SellerId); if (seller == null) { throw new ArgumentException("Продавец не найден"); } return(new OrderSellersDto { Id = 0, UserName = seller.UserName, Email = seller.Email, IdentityId = seller.Id, }); }
private async Task <OrderGamesDto> AddOrderGamesDto(PaymentInfoCache paymentInfoCache) { var orderGamesDto = GetOrderGamesDto(paymentInfoCache); var orderGamesFromDb = await dbContext.OrderGames.FirstOrDefaultAsync(orderGames => orderGames.Description == orderGamesDto.Description && orderGames.Name == orderGamesDto.Name); if (orderGamesFromDb != null) { return(orderGamesFromDb); } await dbContext.OrderGames.AddAsync(orderGamesDto); await dbContext.SaveChangesAsync(); return(orderGamesDto); }
private async Task <OrderSellersDto> AddOrderSellersDto(PaymentInfoCache paymentInfoCache) { var orderSellersDto = await GetOrderSellersDto(paymentInfoCache); var orderSellersFromDb = await dbContext.OrderSellers.FirstOrDefaultAsync(orderSellers => orderSellers.Email == orderSellersDto.Email && orderSellers.IdentityId == orderSellersDto.IdentityId && orderSellers.UserName == orderSellersDto.UserName); if (orderSellersFromDb != null) { return(orderSellersFromDb); } await dbContext.OrderSellers.AddAsync(orderSellersDto); await dbContext.SaveChangesAsync(); return(orderSellersDto); }
/// <summary> /// Добавление сведений о платежной сессии в кэш. Время сессии - 2 мин. /// </summary> /// <param name="sessionId">Id сессии</param> /// <param name="paymentInfo">Сведения о платеже</param> public void AddPaymentInfo(string sessionId, PaymentInfoCache paymentInfo) { var expirationMinutes = 2; /* Для автоматического удаления записи кэша, по истечению срока годности. * В следствие чего срабатывает и сам Callback - PostEvictionCallbacks. * По умолчанию записи из кэша удаляются лениво, т.е. все истекшие записи хранятся в кэше до следующего обращения к кэшу. */ var expirationToken = new CancellationChangeToken( new CancellationTokenSource(TimeSpan.FromMinutes(expirationMinutes)).Token); cache.Set($"{CacheKeys.Session}_{sessionId}", paymentInfo, new MemoryCacheEntryOptions() { AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(expirationMinutes), ExpirationTokens = { expirationToken }, PostEvictionCallbacks = { new PostEvictionCallbackRegistration() { EvictionCallback = DeletingSessionCallback } } }); }
/// <summary> /// Отправка уведомления о покупке игрового ключа /// </summary> public async Task SendPurchaseNotification(PaymentInfoCache paymentInfoCache) => await SendMessage(paymentInfoCache.Email, "Уведомление о покупке", $"Вы приобрели игровой ключ для игры {paymentInfoCache.Game.Name}. Ваш игровой ключ: {paymentInfoCache.KeyDto.Key}. Спасибо за покупку!");