package med.voll.api.domain.consulta;
import jakarta.validation.constraints.NotNull;
public record DadosCancelamentoConsulta(
@NotNull
Long idConsulta,
@NotNull
MotivoCancelamento motivo
) {
}
package med.voll.api.domain.consulta;
public enum MotivoCancelamento {
PACIENTE_DESISTIU,
MEDICO_CANCELOU,
OUTROS
}
package med.voll.api.domain.consulta;
import jakarta.persistence.*;
import lombok.*;
import java.time.LocalDateTime;
@Entity
@Table(name = "consultas")
@Getter
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(of = "id")
public class Consulta {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
private med.voll.api.domain.medico.Medico medico;
@ManyToOne(fetch = FetchType.LAZY)
private med.voll.api.domain.paciente.Paciente paciente;
private LocalDateTime data;
private Boolean cancelada;
@Enumerated(EnumType.STRING)
private MotivoCancelamento motivoCancelamento;
public void cancelar(MotivoCancelamento motivo) {
this.cancelada = true;
this.motivoCancelamento = motivo;
}
}
package med.voll.api.domain.consulta;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class AgendaDeConsultas {
@Autowired
private ConsultaRepository consultaRepository;
@Autowired
private med.voll.api.domain.medico.MedicoRepository medicoRepository;
@Autowired
private med.voll.api.domain.paciente.PacienteRepository pacienteRepository;
public void agendar(DadosAgendamentoConsulta dados) {
if (!pacienteRepository.existsById(dados.idPaciente())) {
throw new ValidacaoException("Id do paciente informado não existe!");
}
var paciente = pacienteRepository.findById(dados.idPaciente()).get();
var medico = medicoRepository.findById(dados.idMedico()).get();
var consulta = new Consulta(null, medico, paciente, dados.data(), false, null);
consultaRepository.save(consulta);
}
public void cancelar(DadosCancelamentoConsulta dados) {
var consulta = consultaRepository.getReferenceById(dados.idConsulta());
consulta.cancelar(dados.motivo());
}
}
package med.voll.api.controller;
import jakarta.transaction.Transactional;
import jakarta.validation.Valid;
import med.voll.api.domain.consulta.AgendaDeConsultas;
import med.voll.api.domain.consulta.DadosAgendamentoConsulta;
import med.voll.api.domain.consulta.DadosCancelamentoConsulta;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/consultas")
public class ConsultaController {
@Autowired
private AgendaDeConsultas agenda;
@PostMapping
@Transactional
public ResponseEntity agendar(@RequestBody @Valid DadosAgendamentoConsulta dados) {
agenda.agendar(dados);
return ResponseEntity.ok().build();
}
@DeleteMapping
@Transactional
public ResponseEntity cancelar(@RequestBody @Valid DadosCancelamentoConsulta dados) {
agenda.cancelar(dados);
return ResponseEntity.noContent().build();
}
}