no console aparece: java.lang.NullPointerException: Cannot invoke "med.voll.api.domain.consulta.AgendaDeConsultas.agendar(med.voll.api.domain.consulta.DadosAgendamentoConsulta)" because "this.agenda" is null
segue o código:
import jakarta.transaction.Transactional;
import jakarta.validation.Valid;
import med.voll.api.domain.consulta.AgendaDeConsultas;
import med.voll.api.domain.consulta.ConsultaRepository;
import med.voll.api.domain.consulta.DadosAgendamentoConsulta;
import med.voll.api.domain.consulta.DadosCancelamentoConsulta;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("consultas")
public class ConsultaController {
private AgendaDeConsultas agenda;
private ConsultaRepository consultaRepository;
@PostMapping
public ResponseEntity agendar(@RequestBody @Valid DadosAgendamentoConsulta dados) {
var dto = agenda.agendar(dados);
return ResponseEntity.ok(dto);
}
@DeleteMapping
@Transactional
public ResponseEntity cancelar(@RequestBody @Valid DadosCancelamentoConsulta dados) {
agenda.cancelar(dados);
return ResponseEntity.noContent().build();
}
}
package med.voll.api.domain.consulta;
import med.voll.api.domain.consulta.validacoes.ValidadorAgendamentoDeConsultas;
import med.voll.api.domain.medico.Medico;
import med.voll.api.domain.medico.MedicoRepository;
import med.voll.api.domain.paciente.PacienteRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class AgendaDeConsultas {
@Autowired
private ConsultaRepository consultaRepository;
@Autowired
private MedicoRepository medicoRepository;
@Autowired
private PacienteRepository pacienteRepository;
@Autowired
private List<ValidadorAgendamentoDeConsultas> validadores;
public DadosDetalhamentoConsulta agendar(DadosAgendamentoConsulta dados) {
if (!pacienteRepository.existsById(dados.idPaciente())) {
throw new ValidacaoException("Id do paciente informado não existe!");
}
if (dados.idMedico() != null && !medicoRepository.existsById(dados.idMedico())) {
throw new ValidacaoException("Id do médico 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 ValidacaoException("Não existe médico disponível nessa data!");
}
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 ValidacaoException("Especialidade é obrigatória quando não médico não for escolhido");
}
return medicoRepository.escolherMedicoAleatorioLivreNaData(dados.especialidade(),dados.data());
}
public void cancelar(DadosCancelamentoConsulta dados) {
if (!consultaRepository.existsById(dados.idConsulta())) {
throw new ValidacaoException("id do paciente informado não existe");
}
var consulta = consultaRepository.getReferenceById(dados.idConsulta());
consulta.cancelar(dados.motivo());
}
}