Пример #1
0
        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)));
        }
Пример #2
0
        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));
        }
Пример #3
0
        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));
        }
Пример #4
0
        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);
        }