Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

[Bug] Na consulta o ID do paciente está vindo nulo

Na hora de fazer o agendamento não está funcionando pois diz que o ID do paciente está nulo, vou deixar o erro e o codigo a baixo:

Erro:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade Insira aqui a descrição dessa imagem para ajudar na acessibilidade Codigo:

public record DadosAgendamentoConsulta(
        Long idMedico,

        @NotNull Long idPaciente,

        @NotNull @Future LocalDateTime data,

        Especialidade especialidade) {
}
public record DadosDetalhamentoConsulta(Long id, Long idMedico, Long idPaciente, LocalDateTime data) {
    public DadosDetalhamentoConsulta(Consulta consulta) {
        this(consulta.getId(), consulta.getMedico().getId(), consulta.getPaciente().getId(), consulta.getData());
    }
}
@RestController
@RequestMapping("consultas")
public class ConsultaController {
    @Autowired
    private AgendaDeConsultas consultas;
    @PostMapping
    @Transactional
    public ResponseEntity agendar(@RequestBody @Valid DadosAgendamentoConsulta dados) {
        System.out.println("1- " + dados);
        var dto = consultas.agendar(dados);
        return ResponseEntity.ok(dto);
    }

    @DeleteMapping
    @Transactional
    public ResponseEntity cancelar(@RequestBody @Valid DadosCancelamentoConsulta dados) {
        consultas.cancelar(dados);
        return ResponseEntity.noContent().build();
    }
}
@Service
public class AgendaDeConsultas {
    @Autowired
    private ConsultaRepository consultaRepository;
    @Autowired
    private MedicoRepository medicoRepository;
    @Autowired
    private PacienteRepository pacienteRepository;
    @Autowired
    private List<IValidador> validadores;

    public DadosDetalhamentoConsulta agendar(DadosAgendamentoConsulta dados) {
        System.out.println(dados);
        if (!pacienteRepository.existsById(dados.idPaciente())) {
            throw new ValidacaoExeption("ID do paciente informado não existe!");
        }

        if (dados.idMedico() != null && !medicoRepository.existsById(dados.idMedico())) {
            throw new ValidacaoExeption("ID do medico informado não existe!");
        }

        validadores.forEach(v -> v.validar(dados));

        var paciente = pacienteRepository.getReferenceById(dados.idPaciente());
        var medico = escolherMedico(dados);

        if (medico == null) {
            throw new ValidacaoExeption("Não existe medicos disponiveis para consulta nesse momento,tente mais tarde!");
        }
        var consulta = new Consulta(null,medico,paciente,dados.data(),null);
        consultaRepository.save(consulta);

        return new DadosDetalhamentoConsulta(consulta);
    }

    private Medico escolherMedico(DadosAgendamentoConsulta dados) {
        if (dados.idMedico() != null) {
            return medicoRepository.getReferenceById(dados.idMedico());
        }

        if (dados.especialidade() == null) {
            throw new ValidacaoExeption("Especialidade é obrigatoria quando o medico não for escolhido");
        }

        return medicoRepository.escolherMedicoAleatorio(dados.especialidade(),dados.data());

    }

    public void cancelar(DadosCancelamentoConsulta dados) {
        if (!consultaRepository.existsById(dados.idConsulta())) {
            throw new ValidacaoExeption("ID informado não existe!");
        }

        var consulta = consultaRepository.getReferenceById(dados.idConsulta());
        consulta.cancelar(dados.motivo());
    }
}
4 respostas

Dei um print no controller e não está nem chegando os dados, não sei o que está acontecendo.

O codigo da classe consulta:

@Table(name = "consultas")
@Entity(name = "Consulta")
@Getter
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(of = "id")
public class Consulta {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "medico_id")
    private Medico medico;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "paciente_id")
    private Paciente paciente;

    private LocalDateTime data;

    @Column(name = "motivo_cancelamento")
    @Enumerated(EnumType.STRING)
    private MotivoCancelamento motivoCancelamento;

    public void cancelar(MotivoCancelamento motivo) {
        this.motivoCancelamento = motivo;
    }
}

Essa parte do erro consegui corrigir,foi o nome no insominia que estava errado,mas quando consertei apareceu outro erro:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

O que pode está acontecendo?

solução!

Bug resolvido, o problema estava na Query, pois não estava dando o select no atributo ativo

 @Query("""
            SELECT m.ativo FROM Medico m 
            WHERE 
            m.id = :id 
            """)
    Boolean findAtivoById(Long id);