/// <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); }
private bool IsTransferAllowed(FundTransferCommand request) { if (request.AccountNumCredit == request.AccountNumDebit) { return(false); } if (request.Amount == decimal.Zero) { return(false); } return(true); }
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); } })); }