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

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.