public async Task <ActionResult> Post(LancamentoRequest lancamentoRequest, CancellationToken cancellationToken) { var result = await _lancamentoAppService.PerformOperationAsync(lancamentoRequest, cancellationToken); return (StatusCode((int)result.StatusCode, result)); }
private Task <Result <decimal> > ValidateOperation(LancamentoRequest lancamentoRequest) { var objLancamento = base._mapper.Map <LancamentoRequest, Lancamento>(lancamentoRequest); if (!objLancamento.IsValid(EValidationStage.Insert)) { return(Task.FromResult(new Result <decimal>(0, HttpStatusCode.BadRequest, objLancamento.ValidationErrors))); } return(Task.FromResult(new Result <decimal>(0, HttpStatusCode.OK, null))); }
public async void TestCreateLancamentoDepositoContaDestinoEmptyError() { var objLancamento = new LancamentoRequest() { Id = "ABC", EOperacao = EOperacao.Deposito, IdContaDestino = "", IdContaOrigem = "01030-20", Valor = 100 }; var result = await _lancamentoApp.InsertOneAsync(objLancamento, _cancellationToken); Assert.Contains(result.Failures, x => x.ErrorMessage == "IdContaDestino can't be null."); Assert.True(result.StatusCode == HttpStatusCode.BadRequest); Assert.True(string.IsNullOrWhiteSpace(result.Value)); }
public async void TestTransferOk() { var objLancamentoRequest = new LancamentoRequest() { Id = "ABC", EOperacao = EOperacao.Transferencia, IdContaDestino = "3", IdContaOrigem = "2", Valor = 100 }; var result = await _lancamentoApp.PerformOperationAsync(objLancamentoRequest, _cancellationToken); Assert.True(result.StatusCode == HttpStatusCode.Created); Assert.True(result.Failures == null); Assert.True(result.Value == "ABC"); }
public async void TestTransferInsufficientFundsError() { var objLancamentoRequest = new LancamentoRequest() { Id = "ABC", EOperacao = EOperacao.Transferencia, IdContaDestino = "2", IdContaOrigem = "3", Valor = 200 }; var result = await _lancamentoApp.PerformOperationAsync(objLancamentoRequest, _cancellationToken); Assert.True(result.StatusCode == HttpStatusCode.BadRequest); Assert.Contains(result.Failures, x => x.ErrorMessage == "Insufficient funds."); Assert.True(string.IsNullOrWhiteSpace(result.Value)); }
public async void TestTransferUpdateBalanceError() { var objLancamentoRequest = new LancamentoRequest() { Id = "ABC", EOperacao = EOperacao.Transferencia, IdContaDestino = "3", IdContaOrigem = "1", Valor = 100 }; var result = await _lancamentoApp.PerformOperationAsync(objLancamentoRequest, _cancellationToken); Assert.True(result.StatusCode == HttpStatusCode.InternalServerError); Assert.Contains(result.Failures, x => x.ErrorMessage == "Cannot update balance."); Assert.True(string.IsNullOrWhiteSpace(result.Value)); }
public async void TestCreateLancamentoEOperacaoInvalidError() { var objLancamento = new LancamentoRequest() { Id = "ABC", EOperacao = (EOperacao)999, IdContaDestino = "01020-30", IdContaOrigem = "01030-20", Valor = 100 }; var result = await _lancamentoApp.InsertOneAsync(objLancamento, _cancellationToken); Assert.Contains(result.Failures, x => x.ErrorMessage == "EOperacao is invalid."); Assert.True(result.StatusCode == HttpStatusCode.BadRequest); Assert.True(string.IsNullOrWhiteSpace(result.Value)); }
public async void TestWithdrawIdContaOrigemNotFoundError() { var objLancamentoRequest = new LancamentoRequest() { Id = "ABC", EOperacao = EOperacao.Saque, IdContaDestino = "", IdContaOrigem = "0", Valor = 100 }; var result = await _lancamentoApp.PerformOperationAsync(objLancamentoRequest, _cancellationToken); Assert.True(result.StatusCode == HttpStatusCode.NotFound); Assert.Contains(result.Failures, x => x.ErrorMessage == "Conta not found."); Assert.True(string.IsNullOrWhiteSpace(result.Value)); }
public async void TestPerformOperationInvalidOperationError() { var objLancamentoRequest = new LancamentoRequest() { Id = "ABC", EOperacao = (EOperacao)999, IdContaDestino = "", IdContaOrigem = "", Valor = 100 }; var result = await _lancamentoApp.PerformOperationAsync(objLancamentoRequest, _cancellationToken); Assert.True(result.StatusCode == HttpStatusCode.BadRequest); Assert.Contains(result.Failures, x => x.ErrorMessage == "Operation kind not supported."); Assert.True(string.IsNullOrWhiteSpace(result.Value)); }
public async void TestReplaceLancamentoValorZeroError() { var objLancamento = new LancamentoRequest() { Id = "ABC", EOperacao = EOperacao.Transferencia, IdContaDestino = "01020-20", IdContaOrigem = "01020-30", Valor = 0 }; var result = await _lancamentoApp.InsertOneAsync(objLancamento, _cancellationToken); Assert.Contains(result.Failures, x => x.ErrorMessage == "Valor must be highter than R$ 0,00."); Assert.True(result.StatusCode == HttpStatusCode.BadRequest); Assert.True(string.IsNullOrWhiteSpace(result.Value)); }
public async void TestReplaceLancamentoSaqueContaDestinoEmptyOk() { var objLancamento = new LancamentoRequest() { Id = "ABC", EOperacao = EOperacao.Saque, IdContaDestino = "", IdContaOrigem = "01020-30", Valor = 100 }; var result = await _lancamentoApp.InsertOneAsync(objLancamento, _cancellationToken); Assert.True(result.Failures == null); Assert.True(result.StatusCode == HttpStatusCode.Created); Assert.True(result.Value == "ABC"); }
public async void TestCreateLancamentoTransferenciaContaOrigemSameThatContaDestinoDestinoError() { var objLancamento = new LancamentoRequest() { Id = "ABC", EOperacao = EOperacao.Transferencia, IdContaDestino = "01020-30", IdContaOrigem = "01020-30", Valor = 100 }; var result = await _lancamentoApp.InsertOneAsync(objLancamento, _cancellationToken); Assert.Contains(result.Failures, x => x.ErrorMessage == "IdContaOrigem can't be the same that IdContaDestino."); Assert.True(result.StatusCode == HttpStatusCode.BadRequest); Assert.True(string.IsNullOrWhiteSpace(result.Value)); }
public async Task <Result <string> > PerformOperationAsync(LancamentoRequest lancamentoRequest, CancellationToken cancellationToken) { if (lancamentoRequest == null) { return(new Result <string>(null, HttpStatusCode.BadRequest, Failure.GenerateOneFailure("Object is null."))); } Result <decimal> result; switch (lancamentoRequest.EOperacao) { case EOperacao.Deposito: { result = await _lancamentoService.DepositAsync(lancamentoRequest); break; } case EOperacao.Saque: { result = await _lancamentoService.WithdrawAsync(lancamentoRequest); break; } case EOperacao.Transferencia: { result = await _lancamentoService.TransferAsync(lancamentoRequest); break; } default: return(new Result <string>(null, HttpStatusCode.BadRequest, Failure.GenerateOneFailure("Operation kind not supported."))); } if (!result.StatusCode.IsSuccessStatusCode()) { return(new Result <string>(null, result.StatusCode, result.Failures)); } return (await _lancamentoService.InsertOneAsync(lancamentoRequest, cancellationToken)); }
public async Task <Result <decimal> > WithdrawAsync(LancamentoRequest lancamentoRequest) { try { var validation = await ValidateOperation(lancamentoRequest); if (!validation.StatusCode.IsSuccessStatusCode()) { return(validation); } var sourceAccount = await _contaService.GetByIdAsync <ContaResponse>(lancamentoRequest.IdContaOrigem); var sourceAccountRequest = _mapper.Map <ContaResponse, ContaRequest>(sourceAccount.Value); lancamentoRequest.ContaOrigem = sourceAccountRequest; if (!sourceAccount.StatusCode.IsSuccessStatusCode()) { return(new Result <decimal>(0, sourceAccount.StatusCode, sourceAccount.Failures)); } var account = base._mapper.Map <ContaResponse, Conta>(sourceAccount.Value); var newBalance = await account.DecreaseBalance(lancamentoRequest.Valor); if (!newBalance.StatusCode.IsSuccessStatusCode()) { return(new Result <decimal>(0, newBalance.StatusCode, newBalance.Failures)); } var updateBalance = await _contaService.UpdateBalanceAsync(account.Id, newBalance.Value); if (!updateBalance.StatusCode.IsSuccessStatusCode()) { return(new Result <decimal>(0, updateBalance.StatusCode, updateBalance.Failures)); } return(new Result <decimal>(newBalance.Value, HttpStatusCode.OK, null)); } catch (Exception ex) { return(new Result <decimal>(0, HttpStatusCode.InternalServerError, Failure.GenerateOneFailure(ex.Message))); } }
public async Task <Result <decimal> > TransferAsync(LancamentoRequest lancamentoRequest) { try { #region Validate the operation var validation = await ValidateOperation(lancamentoRequest); if (!validation.StatusCode.IsSuccessStatusCode()) { return(validation); } #endregion #region Map the account object, so we can track the operation var sourceAccountResponse = await _contaService.GetByIdAsync <ContaResponse>(lancamentoRequest.IdContaOrigem); var targetAccountResponse = await _contaService.GetByIdAsync <ContaResponse>(lancamentoRequest.IdContaDestino); var sourceAccountRequest = _mapper.Map <ContaResponse, ContaRequest>(sourceAccountResponse.Value); var targetAccountRequest = _mapper.Map <ContaResponse, ContaRequest>(targetAccountResponse.Value); lancamentoRequest.ContaOrigem = sourceAccountRequest; lancamentoRequest.ContaDestino = targetAccountRequest; if (!sourceAccountResponse.StatusCode.IsSuccessStatusCode()) { return(new Result <decimal>(0, sourceAccountResponse.StatusCode, sourceAccountResponse.Failures)); } if (!targetAccountResponse.StatusCode.IsSuccessStatusCode()) { return(new Result <decimal>(0, targetAccountResponse.StatusCode, targetAccountResponse.Failures)); } var sourceAccount = base._mapper.Map <ContaResponse, Conta>(sourceAccountResponse.Value); var targetAccount = base._mapper.Map <ContaResponse, Conta>(targetAccountResponse.Value); #endregion #region Decrease Balance var newBalanceSourceAccount = await sourceAccount.DecreaseBalance(lancamentoRequest.Valor); if (!newBalanceSourceAccount.StatusCode.IsSuccessStatusCode()) { return(new Result <decimal>(0, newBalanceSourceAccount.StatusCode, newBalanceSourceAccount.Failures)); } #endregion #region Increase Balance var newBalanceTargetAccount = await targetAccount.IncreaseBalance(lancamentoRequest.Valor); if (!newBalanceTargetAccount.StatusCode.IsSuccessStatusCode()) { return(new Result <decimal>(0, newBalanceTargetAccount.StatusCode, newBalanceTargetAccount.Failures)); } #endregion #region Update Balance var updateBalance = await _contaService.UpdateBalanceAsync(sourceAccount.Id, newBalanceSourceAccount.Value); if (!updateBalance.StatusCode.IsSuccessStatusCode()) { return(new Result <decimal>(0, updateBalance.StatusCode, updateBalance.Failures)); } updateBalance = await _contaService.UpdateBalanceAsync(targetAccount.Id, newBalanceTargetAccount.Value); if (!updateBalance.StatusCode.IsSuccessStatusCode()) { return(new Result <decimal>(0, updateBalance.StatusCode, updateBalance.Failures)); } #endregion return(new Result <decimal>(newBalanceSourceAccount.Value, HttpStatusCode.OK, null)); } catch (Exception ex) { return(new Result <decimal>(0, HttpStatusCode.InternalServerError, Failure.GenerateOneFailure(ex.Message))); } }