2
respostas

[Sugestão] Validação de conflito de horário para um médico aleatório.

@Transactional public Consulta agendarConsulta(DadosAgendamentoConsulta agendamentoConsulta) {

    Paciente paciente = pacienteRepository.findById(agendamentoConsulta.pacienteId())
            .orElseThrow(() -> new PacienteNaoEncontradoException(agendamentoConsulta.pacienteId()));

    if(!paciente.isAtivo()) {
        throw new PacienteInativoException(paciente.getId());
    }

    if(agendamentoConsulta.medicoId() != null && !medicoRepository.existsById(agendamentoConsulta.medicoId())) {
        throw new MedicoNaoEncontradoException(agendamentoConsulta.medicoId());
    }

    Medico medico = selecionarMedico(agendamentoConsulta);

    DadosAgendamentoConsulta dadosAtualizados = new DadosAgendamentoConsulta(
            agendamentoConsulta.pacienteId(),
            medico.getId(), // Atualiza com o ID do médico selecionado
            agendamentoConsulta.dataConsulta(),
            agendamentoConsulta.especialidadeMedica()
    );

    //Validações de consulta.
    validacoesAgendamentoConsulta.forEach(v -> v.validar(dadosAtualizados));

    
    // Criar e salvar a consulta
    Consulta consulta = new Consulta(dadosAtualizados, medico, paciente);

    return consultaRepository.save(consulta);
}

private Medico selecionarMedico(DadosAgendamentoConsulta agendamentoConsulta) {
    if (agendamentoConsulta.medicoId() == null) {
        if (agendamentoConsulta.especialidadeMedica() == null){
            throw new EspecialidadeNulaException();
        }

        Optional<Medico> medicoAleatorio = medicoRepository.medicoAletorio(Especialidade.fromEspecialidade(agendamentoConsulta.especialidadeMedica()));

        return medicoAleatorio.orElseThrow(() -> new MedicoNaoEncontradoException(Especialidade.fromEspecialidade(agendamentoConsulta.especialidadeMedica())));
    }

    Medico medico = medicoRepository.findById(agendamentoConsulta.medicoId())
            .orElseThrow(() -> new MedicoNaoEncontradoException(agendamentoConsulta.medicoId()));

    if (!medico.isAtivo()) {
        throw new MedicoInativoException(medico.getId());
    }

    return medico;
}                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   Ao gerar um médico aleatoriamente, a validação de conflito de horário com o médico gerado é desconsiderado se não atualizarmos o Dto com o id do médico que o método selecionarMedico(No meu caso, seu método pode ser diferente), uma vez que validando antes de gerar o médico aleatório, estamos validando um dto sem médico, logo a validação não ocorre, apenas se o médico não estiver nulo.
2 respostas

Se não atualizarmos o dto após escolhermos um médico aleatório, a validação de conflito de horário não irá ocorrer, pois o método validar usa como parâmetro o mesmo dto que viria do front-end, e estando sem um id de médico a validação acontece antes, desconsiderando a validação com o id do médico escolhido aleatoriamente. Para resolver chamei o método que seleciona o médco, atualizei o Dto de agendamento da consulta com o id do médico de retorno do método, e fiz as validações em cima do Dto atualizado.

Oii Alessandro!

Muito obrigada por compartilhar seu código com a comunidade Alura. Legal demais ver você indo além e praticando bastante!

Parabéns!

Continue firme nos estudos.

Um abraço.