import { BadRequestError } from "../errors/BadRequestError.js";
/**
* Middleware para validar el formato de la fecha
*
* @function
* @param {string} [paramName='fecha'] - Nombre del parámetro en los parámetros de la ruta que contiene la fecha
* @returns {Function} Middleware de validación
*/
export const validateFechaTareaFormat = (paramName = 'fecha') => {
return (req, res, next) => {
const paramValue = req.body[paramName] || '';
if (!isValidDate(paramValue)) {
next(new BadRequestError(`param_${paramName}_is_not_a_valid_date`.toLowerCase()));
} else {
next();
}
}
}
/**
* Validación de la fecha
* @param {String} fecha Fecha para comprobar
* @returns {boolean} True si es una fecha válida o False si no es válida
*/
function isValidDate(fecha) {
// Expresión regular con grupos de captura para mm, dd y yyyy
const regexFecha = /^(0[1-9]|1[0-2])\/(0[1-9]|[12]\d|3[01])\/(\d{4})$/;
const match = fecha.match(regexFecha);
if (!match) {
return false;
}
const [, mes, dia, anio] = match; // Extrae mes, día y año de los grupos de captura
const numDia = parseInt(dia, 10);
const numMes = parseInt(mes, 10);
const numAnio = parseInt(anio, 10);
// Verificar rango de meses
if (numMes < 1 || numMes > 12) {
return false;
}
// Determinar el número máximo de días según el mes
const diasPorMes = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
// Ajustar febrero para años bisiestos
if (numAnio % 400 === 0 || (numAnio % 100 !== 0 && numAnio % 4 === 0)) {
diasPorMes[1] = 29;
}
// Verificar el rango de días
return numDia > 0 && numDia <= diasPorMes[numMes - 1];
}