Exemplo n.º 1
0
 private OrderGamesDto GetOrderGamesDto(PaymentInfoCache paymentInfoCache) =>
 new OrderGamesDto
 {
     Id          = 0,
     Name        = paymentInfoCache.Game.Name,
     Description = paymentInfoCache.Game.Description
 };
Exemplo n.º 2
0
        /// <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
                });
            }
        }
Exemplo n.º 3
0
        /// <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
            });
        }
Exemplo n.º 4
0
 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
 };
Exemplo n.º 5
0
        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,
            });
        }
Exemplo n.º 6
0
        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);
        }
Exemplo n.º 7
0
        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}. Спасибо за покупку!");