Pessoal, boa tarde!
Estou enfrentando problemas em retornar do médico referente a especialidade desejada. Segue link do meu repositório: https://github.com/YanVelasco/YanVelasco-med.voll-api
package br.com.yanvelasco.api.domain.consultas.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;
import br.com.yanvelasco.api.domain.consultas.dto.ConsultaDTO; import br.com.yanvelasco.api.domain.consultas.repository.ConsultaRepository; import br.com.yanvelasco.api.domain.consultas.validations.ValidadorAgendamentoDeConsulta; import br.com.yanvelasco.api.domain.medico.entity.Medico; import br.com.yanvelasco.api.domain.medico.repository.MedicoRepository; import br.com.yanvelasco.api.domain.paciente.repository.PacienteRepository; import br.com.yanvelasco.api.infra.exceptions.EspecialidadeException; import br.com.yanvelasco.api.infra.exceptions.UserNotFound; import br.com.yanvelasco.api.domain.consultas.entity.Consulta;
@Service public class AgendaDeConsultas {
@Autowired
private ConsultaRepository consultaRepository;
@Autowired
private MedicoRepository medicoRepository;
@Autowired
private PacienteRepository pacienteRepository;
@Autowired
private List<ValidadorAgendamentoDeConsulta> validadores;
public void execute(ConsultaDTO consultaDTO) {
validadores.forEach(v -> v.execute(consultaDTO));
var medico = escolherMedico(consultaDTO);
var paciente = pacienteRepository.findById(consultaDTO.idPaciente())
.orElseThrow(() -> new UserNotFound("Paciente não encontrado"));
var consulta = Consulta.builder()
.medico(medico)
.paciente(paciente)
.data(consultaDTO.data())
.build();
consultaRepository.save(consulta);
}
private Medico escolherMedico(ConsultaDTO consultaDTO) {
if (consultaDTO.idMedico() != null) {
return medicoRepository.getReferenceById(consultaDTO.idMedico());
}
if (consultaDTO.especialidade() == null) {
throw new EspecialidadeException("Você deve informar o médico ou a especialidade");
}
return medicoRepository.escolherMedicoPorEspecialidade(consultaDTO.especialidade(), consultaDTO.data());
}
}
package br.com.yanvelasco.api.domain.medico.repository;
import java.time.LocalDateTime; import java.util.Optional; import java.util.UUID;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository;
import br.com.yanvelasco.api.domain.medico.entity.Especialidade; import br.com.yanvelasco.api.domain.medico.entity.Medico;
@Repository public interface MedicoRepository extends JpaRepository<Medico, UUID> { Optional findByNomeOrEmail(String nome, String email);
Page<Medico> findAllByAtivoTrue(Pageable paginacaoPageable);
@Query("SELECT m FROM Medico m " +
"WHERE m.ativo = true " +
"AND m.especialidade = :especialidade " +
"AND m.id NOT IN (SELECT c.medico.id FROM Consulta c WHERE c.data = :data) " +
"ORDER BY FUNCTION('RANDOM') " +
"LIMIT 1")
Medico escolherMedicoPorEspecialidade(Especialidade especialidade, LocalDateTime data);
@Query("""
SELECT m.ativo FROM Medico m WHERE m.id= :idMedico
""")
Boolean findAtivoById(UUID idMedico);
}