📊 Resumen del Middleware
El DayOpenValidationMiddleware es un componente crítico del sistema RestMaster que valida que el día esté abierto antes de permitir operaciones que modifican datos. Este middleware actúa como una barrera de seguridad que previene operaciones en días cerrados, asegurando la integridad de los datos y el control de acceso temporal.
🎯 Funcionalidades Principales
- Validación de día abierto: Verifica el estado del día antes de procesar peticiones
- Rutas excluidas: Permite operaciones de solo lectura sin validación
- Validación por prefijos: Aplica validación a rutas específicas (/api, /workingdata)
- Respuestas de error estructuradas: Devuelve errores JSON con información detallada
- Logging de seguridad: Registra intentos de acceso en días cerrados
- Optimización de consultas: Consulta ultra optimizada a la base de datos
- Manejo de excepciones: Gestión robusta de errores de base de datos
🔧 Dependencias y Servicios
Servicios Inyectados por Constructor:
- RequestDelegate next - Pipeline de middleware
- ILogger<DayOpenValidationMiddleware> - Logging de eventos
- DbWorkingContextHelper - Helper para contexto de base de datos
⚠️ Parámetros Requeridos
Para que la validación funcione correctamente, las peticiones deben incluir:
- initialCatalog (string, requerido): Nombre de la base de datos
- userID (string, opcional): ID de usuario de la base de datos
- password (string, opcional): Contraseña de la base de datos
📋 Configuración de Rutas
🎯 Rutas Excluidas (Solo Lectura)
Las siguientes rutas NO requieren validación de día abierto:
/api/mesascabecera/getall - Consulta de cabeceras de mesas
/api/mesasestado/getall - Consulta de estados de mesas
/api/invoice/get - Consulta de facturas
/api/invoice/getbyfilter - Consulta filtrada de facturas
/api/caja/getestado - Estado de caja
/api/caja/getarqueo - Arqueo de caja
/api/mesaslinea/getall - Consulta de líneas de mesas
/workingdata/mesascabecera/getall - Consulta de cabeceras (working)
/workingdata/mesasestado/getall - Consulta de estados (working)
/workingdata/invoice/get - Consulta de facturas (working)
/workingdata/invoice/getbyfilter - Consulta filtrada (working)
/workingdata/caja/getestado - Estado de caja (working)
/workingdata/caja/getarqueo - Arqueo de caja (working)
/workingdata/mesaslinea/getall - Consulta de líneas (working)
🔍 Prefijos que Requieren Validación
- /api - Todas las rutas de la API principal
- /workingdata - Todas las rutas de datos de trabajo
🔍 Lógica de Validación
🎯 Algoritmo de Decisión
- Verificación de exclusión: Comprueba si la ruta está en la lista de exclusión (O(1) lookup)
- Verificación de prefijos: Si no está excluida, verifica si comienza con /api o /workingdata
- Extracción de parámetros: Obtiene initialCatalog, userID y password del querystring
- Validación de parámetros: Verifica que initialCatalog esté presente
- Consulta de base de datos: Verifica el estado del día más reciente
- Decisión final: Permite o bloquea la petición según el resultado
📊 Consulta Optimizada
La consulta a la base de datos está optimizada para máximo rendimiento:
- Ordenamiento: Por fecha descendente (más reciente primero)
- Proyección: Solo trae el campo Abierto necesario
- Límite: Solo el primer registro (FirstOrDefaultAsync)
- Índices: Utiliza índices de fecha para optimización