Estou desenvolvendo outro projeto e me surgiu uma dúvida em relação as validações e a estrutura de projeto e boas práticas.
Eu criei uma classe service e deixei ela responsável por fazer as validações
@Service
public class TargetService {
@Autowired
private TargetRepository targetRepository;
public void validateTargetAndCurrentAmountToRegister(TargetDTO data) {
if (data.targetAmount() <= data.currentAmount()) {
throw new ValidateException("The current amount cannot be equal to or greater than the target current");
}
}
public void validateTargetAndCurrentAmountToUpdate(TargetUpdateDTO data) {
var targetBeforeUpdate = targetRepository.getReferenceById(data.id());
var targetAmount = data.targetAmount();
var currentAmount = data.currentAmount();
if (targetAmount != null && currentAmount != null && currentAmount > targetAmount) {
throw new ValidateException("The current amount cannot be greater than the target current");
}
else if (targetAmount != null && currentAmount == null) {
currentAmount = targetBeforeUpdate.getCurrentAmount();
if (currentAmount > targetAmount) {
throw new ValidateException("The current amount cannot be greater than the target current");
}
}
else if (targetAmount == null && currentAmount != null) {
targetAmount = targetBeforeUpdate.getTargetAmount();
if (currentAmount > targetAmount) {
throw new ValidateException("The current amount cannot be greater than the target current");
}
}
}
}
E nos meus controllers eu chamei essas validações
@PutMapping
@Transactional
public ResponseEntity update(@RequestBody TargetUpdateDTO data) {
targetService.validateTargetAndCurrentAmountToUpdate(data);
var target = targetRepository.getReferenceById(data.id());
target.update(data);
return ResponseEntity.ok(new TargetResponseDTO(target));
}
Porém, pelo que eu entendi, não é uma boa deixar validações de regra de negócio no controller. Qual seria a melhor maneira de arrumar isso, jogar toda a lógica do controller para a classe service e criar outra classe somente para as validações e o service chama-las, deixar assim ou teria outra maneira mais apropriada?