Пример #1
0
        /// <summary>
        /// Handles <c>FundTransferCommand</c> command
        /// </summary>
        /// <param name="request">The command</param>
        /// <param name="cancellationToken">Cancellation token</param>
        /// <returns>
        /// Result of command execution
        /// </returns>
        public async Task <ExecutionResult <FundTransferResponse> > Handle(FundTransferCommand request, CancellationToken cancellationToken)
        {
            bool    transferResult = false;
            Account debitAccount   = null;
            Account creditAccount  = null;
            ExecutionResult <FundTransferResponse> response;

            using var connection = await _dbConnectionFactory.CreateConnectionAsync();

            var repository = new AccountRepository(connection);

            if (IsTransferAllowed(request))
            {
                var updatedAccounts = await repository.TransferAsync(request.AccountNumCredit, request.AccountNumDebit, request.Amount);

                foreach (var item in updatedAccounts)
                {
                    if (item.AccountNum == request.AccountNumDebit)
                    {
                        debitAccount = item;
                    }
                    else
                    {
                        creditAccount = item;
                    }

                    transferResult = true;
                }
            }

            if (transferResult == false)
            {
                debitAccount = await repository.ReadById(request.AccountNumDebit);

                creditAccount = await repository.ReadById(request.AccountNumCredit);
            }

            if (debitAccount == null || creditAccount == null)
            {
                response = new ExecutionResult <FundTransferResponse>(new AccountNotExistDescription("One of the accounts is not exist"));
            }
            else
            {
                response = new ExecutionResult <FundTransferResponse>(
                    new FundTransferResponse(creditAccount.AccountNum, creditAccount.Balance,
                                             debitAccount.AccountNum, debitAccount.Balance,
                                             transferResult));
            }

            return(response);
        }
Пример #2
0
        private bool IsTransferAllowed(FundTransferCommand request)
        {
            if (request.AccountNumCredit == request.AccountNumDebit)
            {
                return(false);
            }

            if (request.Amount == decimal.Zero)
            {
                return(false);
            }

            return(true);
        }
Пример #3
0
 public async Task <ActionResult <FundTransferResponse> > Transfer([FromBody, Required] FundTransferCommand fundTransferCommand)
 {
     return(await _mediator.SendWithActionResult(fundTransferCommand,
                                                 result => Ok(result),
                                                 result =>
     {
         if (result.Description is AccountNotExistDescription)
         {
             return StatusCode((int)HttpStatusCode.NotFound, result.Description.Message);
         }
         else
         {
             return BadRequest(result.Description.Message);
         }
     }));
 }