Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
1
respuesta

mezclan idiomas y definen atributosen los records que no existen y hay una mala práctica, usar repositoios directos

Utilizan en el recod un atributo crm que no exiate en el dominio y qye genera errores ya aue no se debe pasar como parámetro.

Correción.

package med.voll.api.domain.consulta.dto;

public record DatosRelatoriosConsultaMensual(
String nombre,
Long cantidadConsultasAlMes
) {}

Igualente hay una mala práctica ya que se usan directamente el método desde el repositorio, sedebaría habe implementado eñ servicio como en AgendaConsultaService:

package med.voll.api.domain.consulta;

import med.voll.api.domain.consulta.validaciones.ValidadorCancelamientoDeConsulta;
import med.voll.api.domain.consulta.dto.DatosAgendarConsulta;
import med.voll.api.domain.consulta.dto.DatosCancelamientoConsulta;
import med.voll.api.domain.consulta.dto.DatosDetalleConsulta;
import med.voll.api.domain.consulta.validaciones.ValidadorDeConsultas;
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;

@Service
@SuppressWarnings("all")
public class AgendaDeConsultaService {
@Autowired
private PacienteRepository pacienteRepository;
@Autowired
private MedicoRepository medicoRepository;
@Autowired
private ConsultaRepository consultaRepository;

@Autowired
List<ValidadorDeConsultas> validadores;

@Autowired
private List<ValidadorCancelamientoDeConsulta> validadoresCancelamiento;

public DatosDetalleConsulta agendar(DatosAgendarConsulta datos){

    if(!pacienteRepository.findById(datos.idPaciente()).isPresent()){
        throw new ValidacionDeIntegridad("este id para el paciente no fue encontrado");
    }

    if(datos.idMedico()!=null && !medicoRepository.existsById(datos.idMedico())){
        throw new ValidacionDeIntegridad("este id para el medico no fue encontrado");
    }

    validadores.forEach(v-> v.validar(datos));

    var paciente = pacienteRepository.findById(datos.idPaciente()).get();

    var medico = seleccionarMedico(datos);

    if(medico==null){
        throw new ValidacionDeIntegridad("no existen medicos disponibles para este horario y especialidad");
    }

    var consulta = new Consulta(medico,paciente,datos.fecha());

    consultaRepository.save(consulta);

    return new DatosDetalleConsulta(consulta);

}

public void cancelar(DatosCancelamientoConsulta datos) {
    if (!consultaRepository.existsById(datos.idConsulta())) {
        throw new ValidacionDeIntegridad("Id de la consulta informado no existe!");
    }

    validadoresCancelamiento.forEach(v -> v.validar(datos));

    var consulta = consultaRepository.getReferenceById(datos.idConsulta());
    consulta.cancelar(datos.motivo());
}

private Medico seleccionarMedico(DatosAgendarConsulta datos) {
    if(datos.idMedico()!=null){
        return medicoRepository.getReferenceById(datos.idMedico());
    }
    if(datos.especialidad()==null){
        throw new ValidacionDeIntegridad("debe seleccionarse una especialidad para el medico");
    }
   return medicoRepository.seleccionarMedicoConEspecialidadEnFecha(datos.especialidad(),datos.fecha());
}

public Page<DatosDetalleConsulta> consultar(Pageable paginacion) {
    return consultaRepository.findAll(paginacion).map(DatosDetalleConsulta::new);
}

}

Hay una desorganización de paquetes, hay servicios regados y repositorios, mucha desorgaización.

1 respuesta

Hola Henry, espero que estés bien

Gracias por su queja/problema con la actividad, vamos a probar ella.

Entiendo que estás enfrentando algunos problemas con la estructura de tu código y la implementación de servicios y repositorios en tu aplicación Java con Spring Boot. Vamos a intentar abordar tus preocupaciones:

  1. Atributo inexistente en el record: Parece que mencionas un atributo crm que no existe en el dominio, lo cual está causando errores. Asegúrate de que todos los atributos que estás utilizando en tus records o DTOs realmente existen en tu dominio. Si crm no es necesario, deberías eliminarlo del código para evitar confusiones y errores.

  2. Uso directo de métodos del repositorio: Es una buena práctica encapsular la lógica de acceso a datos dentro de servicios en lugar de llamar directamente a los métodos del repositorio desde el controlador o cualquier otra parte del código. Esto mejora la separación de responsabilidades y facilita el mantenimiento del código. En tu caso, podrías crear un método en AgendaDeConsultaService que se encargue de interactuar con el repositorio y realizar las operaciones necesarias.

    Por ejemplo, podrías tener un método en tu servicio que se encargue de buscar las consultas por mes y año, y dentro de ese método, llamar al repositorio. Esto te permitirá centralizar la lógica de negocio en el servicio.

  3. Desorganización de paquetes: La organización de paquetes es crucial para mantener un código limpio y fácil de mantener. Considera estructurar tus paquetes de manera que cada uno tenga una responsabilidad clara. Por ejemplo, podrías tener paquetes separados para controladores, servicios, repositorios, DTOs, etc. Esto hará que tu proyecto sea más fácil de navegar y entender.

Aquí tienes un ejemplo de cómo podrías estructurar tu servicio para encapsular la lógica de acceso a datos:

@Service
public class ConsultaService {

    @Autowired
    private ConsultaRepository consultaRepository;

    public List<DatosRelatoriosConsultaMensual> obtenerConsultasPorMes(int año, int mes) {
        // Aquí puedes llamar al método del repositorio que realiza la consulta JPQL
        return consultaRepository.buscarConsultasPorMes(año, mes);
    }
}

Y luego, en tu controlador, llamarías a este método del servicio en lugar de llamar directamente al repositorio.

Espero que estas sugerencias te sean útiles. Recuerda que la clave está en mantener una buena organización del código y seguir las mejores prácticas de diseño.

Espero haber ayudado y buenos estudios!