0
respostas

[Projeto] Desafio resolvido

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!");
        }
    }
}