public PaymentController(RegisterOfflineTopUp registerOfflineTopUp, RequestOpenTopUps requestOpenTopUps, ExternalPayment externalPayment) { _registerOfflineTopUp = registerOfflineTopUp; _requestOpenTopUps = requestOpenTopUps; _externalPayment = externalPayment; }
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())); }