public async Task <IActionResult> CheckPaymentTestAsync([FromForm] PaymentSuccessInput paymentSuccessInput)
        {
            await _paymentService.RefillBalanceAsync(paymentSuccessInput);

            // TODO: Менять при тесте на http://localhost:8080/home или для прода https://barbuuuda.ru
            return(new RedirectResult("http://localhost:8080/home"));
            //return new RedirectResult(" https://barbuuuda.ru");
            //return new RedirectResult(" https://barbuuuda.com");
        }
예제 #2
0
        /// <summary>
        /// Метод пополнит счет пользователя на сервисе в переданной валюте, либо создаст новый счет в этой валюте.
        /// Также в этом методе происходит запись заказа в БД.
        /// Также этот метод производит вычитание суммы при оплате задания со счета заказчика.
        /// </summary>
        /// <param name="paymentSuccessInput">Входная модель.</param>
        /// <returns>Флаг успеха.</returns>
        public async Task <bool> RefillBalanceAsync(PaymentSuccessInput paymentSuccessInput)
        {
            try
            {
                OrderEntity     order;
                IFormatProvider formatter = new NumberFormatInfo {
                    NumberDecimalSeparator = "."
                };

                // Найдет Id пользователя по его логину.
                string userId = await _userService.GetUserIdByLogin(paymentSuccessInput.Account);

                if (string.IsNullOrEmpty(userId))
                {
                    throw new NotFoundUserException(paymentSuccessInput.Account);
                }

                if (paymentSuccessInput.LMI_PAYMENT_AMOUNT == null || string.IsNullOrEmpty(paymentSuccessInput.LMI_CURRENCY))
                {
                    throw new EmptyInvoiceParameterException();
                }

                // Если валюта не передана, значит выставить ее по дефолту в RUB.
                if (!string.IsNullOrEmpty(paymentSuccessInput.LMI_CURRENCY))
                {
                    paymentSuccessInput.LMI_CURRENCY = CurrencyType.CURRENCY_RUB;
                }

                // Если идет пополнение счета.
                if (paymentSuccessInput.Refill)
                {
                    // Ищет счет пользователя по UserId.
                    InvoiceEntity invoice = await _postgre.Invoices
                                            .Where(i => i.UserId
                                                   .Equals(userId) && i.Currency
                                                   .Equals(paymentSuccessInput.LMI_CURRENCY))
                                            .FirstOrDefaultAsync();

                    // Если счет пользователя в текущей валюте найден, то запишет средства на этот счет в этой валюте.
                    if (invoice != null)
                    {
                        invoice.InvoiceAmount += decimal.Parse(paymentSuccessInput.LMI_PAYMENT_AMOUNT, formatter);
                        await _postgre.SaveChangesAsync();
                    }

                    // Счета у пользователя в этой валюте не найдено, значит создаст счет в этой валюте.
                    else
                    {
                        await _postgre.Invoices.AddAsync(new InvoiceEntity
                        {
                            UserId        = userId,
                            InvoiceAmount = 0,
                            Currency      = paymentSuccessInput.LMI_CURRENCY,
                            ScoreNumber   = null,
                            ScoreEmail    = string.Empty
                        });

                        await _postgre.SaveChangesAsync();
                    }

                    order = new OrderEntity
                    {
                        Id         = userId,
                        Amount     = decimal.Parse(paymentSuccessInput.LMI_PAYMENT_AMOUNT, formatter),
                        Currency   = paymentSuccessInput.LMI_CURRENCY,
                        DateCreate = DateTime.Now
                    };
                }

                // Если идет оплата задания.
                else
                {
                    order = new OrderEntity
                    {
                        Id         = userId,
                        Amount     = decimal.Parse(paymentSuccessInput.LMI_PAYMENT_AMOUNT, formatter),
                        TaskId     = paymentSuccessInput.TaskId,
                        Currency   = paymentSuccessInput.LMI_CURRENCY,
                        DateCreate = DateTime.Now
                    };
                }

                // Запишет заказ пользователя в таблицу заказов.
                await _postgre.Orders.AddAsync(order);

                await _postgre.SaveChangesAsync();

                return(true);
            }

            catch (Exception ex)
            {
                Console.WriteLine(ex);
                Logger logger = new Logger(_db, ex.GetType().FullName, ex.Message, ex.StackTrace);
                await logger.LogCritical();

                throw;
            }
        }