Exemplo n.º 1
0
 public PaymentController(RegisterOfflineTopUp registerOfflineTopUp, RequestOpenTopUps requestOpenTopUps, ExternalPayment externalPayment)
 {
     _registerOfflineTopUp = registerOfflineTopUp;
     _requestOpenTopUps    = requestOpenTopUps;
     _externalPayment      = externalPayment;
 }
Exemplo n.º 2
0
        public async Task <IActionResult> SendExternalAction([FromBody] SendExternalPaymentModel model)
        {
            if (ModelState.IsValid)
            {
                var receiver = FindReceiver(model.ReceiverType, model.Receiver);
                if (receiver != null)
                {
                    return(await this.SendAction(new SendPaymentModel()
                    {
                        Amount = model.Amount,
                        CurrencyCode = model.CurrencyCode,
                        ReceiverId = receiver.Id
                    }));
                }
                var user = await GetCurrentUserAsync();

                var primaryWallet = await _applicationDbContext.UserPrimaryWallets
                                    .Include(e => e.Wallet)
                                    .FirstOrDefaultAsync(e => e.UserId == user.Id);

                if (primaryWallet == null)
                {
                    _logger.LogInformation(@"User '{user.Id}' does not have an associated primary wallet.");

                    return(BadRequest());
                }

                var currency = await _applicationDbContext.Currencies.FirstOrDefaultAsync(e => e.Code == model.CurrencyCode);

                if (currency == null)
                {
                    return(BadRequest());
                }

                var exchangeRate = await _exchangeRateService.GetExchangeRateAsync(currency.Code);

                var tokens = model.Amount * exchangeRate.Value;

                var wallet = primaryWallet.Wallet;

                if (wallet.Balance < tokens)
                {
                    return(BadRequest());
                }

                using (var dbTransaction = _applicationDbContext.Database.BeginTransaction())
                {
                    try
                    {
                        var externalPayment = new ExternalPayment()
                        {
                            SenderId     = user.Id,
                            ReceiverType = model.ReceiverType,
                            Receiver     = model.Receiver,
                            CurrencyCode = model.CurrencyCode,
                            Amount       = model.Amount,
                            ExchangeRate = exchangeRate.Value,
                            Fee          = 0,
                            Tokens       = tokens,
                            Status       = ExternalPaymentStatus.Pending,
                            CreatedAt    = DateTime.UtcNow
                        };

                        externalPayment.SuspenseWallet = new ExternalPaymentSuspenseWallet()
                        {
                            Label   = Guid.NewGuid().ToString(),
                            Balance = tokens
                        };

                        _applicationDbContext.ExternalPayments.Add(externalPayment);

                        await _applicationDbContext.SaveChangesAsync();

                        dbTransaction.Commit();

                        return(Ok());
                    }
                    catch (Exception ex)
                    {
                        dbTransaction.Rollback();

                        _logger.LogCritical(ex.Message);

                        ModelState.AddModelError(string.Empty, ex.Message);
                    }
                }
            }

            return(BadRequest(ModelState.GetErrorResponse()));
        }