← Volver a Middleware

DayOpenValidationMiddleware

Middleware para validar que el día esté abierto antes de procesar las solicitudes

📊 Resumen del Middleware

168
Líneas de Código
14
Rutas Excluidas
2
Prefijos Validados
O(1)
Complejidad Lookup

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

  1. Verificación de exclusión: Comprueba si la ruta está en la lista de exclusión (O(1) lookup)
  2. Verificación de prefijos: Si no está excluida, verifica si comienza con /api o /workingdata
  3. Extracción de parámetros: Obtiene initialCatalog, userID y password del querystring
  4. Validación de parámetros: Verifica que initialCatalog esté presente
  5. Consulta de base de datos: Verifica el estado del día más reciente
  6. 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

📊 Códigos de Respuesta

✅ Continuación

Día abierto o ruta excluida - continúa el pipeline

El middleware permite que la petición continúe normalmente

❌ 400 - Bad Request

initialCatalog no proporcionado
{ "error": "DayNotOpen", "message": "initialCatalog no proporcionado", "path": "/api/articulos/getall", "method": "GET" }

❌ 403 - Forbidden

Día cerrado - operación no permitida
{ "error": "DayNotOpen", "message": "El día no está abierto. No se pueden realizar operaciones.", "path": "/api/articulos/add", "method": "POST" }

❌ 500 - Internal Server Error

Error interno al validar el estado del día
{ "error": "DayNotOpen", "message": "Error interno al validar el estado del día", "path": "/api/articulos/getall", "method": "GET" }

🔍 Características Técnicas

🎯 Características del Middleware

  • Async/Await: Operaciones asíncronas para mejor rendimiento
  • HashSet Lookup: Búsqueda O(1) en rutas excluidas
  • String Comparison: Comparación insensible a mayúsculas
  • Error Handling: Manejo robusto de excepciones
  • Structured Logging: Logging detallado con contexto
  • JSON Responses: Respuestas de error estructuradas
  • Performance Optimized: Consultas optimizadas a base de datos
  • Security Focused: Enfoque en seguridad y control de acceso

⚠️ Consideraciones de Seguridad

  • Bloquea operaciones de escritura en días cerrados
  • Permite operaciones de lectura para consultas y reportes
  • Registra intentos de acceso no autorizados
  • No expone información sensible en errores
  • Valida parámetros de conexión antes de consultar BD
  • Maneja errores de base de datos de forma segura

📝 Patrones de Diseño Utilizados

  • Middleware Pattern: Procesamiento en pipeline de peticiones
  • Chain of Responsibility: Delegación de responsabilidades
  • Strategy Pattern: Diferentes estrategias según el tipo de ruta
  • Factory Pattern: Creación de contexto de base de datos
  • Template Method: Estructura común de validación

📈 Estadísticas de Rendimiento

O(1)
Complejidad Lookup
1
Consulta BD
14
Rutas Excluidas
2
Prefijos Validados

Optimizaciones Implementadas:

🔗 Integración con Otros Componentes

🎯 Middleware Relacionados

  • GrafanaLoggingMiddleware: Logging de peticiones y errores
  • ErrorHandlingMiddleware: Manejo de errores no controlados
  • JwtLoggingMiddleware: Logging de autenticación
  • SpanishCultureMiddleware: Configuración de cultura

📋 Orden de Ejecución Recomendado

  1. SpanishCultureMiddleware: Configuración de cultura
  2. GrafanaLoggingMiddleware: Logging de inicio
  3. JwtLoggingMiddleware: Logging de autenticación
  4. DayOpenValidationMiddleware: Validación de día abierto
  5. ErrorHandlingMiddleware: Manejo de errores

📋 Casos de Uso

🎯 Escenarios de Validación

  • Día Abierto: Permite todas las operaciones normalmente
  • Día Cerrado: Bloquea operaciones de escritura, permite lectura
  • Rutas Excluidas: Siempre permitidas independientemente del estado
  • Parámetros Faltantes: Devuelve error 400 con mensaje descriptivo
  • Error de Base de Datos: Devuelve error 500 y registra el problema

🔍 Ejemplos de Uso

  • Consulta de Artículos: GET /api/articulos/getall - Permitida siempre
  • Agregar Artículo: POST /api/articulos/add - Requiere día abierto
  • Estado de Caja: GET /api/caja/getestado - Permitida siempre
  • Abrir Caja: POST /api/caja/open - Requiere día abierto
  • Consulta de Mesas: GET /api/mesascabecera/getall - Permitida siempre