Oi!
Estou com dois problemas que gostaria de ajustar no meu código e não estou conseguindo. O primeiro é tentar criar mais de uma transação, depois que eu crio a conta. A primeira transação ele cria, sem problemas, inclusive, fazendo o cálculo que precisa ser feito, que coloquei no enum. O problema está na segunda transação que eu faço, utilizando a mesma conta, retornando o erro 500. Erro: O segundo erro (ou tratamento) que também não estou conseguindo fazer, é ajustar, quando a conta não existir no banco, deverá retornar o erro 404. Eu tentei colocar uma condição na classe service, mas pelo tipo de retorno que eu declarei, pede para eu ajustar no ResponseEntity, que não está fazendo o tratamento e dá erro de compilação e só queria o retorno dessa transformação na classe controller. Poderia me ajudar, por favor o que estou fazendo errado? Seguem as classes controller e service:
@RestController
@RequestMapping("transacao")
@SecurityRequirement(name = "bearer-key")
public class TransactController {
@Autowired
private TransactionService transactionService;
@Autowired
private AccountService accountService;
@PostMapping
@Transactional
public ResponseEntity<DataDetailingTransaction> createTransaction(@RequestBody @Valid DataRegistrationTransaction request, UriComponentsBuilder uriBuilder) {
DataRegistrationTransaction transaction = new DataRegistrationTransaction(request);
Optional<Account> optionalAccount = accountService.findAccount(transaction.numeroConta());
var dataDetailingTransaction = transactionService.saveTransaction(transaction);
// BigDecimal fundValue = optionalAccount.get().getSaldo();
// BigDecimal transactionValue = transaction.valor();
// int diferenca = transactionValue.compareTo(fundValue);
//
// if (diferenca < 0) {
// return ResponseEntity.notFound().build();
// }
// Até pensei em colocar a condição por aqui, mas vi que não são boas práticas e também não faz sentido, se eu devo configurar na classe service.
var uri = uriBuilder
.path("/transacao/{id}")
.buildAndExpand(dataDetailingTransaction)
.toUri();
return ResponseEntity.created(uri).body(dataDetailingTransaction);
}
}
@Service
@Transactional
@RequiredArgsConstructor
public class TransactionService {
@Autowired
private AccountRepository accountRepository;
@Autowired
private TransactionRepository transactionRepository;
public DataDetailingTransaction saveTransaction(DataRegistrationTransaction data) {
var findAccount = accountRepository.findAccountByAtivoTrue(data.numeroConta());
if (findAccount == null) {
throw new ValidationException("Conta não cadastrada na base de dados.");
// return new TreatErrors().treatError404();
// Acima foi feito o tratamento de retorno que tentei fazer para retornar o erro 404
}
// Outras validações ou regras de negócio aqui...
if (data.numeroConta() == null) {
throw new ValidationException("Conta não cadastrada na base de dados.");
// return new TreatErrors().treatError404();
}
Optional<Transaction> optTransaction = Optional.ofNullable(transactionRepository.findTransactionByAtivoTrue(data.numeroConta()));
BigDecimal valorCalculado = computeTaxTransaction(data);
Optional<Account> optAccount = Optional.ofNullable(accountRepository.findAccountByAtivoTrue(data.numeroConta()));
BigDecimal saldoInicial;
saldoInicial = optAccount.get().getSaldo();
BigDecimal saldo;
saldo = saldoInicial.subtract(valorCalculado);
var account = new Account(optAccount.get().getId(), data.numeroConta(), saldo, true);
accountRepository.save(account);
var transaction = new Transaction(data, findAccount);
transactionRepository.save(transaction);
return new DataDetailingTransaction(transaction);
}
Optional.ofNullable(transactionRepository.findTransactionByAtivoTrue(transactions.getAccount().getNumeroConta()));
private BigDecimal computeTaxTransaction(DataRegistrationTransaction transactions) {
if (transactions.formaPagamento() == null) {
throw new ValidationException("É obrigatório informar a forma de pagamento para validar o processo de transação.");
}
BigDecimal taxTransaction;
PaymentForm paymentForm = transactions.formaPagamento();
taxTransaction = paymentForm.computeTaxTransaction(transactions.valor());
return taxTransaction;
}
}