public async Task <DepositResult> Deposit(CreateDeposit depositInfo) { _logger.LogInformation($"{nameof(AccountService)}.{nameof(Deposit)} - {depositInfo}"); Account account = await _unitOfWork.Accounts.FindByIdAsync(depositInfo.AccountId); if (account == null) { return(new DepositResult(depositInfo.AccountId, AccountStatus.Error, "Account id not be found", Currency.None, Amount.FromInput(depositInfo.Amount.Value), Amount.None, Amount.None)); } decimal oldBalance = account.Balance; account.Balance += depositInfo.Amount.Value; await _unitOfWork.Accounts.UpdateAsync(account); Transaction transaction = new Transaction { AccountId = depositInfo.AccountId, Type = TransactionType.Deposit.ToString(), Amount = depositInfo.Amount.Value, Balance = account.Balance, Timestamp = DateTime.Now }; await _unitOfWork.Transactions.AddAsync(transaction); await _unitOfWork.Complete(); return(new DepositResult(account.Id, AccountStatus.Success, $"Successfully deposited {depositInfo.Amount.Value} into account", Currency.FromInput(depositInfo.Currency.Value), Amount.FromInput(depositInfo.Amount.Value), Amount.FromInput(oldBalance), Amount.FromInput(account.Balance))); }
private async Task <CreateDeposit> CreateDepositFromLocalCurrency(CreateDepositRequest request, CancellationToken token) { CreateDeposit deposit = new CreateDeposit(request.AccountId, Amount.FromInput(request.Amount), Currency.FromInput(request.Currency)); return(await Task.FromResult(deposit)); }
public async Task <IActionResult> Deposit(CreateDepositRequest request, CancellationToken token) { _logger.LogInformation($"{nameof(AccountController)}.{nameof(Deposit)} - {request}"); if (!ModelState.IsValid) { return(BadRequest($"Problem with CreateDepositRequest")); } if (!Currencies.IsValid(request.Currency.ToUpperInvariant())) { return(BadRequest($"Currency symbol entered is invalid!")); } CreateDeposit deposit = await CreateDepositFromLocalCurrency(request, token); if (!_options.BaseCurrency.Equals(request.Currency, StringComparison.InvariantCultureIgnoreCase)) { deposit = await CreateDepositFromForeignCurrency(request, token); } DepositResult depositResult = await _accountService.Deposit(deposit); if (depositResult.Status == AccountStatus.Error) { return(BadRequest($"{depositResult.Message}")); } AccountDepositResponse response = new AccountDepositResponse(depositResult.AccountId, depositResult.Amount.Value, depositResult.Currency.Value, depositResult.OldBalance.Value, depositResult.NewBalance.Value); return(Ok(response)); }
private async Task <CreateDeposit> CreateDepositFromForeignCurrency(CreateDepositRequest request, CancellationToken token) { Rate rate = await _ratesService.GetExchangeRate(Currency.FromInput(request.Currency), Currency.FromInput(_options.BaseCurrency), token); decimal convertedAmount = request.Amount * rate.ConversionValue; CreateDeposit deposit = new CreateDeposit(request.AccountId, Amount.FromInput(convertedAmount), Currency.FromInput(request.Currency)); return(deposit); }