package med.voll.api.repository;
import med.voll.api.domain.entities.Consulta; import org.springframework.data.jpa.repository.JpaRepository;
import java.time.LocalDateTime;
public interface ConsultaRepository extends JpaRepository<Consulta, Long> {
boolean existsByPacienteIdAndDataBetween(Long idPaciente, LocalDateTime primeiroHorario, LocalDateTime ultimoHorario);
boolean existsByMedicoIdAndData(Long id);
} package med.voll.api.service;
import med.voll.api.domain.dto.DadosAgendamentoConsultaDTO; import med.voll.api.domain.entities.Consulta; import med.voll.api.domain.entities.Medico; import med.voll.api.domain.validacoes.ValidadorAgendamentoDeConsulta; import med.voll.api.infra.exceptions.ValidacaoException; import med.voll.api.repository.ConsultaRepository; import med.voll.api.repository.MedicoRepository; import med.voll.api.repository.PacienteRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;
import java.util.List;
@Service public class AgendaConsultaService {
@Autowired
private ConsultaRepository consultaRepository;
@Autowired
private PacienteRepository pacienteRepository;
@Autowired
private MedicoRepository medicoRepository;
@Autowired
private List<ValidadorAgendamentoDeConsulta> validadores;
public void agendar(DadosAgendamentoConsultaDTO dados) {
if (!pacienteRepository.existsById(dados.idPaciente())) {
throw new ValidacaoException("Id do paciente informado não exite!");
}
if (dados.idMedico() != null && !medicoRepository.existsById(dados.idMedico())) {
throw new ValidacaoException("Id do médico informado não exite!");
}
validadores.forEach(v -> v.validar(dados));
var medico = escolherMedico(dados);
var paciente = pacienteRepository.getReferenceById(dados.idPaciente());
var consulta = new Consulta(null, medico, paciente, dados.data());
consultaRepository.save(consulta);
}
private Medico escolherMedico(DadosAgendamentoConsultaDTO dados) {
if (dados.idMedico() != null) {
return medicoRepository.getReferenceById(dados.idMedico());
}
if (dados.especialidade() == null) {
throw new ValidacaoException("Especialidade é obrigatória quando médico não for escolhido!");
}
return medicoRepository.escolherMedicoAleatorioLivreNaData(dados.especialidade(), dados.data());
}
}