public async Task <InternalTransferPaymentTransactionsDTO> MakeInternalTransferPaymentTransaction(string fromUniqueMasterCitizenNumber, string password, string toUniqueMasterCitizenNumber, decimal amount) { Wallet fromWallet = await CheckForWallet(fromUniqueMasterCitizenNumber, password); Wallet toWallet = await _unitOfWork.WalletRepository .GetFirstWithIncludes(Wallet => Wallet.UniqueMasterCitizenNumber.Value == toUniqueMasterCitizenNumber, Wallet => Wallet.PaymentTransactions ); if (toWallet == null) { throw new ArgumentException($"Wallet with unique master citizen number {toUniqueMasterCitizenNumber} doesn't exist"); } IBankAPI bankAPI = _bankAPIDeterminator.DeterminateBankAPI(fromWallet.SupportedBank); IBankAPI secondBankAPI = _bankAPIDeterminator.DeterminateBankAPI(toWallet.SupportedBank); InternalTransferPaymentTransactions paymentTransactions = fromWallet.MakeInternalTransfer(toWallet, amount); bool successWithdrawal = await bankAPI.Withdraw(fromUniqueMasterCitizenNumber, fromWallet.PostalIndexNumber, amount); if (!successWithdrawal) { CleanupWallets(fromWallet, toWallet, paymentTransactions); throw new BankAPIException("Bank api - failed to withdrawal"); } bool successDeposit = await secondBankAPI.Withdraw(toUniqueMasterCitizenNumber, toWallet.PostalIndexNumber, amount); if (!successDeposit) { CleanupWallets(fromWallet, toWallet, paymentTransactions); throw new BankAPIException("Bank api - failed to deposit"); } await _unitOfWork.PaymentTransactionRepository.Insert(paymentTransactions.Deposit); await _unitOfWork.PaymentTransactionRepository.Insert(paymentTransactions.Withdrawal); if (paymentTransactions.HasFee()) { await _unitOfWork.PaymentTransactionRepository.Insert(paymentTransactions.Fee); } await _unitOfWork.SaveChangesAsync(); return(new InternalTransferPaymentTransactionsDTO(paymentTransactions)); }
public async Task <DepositPaymentTransactionDTO> MakeDepositPaymentTransaction(string uniqueMasterCitizenNumber, string password, decimal amount) { Wallet wallet = await CheckForWallet(uniqueMasterCitizenNumber, password); IBankAPI bankAPI = _bankAPIDeterminator.DeterminateBankAPI(wallet.SupportedBank); DepositPaymentTransaction depositPaymentTransaction = wallet.MakeDepositTransaction(amount); bool successWithdrawal = await bankAPI.Withdraw(uniqueMasterCitizenNumber, wallet.PostalIndexNumber, amount); if (!successWithdrawal) { wallet.DeletePaymentTransaction(depositPaymentTransaction); throw new BankAPIException("Bank api - failed to withdrawal"); } await _unitOfWork.PaymentTransactionRepository.Insert(depositPaymentTransaction); await _unitOfWork.SaveChangesAsync(); return(new DepositPaymentTransactionDTO(depositPaymentTransaction)); }