Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
3
respuestas

DESAFIO INCOMPLETO

Esto es lo que en el desafio desarrolle, no estoy seguro de haberlo echo bien, cualquier sugerencia o observacion es bien venida: RECORD: **DatosCancelamientoConsulta Ingrese aquí la descripción de esta imagen para ayudar con la accesibilidad

En la clase Consulta el metodo que dio el profe:

public void cancelar(MotivoCancelamiento motivo) {
        this.motivoCancelamiento = motivo;
    }

**Enla clase ValidadorHorarioAntecedencia:

@Component("ValidadorHorarioAntecedenciaCancelamiento")
public class ValidadorHorarioAntecedencia implements ValidadorCancelamientoDeConsulta{

    @Autowired
    private ConsultaRepository repository;

    @Override
    public void validar(DatosCancelamientoConsulta 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("Consulta solamente puede ser cancelada con antecedencia minima de 24 horas");
        }
    }
}

***En la interfaz ValidadorCancelamientoDeConsulta_:

public interface ValidadorCancelamientoDeConsulta {
    public void validar(DatosCancelamientoConsulta datos);
}

*En la clase AgendaDeConsultaService: *Ingrese aquí la descripción de esta imagen para ayudar con la accesibilidad

En la InterfazConsultaRepository :

@Repository
public interface ConsultaRepository extends JpaRepository<Consulta, Long> {

    static void delete(Long idConsulta) {
    }

    Boolean existsByPacienteIdAndFechaBetween(Long idPaciente, LocalDateTime primerHorario, LocalDateTime ultimoHorario);

    Boolean existsByMedicoIdAndFecha(Long idMedico, LocalDateTime fecha);

}

Solo me falta poner en el ConsultaController la funcion DELETE:

@DeleteMapping("/consultas")
    @Transactional
    public ResponseEntity cancelar(@PathVariable @Valid Long idConsulta){
        ConsultaRepository.delete(idConsulta);
        return ResponseEntity.noContent().build();
     }

POR QUE ME MANDA ERROR AL ELIMINAR UNA CONSULTA: DELETED is not supported Ingrese aquí la descripción de esta imagen para ayudar con la accesibilidad

3 respuestas

Hola Leonardo,

El error indica que la operación DELETE no está soportada debido a que estás intentando llamar a un método estático delete que no existe en tu repositorio.

En lugar de eso, podrías intentar utilizar el método deleteById que proporciona Spring Data JPA. Este método eliminará la entidad con el id que le pases como parámetro. Por otro lado, es importante recordar que el método deleteById de Spring Data JPA puede lanzar una EmptyResultDataAccessException si no se encuentra ninguna entidad con el id proporcionado. Por lo tanto, es una buena práctica comprobar si existe la entidad antes de intentar eliminarla, como se muestra en el código anterior.

Espero que esto te ayude a resolver el problema. Si tienes más preguntas, no dudes en hacerlas. Mucho éxito en todo lo que te propongas y si tienes alguna duda aquí estaremos para apoyarte.

¡Vamos juntos!

Si este post te ayudó, por favor, marca como solucionado ✓. Continúa con tus estudios

ya lo intente y al final si me dio pero no se elimina la consulta de la BD, de echo cambie el controller para jalar la validacion de la clase AgendaDeConsultaService que enseño el profesor, pero me sigue sin compilar:

Ingrese aquí la descripción de esta imagen para ayudar con la accesibilidad

Creo ya quedo completo al menos asi se reflejo un cambio en la BD, no se elimino la consulta pero se ve el motivo de la cancelacion de esa consulta asi quedo: Ingrese aquí la descripción de esta imagen para ayudar con la accesibilidad

con el codigo en ConsultaController:

@DeleteMapping("/{idConsulta}")
    @Transactional
    public ResponseEntity cancelar(
            @PathVariable @Valid Long idConsulta,
            @RequestParam(name = "motivo", required = true) @Valid MotivoCancelamiento motivo
    ) {
        var consulta = new DatosCancelamientoConsulta(idConsulta, motivo);
        service.cancelar(consulta);
        return ResponseEntity.noContent().build();
    }
}

ESPERO SEA EL RESULTADO ESPERADO POR EL CHALLENGE; Gracias por la ayuda al igual que se activan las validaciones que enseño el profe : en este caso probe con una id de consulta que no existia y si me funciono: Ingrese aquí la descripción de esta imagen para ayudar con la accesibilidad OTRO METODO NO DIRECTO DESDE QUERY-PARAMS ESTA ; En record DatosCancelamientoConsulta :

public record DatosCancelamientoConsulta(
        @NotNull
        Long idConsulta,

        @Enumerated(EnumType.STRING)
        MotivoCancelamiento motivo
        ) {
        // Constructor para crear una nueva instancia con el valor actualizado de idConsulta
        public DatosCancelamientoConsulta withIdConsulta(Long idConsulta) {
                return new DatosCancelamientoConsulta(idConsulta, this.motivo);
        }

        // Método estático para actualizar idConsulta en una instancia existente
        public static DatosCancelamientoConsulta setIdConsulta(
                DatosCancelamientoConsulta instanciaExistente,
                Long nuevoIdConsulta
        ) {
                return new DatosCancelamientoConsulta(nuevoIdConsulta, instanciaExistente.motivo());
        }
}

y en ConsultaController:

@DeleteMapping("/{idConsulta}")
    @Transactional
    public ResponseEntity cancelar(
            @PathVariable @Valid Long idConsulta,
            @RequestBody @Valid DatosCancelamientoConsulta datosCancelamiento
    ) {
        // Actualizar el idConsulta en la instancia existente
        datosCancelamiento = DatosCancelamientoConsulta.setIdConsulta(datosCancelamiento, idConsulta);
        service.cancelar(datosCancelamiento);
        return ResponseEntity.noContent().build();
    }

Ingrese aquí la descripción de esta imagen para ayudar con la accesibilidadESPERO LES SIRVA,