public interface ValidadorCancelamentoDeConsulta {
void validar(DadosCancelamentoConsulta dados);
}
public record DadosCancelamentoConsulta(
@NotNull
Long idConsulta,
@NotNull
MotivoCancelamento motivo
){
}
@RestController
@RequestMapping("consultas")
@SecurityRequirement(name = "bearer-key")
public class ConsultaController {
@Autowired
private AgendaDeConsultas agenda;
@PostMapping
@Transactional
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();
}
}
@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;
}
}