From cef75205844821817a95a656ae2ee9fe062f6323 Mon Sep 17 00:00:00 2001 From: devfzn Date: Tue, 19 Sep 2023 00:26:59 -0300 Subject: [PATCH] Spring Boot 3: doc, test y prep. para impl.: Cancelar consulta --- .../api/controller/ConsultaController.java | 25 ++++++++++++++--- .../consulta/AgendaDeConsultaService.java | 23 +++++++++++++++- .../voll/api/domain/consulta/Consulta.java | 13 +++++++++ .../consulta/DatosCancelarConsulta.java | 7 +++++ .../domain/consulta/MotivoCancelacion.java | 7 +++++ .../ValidadorDeCancelacionDeConsulta.java | 8 ++++++ ...lidadorHorarioAnticipacionCancelacion.java | 27 +++++++++++++++++++ ...table-consultas-add-motivo_cancelacion.sql | 1 + 8 files changed, 106 insertions(+), 5 deletions(-) create mode 100644 010_spring_boot/api_rest/api3/src/main/java/med/voll/api/domain/consulta/DatosCancelarConsulta.java create mode 100644 010_spring_boot/api_rest/api3/src/main/java/med/voll/api/domain/consulta/MotivoCancelacion.java create mode 100644 010_spring_boot/api_rest/api3/src/main/java/med/voll/api/domain/consulta/validaciones_cancelacion/ValidadorDeCancelacionDeConsulta.java create mode 100644 010_spring_boot/api_rest/api3/src/main/java/med/voll/api/domain/consulta/validaciones_cancelacion/ValidadorHorarioAnticipacionCancelacion.java create mode 100644 010_spring_boot/api_rest/api3/src/main/resources/db/migration/V7__alter-table-consultas-add-motivo_cancelacion.sql diff --git a/010_spring_boot/api_rest/api3/src/main/java/med/voll/api/controller/ConsultaController.java b/010_spring_boot/api_rest/api3/src/main/java/med/voll/api/controller/ConsultaController.java index 5855f51..4b6b0c7 100644 --- a/010_spring_boot/api_rest/api3/src/main/java/med/voll/api/controller/ConsultaController.java +++ b/010_spring_boot/api_rest/api3/src/main/java/med/voll/api/controller/ConsultaController.java @@ -3,14 +3,16 @@ package med.voll.api.controller; import jakarta.validation.Valid; import med.voll.api.domain.consulta.AgendaDeConsultaService; import med.voll.api.domain.consulta.DatosAgendarConsulta; +import med.voll.api.domain.consulta.DatosCancelarConsulta; +import med.voll.api.domain.consulta.DatosDetalleConsulta; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.web.PageableDefault; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.*; @Controller @ResponseBody @@ -28,4 +30,19 @@ public class ConsultaController { return ResponseEntity.ok(response); } + + @GetMapping + public ResponseEntity> listar( + @PageableDefault(size = 10, sort = {"fecha"}) Pageable paginacion) { + var response = service.consultar(paginacion); + return ResponseEntity.ok(response); + } + + @DeleteMapping + @Transactional + public ResponseEntity cancelar(@RequestBody @Valid DatosCancelarConsulta dados) { + service.cancelar(dados); + return ResponseEntity.noContent().build(); + } + } diff --git a/010_spring_boot/api_rest/api3/src/main/java/med/voll/api/domain/consulta/AgendaDeConsultaService.java b/010_spring_boot/api_rest/api3/src/main/java/med/voll/api/domain/consulta/AgendaDeConsultaService.java index 430e488..1f3e276 100644 --- a/010_spring_boot/api_rest/api3/src/main/java/med/voll/api/domain/consulta/AgendaDeConsultaService.java +++ b/010_spring_boot/api_rest/api3/src/main/java/med/voll/api/domain/consulta/AgendaDeConsultaService.java @@ -1,11 +1,14 @@ package med.voll.api.domain.consulta; import med.voll.api.domain.consulta.validaciones.ValidadorDeConsultas; +import med.voll.api.domain.consulta.validaciones_cancelacion.ValidadorDeCancelacionDeConsulta; import med.voll.api.domain.medico.Medico; import med.voll.api.domain.medico.MedicoRepository; import med.voll.api.domain.paciente.PacienteRepository; import med.voll.api.infra.errores.ValidacionDeIntegridad; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import java.util.List; @@ -23,6 +26,9 @@ public class AgendaDeConsultaService { @Autowired List validadores; + @Autowired + List validadoresDeCancelacion; + public DatosDetalleConsulta agendar(DatosAgendarConsulta datos) { if (!pacienteRepository.findById(datos.idPaciente()).isPresent()) { @@ -39,7 +45,7 @@ public class AgendaDeConsultaService { if (medico == null) { throw new ValidacionDeIntegridad("No hay especialistas disponibles para este horario"); } - var consulta = new Consulta(null, medico, paciente, datos.fecha()); + var consulta = new Consulta(medico, paciente, datos.fecha()); consultaRepository.save(consulta); return new DatosDetalleConsulta(consulta); @@ -54,4 +60,19 @@ public class AgendaDeConsultaService { } return medicoRepository.seleccionarMedicoConEspecialidadEnFecha(datos.especialidad(), datos.fecha()); } + + public void cancelar(DatosCancelarConsulta datos) { + if (!consultaRepository.existsById(datos.idConsulta())) { + throw new ValidacionDeIntegridad("Id de consulta inexistente"); + } + validadoresDeCancelacion.forEach(v -> v.validar(datos)); + + var consulta = consultaRepository.getReferenceById(datos.idConsulta()); + consulta.cancelar(datos.motivo()); + } + + public Page consultar(Pageable paginacion) { + return consultaRepository.findAll(paginacion).map(DatosDetalleConsulta::new); + } + } diff --git a/010_spring_boot/api_rest/api3/src/main/java/med/voll/api/domain/consulta/Consulta.java b/010_spring_boot/api_rest/api3/src/main/java/med/voll/api/domain/consulta/Consulta.java index f5f39f8..cbd8608 100644 --- a/010_spring_boot/api_rest/api3/src/main/java/med/voll/api/domain/consulta/Consulta.java +++ b/010_spring_boot/api_rest/api3/src/main/java/med/voll/api/domain/consulta/Consulta.java @@ -32,4 +32,17 @@ public class Consulta { private LocalDateTime fecha; + @Column(name ="motivo_cancelacion") + @Enumerated(EnumType.STRING) + private MotivoCancelacion motivo; + + public Consulta(Medico medico, Paciente paciente, LocalDateTime fecha) { + this.medico=medico; + this.paciente=paciente; + this.fecha=fecha; + } + + public void cancelar(MotivoCancelacion motivo) { + this.motivo = motivo; + } } diff --git a/010_spring_boot/api_rest/api3/src/main/java/med/voll/api/domain/consulta/DatosCancelarConsulta.java b/010_spring_boot/api_rest/api3/src/main/java/med/voll/api/domain/consulta/DatosCancelarConsulta.java new file mode 100644 index 0000000..73cb0e2 --- /dev/null +++ b/010_spring_boot/api_rest/api3/src/main/java/med/voll/api/domain/consulta/DatosCancelarConsulta.java @@ -0,0 +1,7 @@ +package med.voll.api.domain.consulta; + +import jakarta.validation.constraints.NotNull; + +public record DatosCancelarConsulta(@NotNull Long idConsulta, + @NotNull MotivoCancelacion motivo) { +} diff --git a/010_spring_boot/api_rest/api3/src/main/java/med/voll/api/domain/consulta/MotivoCancelacion.java b/010_spring_boot/api_rest/api3/src/main/java/med/voll/api/domain/consulta/MotivoCancelacion.java new file mode 100644 index 0000000..60d3510 --- /dev/null +++ b/010_spring_boot/api_rest/api3/src/main/java/med/voll/api/domain/consulta/MotivoCancelacion.java @@ -0,0 +1,7 @@ +package med.voll.api.domain.consulta; + +public enum MotivoCancelacion { + PACIENTE_DESISTE, + MEDICO_CANCELA, + OTRO; +} diff --git a/010_spring_boot/api_rest/api3/src/main/java/med/voll/api/domain/consulta/validaciones_cancelacion/ValidadorDeCancelacionDeConsulta.java b/010_spring_boot/api_rest/api3/src/main/java/med/voll/api/domain/consulta/validaciones_cancelacion/ValidadorDeCancelacionDeConsulta.java new file mode 100644 index 0000000..b917dfd --- /dev/null +++ b/010_spring_boot/api_rest/api3/src/main/java/med/voll/api/domain/consulta/validaciones_cancelacion/ValidadorDeCancelacionDeConsulta.java @@ -0,0 +1,8 @@ +package med.voll.api.domain.consulta.validaciones_cancelacion; + +import med.voll.api.domain.consulta.DatosAgendarConsulta; +import med.voll.api.domain.consulta.DatosCancelarConsulta; + +public interface ValidadorDeCancelacionDeConsulta { + void validar(DatosCancelarConsulta datos); +} diff --git a/010_spring_boot/api_rest/api3/src/main/java/med/voll/api/domain/consulta/validaciones_cancelacion/ValidadorHorarioAnticipacionCancelacion.java b/010_spring_boot/api_rest/api3/src/main/java/med/voll/api/domain/consulta/validaciones_cancelacion/ValidadorHorarioAnticipacionCancelacion.java new file mode 100644 index 0000000..3a4247d --- /dev/null +++ b/010_spring_boot/api_rest/api3/src/main/java/med/voll/api/domain/consulta/validaciones_cancelacion/ValidadorHorarioAnticipacionCancelacion.java @@ -0,0 +1,27 @@ +package med.voll.api.domain.consulta.validaciones_cancelacion; + +import jakarta.validation.ValidationException; +import med.voll.api.domain.consulta.ConsultaRepository; +import med.voll.api.domain.consulta.DatosCancelarConsulta; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.time.Duration; +import java.time.LocalDateTime; + +@Component("ValidadorHorarioAnticipacion") +public class ValidadorHorarioAnticipacionCancelacion implements ValidadorDeCancelacionDeConsulta { + @Autowired + private ConsultaRepository repository; + @Override + public void validar(DatosCancelarConsulta datos) { + var consulta = repository.getReferenceById(datos.idConsulta()); + var ahora = LocalDateTime.now(); + var diferenciaEnHoras = Duration.between(ahora, consulta.getFecha()).toHours(); + + if (diferenciaEnHoras < 24) { + throw new ValidationException("La consulta solo se puede cancelar con 24 horas de anticipaciĆ³n"); + } + } + +} diff --git a/010_spring_boot/api_rest/api3/src/main/resources/db/migration/V7__alter-table-consultas-add-motivo_cancelacion.sql b/010_spring_boot/api_rest/api3/src/main/resources/db/migration/V7__alter-table-consultas-add-motivo_cancelacion.sql new file mode 100644 index 0000000..fe8a285 --- /dev/null +++ b/010_spring_boot/api_rest/api3/src/main/resources/db/migration/V7__alter-table-consultas-add-motivo_cancelacion.sql @@ -0,0 +1 @@ +alter table consultas add motivo_cancelacion varchar(100); \ No newline at end of file