Já que o método validar() não está recebendo nem enviando dados pra fora da API me pergunto se é necessário usar um DTO como parâmetro dele. Eu poderia usar a própria entidade como parâmetro para o método? Dessa forma:
public interface ValidacaoSolitacaoAdocao {
void validar(Adocao adocao);
}
@Component
public class ValidadorSePetJaAdotado implements ValidacaoSolitacaoAdocao {
@Override
public void validar(Adocao adocao) {
if(adocao.getPet().getAdotado()) {
throw new ValidacaoException("Pet já foi adotado!");
}
}
}
@Service
public class AdocaoService {
// ...código
public void solicitar(AdocaoSolicitacaoDto adocaoSolicitacaoDto) {
var tutor = tutorRepository.getReferenceById(adocaoSolicitacaoDto.idtutor());
var pet = petRepository.getReferenceById(adocaoSolicitacaoDto.idPet());
var adocao = new Adocao(tutor, pet, adocaoSolicitacaoDto.motivo());
validacoes.forEach(v -> v.validar(adocao));
adocao.setData(LocalDateTime.now());
adocao.setStatus(StatusAdocao.AGUARDANDO_AVALIACAO);
adocaoRepository.save(adocao);
emailService.enviarEmail(adocao.getPet().getAbrigo().getEmail(),
"Solicitação de adoção",
"Olá " + adocao.getPet().getAbrigo().getNome()
+ "!\n\nUma solicitação de adoção foi registrada hoje para o pet: "
+ adocao.getPet().getNome() + ". \nFavor avaliar para aprovação ou reprovação.");
}
// código...
}
Assim também não haveria necessidade de repositórios nas classes de validação. Estaria correto dessa forma ou tem alguma desvantagem que não consegui enxergar?