Validación Técnica Kruger Corp. Inventario de vacunación de empleados

Para poder acceder al sistema se cuanta con los siguientes usuarios:

Usuarios

USUARIO CONTRASEÑA ROL
admin admin Administrador
alflituma6548 Pass123. Empleado
antavila0944 Pass123. Empleado

Instalación

Dirigirse a la carpeta api y ejecutar:
npm intall
Luego de que se instale hacer los mismo en la carpeta client:
npm install

Ejecución

Dirigirse a la carpeta api y ejecutar:
npm start
Hacer los mismo en la carpeta client:
npm start

Pruebas

Dirigirse a la carpeta client y ejecutar:
npm tets

Validaciones

Para validar que el número de cédula sea correcto, se usa la siguiente función:

const validarCedula = (cedula) => {
    if(cedula.length!==10)
        return {
            status: false,
            msg: "La cédula debe tener 10 Digitos"
        };
    let codProvincia = cedula.substring(0,2);
    if((codProvincia < 1 || codProvincia > 24) && parseInt(codProvincia)!==30)
        return {
            status: false,
            msg: "La cédula no pertenece a una región valida"
        };
    let odds = [cedula[0], cedula[2], cedula[4], cedula[6], cedula[8]].map(odd => odd*2>9?odd*2-9:odd*2);
    let evens = [cedula[1], cedula[3], cedula[5], cedula[7]].map(even => parseInt(even));
    let remainder = [...odds, ...evens].reduce((partialSum, a) => partialSum + a, 0) % 10;
    let validationDigit = remainder === 0?0:10-remainder;
    
    if(parseInt(validationDigit) !== parseInt(cedula[9]))
        return {
            status: false,
            msg: "No coincide el dígito verificador"
        };
    return {
        status: true
    };
}

Para realizar esa función tomé el algoritmo de las siguientes fuentes:
Estructura del Número de Cédula de Identidad
Cómo validar cédula y RUC en Ecuador

Autentificación

Para el proceso de autentificación se usó JWT y para facilitar el uso del token se agregua al axios con un interceptor.

const clienteAxios = axios.create({
    baseURL : 'http://localhost:8080/',
});

clienteAxios.interceptors.request.use(
    async config => {
        if (localStorage.getItem("token") !== null) {
            config.headers = {
                'Authorization': `Bearer ${localStorage.getItem("token")}`,
                'Accept': 'application/json',
                'Content-Type': 'application/json'
            };
        }
        return config;
    },
error => {
    return Promise.reject(error);
});

Data fetch

Para obtener datos se usó el hook SWR

function useUser() {
  const fetcher = async (url) => await clienteAxios.get(url).then(res => res.data);

  const { data, error } = useSWR("/getCurrentUserData", fetcher);
  const loading = !data && !error;
  const loggedOut = error && error.response.status === 403;
  
  return {
    loading,
    loggedOut,
    user: data,
  };
}