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)); }
public async Task <WalletDTO> CreateNewWallet(string uniqueMasterCitizenNumberValue, string postalIndexNumber, int supportedBankId, string firstName, string lastName) { SupportedBank supportedBank = await _unitOfWork.SupportedBankRepository.GetById(supportedBankId); if (supportedBank == null) { throw new ArgumentException($"Supported bank with id {supportedBankId} does not exist"); } IBankAPI bankAPI = _bankAPIDeterminator.DeterminateBankAPI(supportedBank); bool validStatus = await bankAPI.CheckStatus(uniqueMasterCitizenNumberValue, postalIndexNumber); if (!validStatus) { throw new BankAPIException("Bank api - invalid status"); } Wallet existingWallet = await _unitOfWork.WalletRepository.GetFirstOrDefault(Wallet => Wallet.UniqueMasterCitizenNumber.Value == uniqueMasterCitizenNumberValue ); if (existingWallet != null) { throw new ExistingWalletException("Wallet already exist with same UMCN"); } UniqueMasterCitizenNumber uniqueMasterCitizenNumber = new UniqueMasterCitizenNumber(uniqueMasterCitizenNumberValue); if (!uniqueMasterCitizenNumber.ValidForPlatform()) { throw new NotValidUniqueMasterCitizenNumberException("Unique master citizen number not valid for platform"); } string walletPassword = PasswordGenerator.WalletPassword(); Wallet wallet = new Wallet(uniqueMasterCitizenNumberValue, supportedBank, firstName, lastName, walletPassword, postalIndexNumber); await _unitOfWork.WalletRepository.Insert(wallet); await _unitOfWork.SaveChangesAsync(); return(new WalletDTO(wallet)); }