Nesse desafio, a implementação inicial já vinha pronta no curso, e a proposta era refatorar.
A versão original fazia a validação com um for e um contador, mas havia um problema: o contador era reiniciado dentro do loop, então nunca acumulava corretamente. Além disso, o uso de findAll() trazia todas as adoções para memória, o que não é performático.
public void validar(SolicitacaoAdocaoDto dto) {
List<Adocao> adocoes = adocaoRepository.findAll();
Tutor tutor = tutorRepository.getReferenceById(dto.idTutor());
for (Adocao a : adocoes) {
int contador = 0;
if (a.getTutor() == tutor && a.getStatus() == StatusAdocao.APROVADO) {
contador = contador + 1;
}
if (contador == 5) {
throw new ValidacaoExcpetion("Tutor chegou ao limite máximo de 5 adoções!");
}
}
}
Na refatoração, optei por delegar a validação ao banco usando countByTutorIdAndStatus, deixando o código mais simples e eficiente:
package br.com.alura.adopet.api.validacoes;
import br.com.alura.adopet.api.dto.SolicitacaoAdocaoDto;
import br.com.alura.adopet.api.excpetion.ValidacaoExcpetion;
import br.com.alura.adopet.api.model.StatusAdocao;
import br.com.alura.adopet.api.repository.AdocaoRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class ValidacaoTutorComLimiteDeAdocoes implements ValidacaoSolicitacaoAdocao {
@Autowired
private AdocaoRepository adocaoRepository;
public void validar(SolicitacaoAdocaoDto dto) {
int totalDeAdocoesTutor = adocaoRepository.countByTutorIdAndStatus(dto.idTutor(), StatusAdocao.APROVADO);
if (totalDeAdocoesTutor == 5) {
throw new ValidacaoExcpetion("Tutor chegou ao limite máximo de 5 adoções!");
}
}
}