insitu-js 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/CHANGELOG.md +62 -0
  2. package/CREACION_DE_CONTROLADORES_INSITU.md +383 -0
  3. package/changelogs/1.0.1/CENTRALIZED_EXECUTE_MIDDLEWARE_IMPLEMENTATION.md +88 -0
  4. package/changelogs/1.0.1/DRY.md +525 -0
  5. package/changelogs/1.0.1/WAF_LOG_MONITOR_IMPLEMENTATION.md +186 -0
  6. package/controllers/EjemploController.js +165 -0
  7. package/controllers/HolaController.js +60 -0
  8. package/docs1.x/CACHE_REGEX_COMMANDS.md +136 -0
  9. package/docs1.x/modulos_administracion.md +89 -0
  10. package/lib/admin/AdminExtension.js +17 -16
  11. package/lib/admin/modules/RouteManagerModule.js +70 -7
  12. package/lib/admin/modules/WAFModule.js +79 -2
  13. package/lib/core/router.js +11 -18
  14. package/lib/core/server.js +262 -180
  15. package/lib/loader/routeLoader.js +3 -18
  16. package/lib/middleware/firewall.js +39 -0
  17. package/lib/utils/executeMiddleware.js +35 -0
  18. package/lib/utils/globalWAFStats.js +6 -0
  19. package/package.json +2 -2
  20. package/BENCHMARK_RESULTS.md +0 -60
  21. package/doc-2.5/MANUAL_MODULOS_ADMIN.md +0 -287
  22. package/docs/ARQUITECTURA_ROUTES.md +0 -186
  23. package/docs/EXTENSION_MANUAL.md +0 -955
  24. package/docs/FIREWALL_MANUAL.md +0 -416
  25. package/docs/HOOK-2.0.md +0 -512
  26. package/docs/HOOKS_REFERENCE_IMPROVED.md +0 -596
  27. package/docs/JERK_FRAMEWORK_DIAGRAM.txt +0 -492
  28. package/docs/JERK_FRAMEWORK_DIAGRAM_MERMAID.mmd +0 -124
  29. package/docs/JERK_FRAMEWORK_DOCUMENTATION.md +0 -553
  30. package/docs/JERK_MODELOS_HOWTO.md +0 -566
  31. package/docs/MANUAL_API_SDK.md +0 -536
  32. package/docs/MANUAL_CONTROLLER_VIEW_MODEL.md +0 -310
  33. package/docs/MARIADB_TOKENS_IMPLEMENTATION.md +0 -110
  34. package/docs/MIDDLEWARE_MANUAL.md +0 -518
  35. package/docs/OAUTH2_GOOGLE_MANUAL.md +0 -405
  36. package/docs/ROUTE_DIRECTORY_LOADER_MANUAL.md +0 -277
  37. package/docs/ROUTING_WITHOUT_JSON_GUIDE.md +0 -454
  38. package/docs/SERVER_OPTIMIZATION_NOTES.md +0 -87
  39. package/docs/frontend-and-sessions.md +0 -353
  40. package/docs/guia_inicio_rapido_insitu.md +0 -113
  41. package/lib/admin/modules/ControllerGeneratorModule.js +0 -414
  42. /package/{doc-2.5 → docs1.x}/ADMIN_EXTENSION_COMMANDS_MANUAL.md +0 -0
  43. /package/{doc-2.5 → docs1.x}/ADMIN_EXTENSION_HOOK_EXAMPLE.md +0 -0
  44. /package/{doc-2.5 → docs1.x}/ADMIN_EXTENSION_INTEGRATION_MANUAL.md +0 -0
  45. /package/{doc-2.5 → docs1.x}/CACHE_SYSTEM_MAP.md +0 -0
  46. /package/{doc-2.5 → docs1.x}/QUEUE_CLI_MODULE_MANUAL.md +0 -0
  47. /package/{doc-2.5 → docs1.x}/QUEUE_SYSTEM_MANUAL.md +0 -0
  48. /package/{doc-2.5 → docs1.x}/ROUTE_CACHE_MODULE_MANUAL.md +0 -0
  49. /package/{doc-2.5 → docs1.x}/SESSION_SECURITY_FLAGS.md +0 -0
  50. /package/{doc-2.5 → docs1.x}/WAF_MODULE_MANUAL.md +0 -0
  51. /package/{doc-2.5 → docs1.x}/an/303/241lisis-completo-insitu-framework.md" +0 -0
  52. /package/{doc-2.5 → docs1.x}/manual-mvc-completo.md +0 -0
package/CHANGELOG.md CHANGED
@@ -5,6 +5,68 @@ El versionado sigue SemVer (MAJOR.MINOR.PATCH).
5
5
 
6
6
  ---
7
7
 
8
+ ## [1.0.1] - 2026-02-13
9
+
10
+ ### Refactorización DRY y Mejoras en el WAF - Insitu Framework
11
+
12
+ #### Archivo Nuevo: `lib/utils/executeMiddleware.js`
13
+ - Creación del módulo centralizado `executeMiddleware` para la ejecución de middlewares
14
+ - Implementación del método reutilizable `executeMiddleware(middleware, req, res, nextFn = null)` con manejo de promesas
15
+
16
+ #### Archivos Modificados:
17
+ - `lib/core/server.js`
18
+ - `lib/loader/routeLoader.js`
19
+ - `lib/core/router.js`
20
+ - `lib/security/globalWAFStats.js`
21
+ - `lib/security/firewall.js`
22
+ - `lib/admin/modules/WAFModule.js`
23
+
24
+ #### Implementación de Método Centralizado executeMiddleware
25
+ - Eliminación de múltiples instancias de código repetido para ejecución de middlewares
26
+ - Reemplazo de lógica local con importación y uso del módulo centralizado
27
+ - Actualización del método `use` en el router para usar el método centralizado
28
+ - Implementación de definición dinámica de métodos HTTP en el router
29
+
30
+ #### Implementación de Funcionalidades de Log y Monitor en el WAF
31
+ - Añadida propiedad `monitoredRequests` al objeto global de estadísticas del WAF
32
+ - Implementación completa de la acción "monitor" en el middleware de firewall
33
+ - Almacenamiento de solicitudes monitoreadas en el mapa global `monitoredRequests`
34
+ - Añadido comando `waf-monitored` al módulo de administración WAF
35
+ - Implementación del método `showMonitoredRequests()` para mostrar solicitudes monitoreadas
36
+ - Actualización del comando `waf-logs` para mostrar solicitudes registradas con acción "log"
37
+
38
+ #### Aplicación del Principio DRY (Don't Repeat Yourself)
39
+ - Creación del método `createAuthenticatedHandler()` para manejar lógica de autenticación
40
+ - Implementación de métodos para respuestas HTTP comunes (`sendJsonResponse()`, `sendForbiddenResponse()`, `sendNotFoundResponse()`, `sendRequestTooLargeResponse()`)
41
+ - Uso del método reutilizable `handleError()` en lugar de llamar directamente a ErrorHandler.handle()
42
+
43
+ #### Mejoras en el Manejo de Errores y Configuración
44
+ - Centralización del manejo de errores con el método `handleError()`
45
+ - Creación del método `isJsonRequest()` para verificar tipo de contenido
46
+ - Implementación del método `setStaticFileHeaders()` para configurar headers de archivos estáticos
47
+
48
+ #### Optimizaciones de Estadísticas y Hooks
49
+ - Método `setupResponseCapture()` para capturar datos de respuesta para estadísticas
50
+ - Método `updateRequestProcessingStats()` para actualizar estadísticas de procesamiento
51
+ - Método `registerRouteAndEndpointStats()` para registrar estadísticas de acceso
52
+ - Métodos para manejar eventos de hooks de solicitud (`handleRouteMatched()`, `handleMiddlewareResponseFinished()`)
53
+
54
+ #### Mejoras en Verificaciones y Validaciones
55
+ - Método `isMiddlewareFunction()` para verificar si un middleware es una función
56
+ - Método `isAsyncFunction()` para verificar si una función es asíncrona
57
+
58
+ #### Beneficios Obtenidos
59
+ - Eliminación significativa de código duplicado
60
+ - Mejor mantenibilidad: cambios en lógica común solo se realizan en un lugar
61
+ - Mayor consistencia en el manejo de operaciones repetitivas
62
+ - Funcionalidad completa de las acciones "log" y "monitor" en el WAF
63
+ - Almacenamiento eficiente de solicitudes registradas y monitoreadas
64
+ - Visibilidad mejorada a través de comandos específicos (`waf-logs`, `waf-monitored`)
65
+ - Reducción de posibles errores por inconsistencias
66
+ - Claridad mejorada del código
67
+
68
+ ---
69
+
8
70
  ## [1.0.0] - 2026-02-12
9
71
 
10
72
  ### Consolidated Release - Insitu Framework
@@ -0,0 +1,383 @@
1
+ # Guía para Crear Controladores en el Framework Insitu
2
+
3
+ ## Introducción
4
+
5
+ Los controladores en el framework Insitu son componentes fundamentales que forman parte del patrón MVC (Modelo-Vista-Controlador). Son responsables de manejar las solicitudes HTTP, interactuar con los modelos para obtener o manipular datos, y devolver respuestas apropiadas al cliente.
6
+
7
+ ## Estructura Básica de un Controlador
8
+
9
+ Un controlador en Insitu debe extender la clase `ControllerBase` que proporciona funcionalidades comunes como:
10
+
11
+ - Manejo de vistas y motores de plantillas
12
+ - Acceso a datos de solicitud (query, body, params)
13
+ - Métodos para respuesta (JSON, vistas, redirecciones)
14
+ - Carga y manejo de modelos
15
+
16
+ ### Ejemplo Básico de Controlador
17
+
18
+ ```javascript
19
+ const { ControllerBase } = require('insitu');
20
+
21
+ class EjemploController extends ControllerBase {
22
+ constructor() {
23
+ super();
24
+ }
25
+
26
+ // Método para manejar una solicitud GET
27
+ async index(req, res) {
28
+ // Establecer variables para la vista
29
+ this.set('titulo', 'Página de Inicio');
30
+ this.set('mensaje', '¡Bienvenido al framework Insitu!');
31
+
32
+ // Renderizar una vista
33
+ this.render(res, 'inicio', {
34
+ usuario: 'Desarrollador',
35
+ fecha: new Date().toISOString()
36
+ });
37
+ }
38
+
39
+ // Método para manejar una solicitud POST
40
+ async crear(req, res) {
41
+ const datos = req.body;
42
+
43
+ // Aquí iría la lógica para crear un recurso
44
+ // Por ejemplo, usando un modelo
45
+
46
+ this.json(res, {
47
+ success: true,
48
+ message: 'Recurso creado exitosamente',
49
+ data: datos
50
+ });
51
+ }
52
+ }
53
+
54
+ module.exports = EjemploController;
55
+ ```
56
+
57
+ ## Componentes Importantes
58
+
59
+ ### ControllerBase
60
+
61
+ La clase base `ControllerBase` proporciona varios métodos útiles:
62
+
63
+ - `set(key, value)` - Establece variables para la vista
64
+ - `view(viewName, data, options)` - Renderiza una vista sin enviarla como respuesta
65
+ - `render(res, viewName, data, options)` - Renderiza una vista y la envía como respuesta HTTP
66
+ - `partial(viewName, data)` - Renderiza una vista parcial (sin layout)
67
+ - `redirect(res, url)` - Redirecciona a otra URL
68
+ - `json(res, data, statusCode)` - Envía una respuesta JSON
69
+ - `input(key, defaultValue)` - Obtiene un valor de la solicitud (query, body o params)
70
+ - `loadModel(modelName, options)` - Carga un modelo para su uso en el controlador
71
+
72
+ ### Interacción con Modelos
73
+
74
+ Los controladores pueden interactuar con modelos para gestionar datos:
75
+
76
+ ```javascript
77
+ const { ControllerBase } = require('insitu');
78
+
79
+ class UsuarioController extends ControllerBase {
80
+ constructor() {
81
+ super();
82
+ }
83
+
84
+ async listar(req, res) {
85
+ try {
86
+ // Cargar el modelo de usuario
87
+ const userModel = this.loadModel('User');
88
+
89
+ // Obtener todos los usuarios
90
+ const usuarios = await userModel.find({});
91
+
92
+ // Pasar los usuarios a la vista
93
+ this.set('usuarios', usuarios);
94
+ this.render(res, 'usuarios/lista');
95
+ } catch (error) {
96
+ this.json(res, { error: error.message }, 500);
97
+ }
98
+ }
99
+
100
+ async crear(req, res) {
101
+ try {
102
+ const userData = req.body;
103
+
104
+ // Cargar el modelo de usuario
105
+ const userModel = this.loadModel('User');
106
+
107
+ // Crear un nuevo usuario
108
+ const nuevoUsuario = await userModel.create(userData);
109
+
110
+ this.json(res, {
111
+ success: true,
112
+ data: nuevoUsuario
113
+ }, 201);
114
+ } catch (error) {
115
+ this.json(res, { error: error.message }, 500);
116
+ }
117
+ }
118
+ }
119
+
120
+ module.exports = UsuarioController;
121
+ ```
122
+
123
+ ## Definición de Rutas
124
+
125
+ Para conectar tus controladores con rutas, puedes usar el sistema de enrutamiento de Insitu:
126
+
127
+ ### En un archivo de rutas (por ejemplo, routes.json):
128
+
129
+ ```json
130
+ {
131
+ "routes": [
132
+ {
133
+ "method": "GET",
134
+ "path": "/usuarios",
135
+ "handler": "./controllers/UsuarioController.listar"
136
+ },
137
+ {
138
+ "method": "POST",
139
+ "path": "/usuarios",
140
+ "handler": "./controllers/UsuarioController.crear"
141
+ },
142
+ {
143
+ "method": "GET",
144
+ "path": "/usuarios/:id",
145
+ "handler": "./controllers/UsuarioController.obtenerPorId"
146
+ }
147
+ ]
148
+ }
149
+ ```
150
+
151
+ ### O directamente en tu código de inicialización:
152
+
153
+ ```javascript
154
+ const { Insitu, Router } = require('insitu');
155
+ const UsuarioController = require('./controllers/UsuarioController');
156
+
157
+ const app = new Insitu();
158
+ const router = new Router();
159
+
160
+ const usuarioController = new UsuarioController();
161
+
162
+ router.get('/usuarios', (req, res) => {
163
+ usuarioController.listar(req, res);
164
+ });
165
+
166
+ router.post('/usuarios', (req, res) => {
167
+ usuarioController.crear(req, res);
168
+ });
169
+
170
+ app.use(router);
171
+
172
+ app.listen(3000, () => {
173
+ console.log('Servidor corriendo en puerto 3000');
174
+ });
175
+ ```
176
+
177
+ ### Importante: Manejo de Contexto de los Métodos
178
+
179
+ Cuando se exportan métodos de un controlador para ser usados como handlers de rutas, es crítico mantener el contexto `this` correcto. Si no se hace correctamente, métodos como `this.json()`, `this.set()`, `this.input()`, etc., no funcionarán.
180
+
181
+ **Forma Incorrecta:**
182
+ ```javascript
183
+ // Esto causará un error "Cannot read property 'json' of undefined"
184
+ module.exports = new UsuarioController();
185
+ ```
186
+
187
+ **Forma Correcta:**
188
+ ```javascript
189
+ // Crear una instancia del controlador
190
+ const usuarioController = new UsuarioController();
191
+
192
+ // Asegurar que todos los métodos tengan el contexto correcto
193
+ module.exports = {
194
+ listar: usuarioController.listar.bind(usuarioController),
195
+ crear: usuarioController.crear.bind(usuarioController),
196
+ obtenerPorId: usuarioController.obtenerPorId.bind(usuarioController)
197
+ };
198
+ ```
199
+
200
+ Esto es necesario porque cuando el cargador de rutas obtiene una función específica de un objeto y la llama directamente, pierde el contexto `this`. Usando `.bind()`, nos aseguramos de que `this` siempre se refiera a la instancia correcta del controlador.
201
+ ```
202
+
203
+ ## Buenas Prácticas
204
+
205
+ ### 1. Organización de Archivos
206
+
207
+ Organiza tus controladores en una estructura de directorios clara:
208
+
209
+ ```
210
+ proyecto/
211
+ ├── controllers/
212
+ │ ├── UsuarioController.js
213
+ │ ├── ProductoController.js
214
+ │ └── HomeController.js
215
+ ├── models/
216
+ │ ├── User.js
217
+ │ └── Product.js
218
+ ├── views/
219
+ │ ├── home/
220
+ │ │ └── index.html
221
+ │ └── usuarios/
222
+ │ ├── lista.html
223
+ │ └── detalle.html
224
+ └── routes/
225
+ └── routes.json
226
+ ```
227
+
228
+ ### 2. Manejo de Errores
229
+
230
+ Siempre implementa manejo de errores adecuado:
231
+
232
+ ```javascript
233
+ async listar(req, res) {
234
+ try {
235
+ const modelo = this.loadModel('MiModelo');
236
+ const datos = await modelo.find({});
237
+ this.json(res, { success: true, data: datos });
238
+ } catch (error) {
239
+ console.error('Error en listar:', error);
240
+ this.json(res, {
241
+ success: false,
242
+ error: 'Ocurrió un error al procesar la solicitud'
243
+ }, 500);
244
+ }
245
+ }
246
+ ```
247
+
248
+ ### 3. Validación de Datos
249
+
250
+ Utiliza el middleware de validación de Insitu para validar entradas:
251
+
252
+ ```javascript
253
+ const { Validator } = require('insitu');
254
+
255
+ // En tu archivo de rutas
256
+ router.post('/usuarios',
257
+ Validator.validate({
258
+ body: {
259
+ nombre: { type: 'string', required: true, minLength: 2 },
260
+ email: { type: 'string', required: true, format: 'email' },
261
+ edad: { type: 'number', min: 0, max: 120 }
262
+ }
263
+ }),
264
+ (req, res) => {
265
+ usuarioController.crear(req, res);
266
+ }
267
+ );
268
+ ```
269
+
270
+ ### 4. Uso de Métodos HTTP Apropiados
271
+
272
+ Sigue las convenciones REST para el uso de métodos HTTP:
273
+
274
+ - `GET` - Obtener recursos
275
+ - `POST` - Crear nuevos recursos
276
+ - `PUT/PATCH` - Actualizar recursos existentes
277
+ - `DELETE` - Eliminar recursos
278
+
279
+ ## Ejemplo Completo
280
+
281
+ Aquí tienes un ejemplo completo de un controlador para gestionar productos:
282
+
283
+ ```javascript
284
+ const { ControllerBase } = require('insitu');
285
+
286
+ class ProductoController extends ControllerBase {
287
+ constructor() {
288
+ super();
289
+ }
290
+
291
+ // Obtener todos los productos
292
+ async listar(req, res) {
293
+ try {
294
+ const productoModel = this.loadModel('Producto');
295
+ const productos = await productoModel.find({});
296
+
297
+ this.set('productos', productos);
298
+ this.set('titulo', 'Lista de Productos');
299
+ this.render(res, 'productos/lista');
300
+ } catch (error) {
301
+ this.json(res, { error: error.message }, 500);
302
+ }
303
+ }
304
+
305
+ // Obtener un producto por ID
306
+ async obtenerPorId(req, res) {
307
+ try {
308
+ const id = this.input('id');
309
+ const productoModel = this.loadModel('Producto');
310
+ const producto = await productoModel.findOne({ id: parseInt(id) });
311
+
312
+ if (!producto) {
313
+ res.writeHead(404, { 'Content-Type': 'application/json' });
314
+ res.end(JSON.stringify({ error: 'Producto no encontrado' }));
315
+ return;
316
+ }
317
+
318
+ this.json(res, { success: true, data: producto });
319
+ } catch (error) {
320
+ this.json(res, { error: error.message }, 500);
321
+ }
322
+ }
323
+
324
+ // Crear un nuevo producto
325
+ async crear(req, res) {
326
+ try {
327
+ const productoData = this.allInput();
328
+ const productoModel = this.loadModel('Producto');
329
+ const nuevoProducto = await productoModel.create(productoData);
330
+
331
+ this.json(res, {
332
+ success: true,
333
+ data: nuevoProducto
334
+ }, 201);
335
+ } catch (error) {
336
+ this.json(res, { error: error.message }, 500);
337
+ }
338
+ }
339
+
340
+ // Actualizar un producto
341
+ async actualizar(req, res) {
342
+ try {
343
+ const id = this.input('id');
344
+ const productoData = this.allInput();
345
+ const productoModel = this.loadModel('Producto');
346
+
347
+ const resultado = await productoModel.update({ id: parseInt(id) }, productoData);
348
+
349
+ this.json(res, {
350
+ success: true,
351
+ message: 'Producto actualizado',
352
+ affectedRows: resultado
353
+ });
354
+ } catch (error) {
355
+ this.json(res, { error: error.message }, 500);
356
+ }
357
+ }
358
+
359
+ // Eliminar un producto
360
+ async eliminar(req, res) {
361
+ try {
362
+ const id = this.input('id');
363
+ const productoModel = this.loadModel('Producto');
364
+
365
+ const resultado = await productoModel.delete({ id: parseInt(id) });
366
+
367
+ this.json(res, {
368
+ success: true,
369
+ message: 'Producto eliminado',
370
+ deletedRows: resultado
371
+ });
372
+ } catch (error) {
373
+ this.json(res, { error: error.message }, 500);
374
+ }
375
+ }
376
+ }
377
+
378
+ module.exports = ProductoController;
379
+ ```
380
+
381
+ ## Conclusión
382
+
383
+ Crear controladores en el framework Insitu es sencillo gracias a la clase `ControllerBase` que proporciona funcionalidades comunes. Recuerda seguir las buenas prácticas para mantener tu código limpio, seguro y mantenible. La arquitectura MVC del framework te permite separar claramente la lógica de negocio (modelos), la presentación (vistas) y el flujo de control (controladores).
@@ -0,0 +1,88 @@
1
+ # Implementación de Método Centralizado executeMiddleware
2
+
3
+ ## Descripción
4
+ Este documento resume la implementación del principio DRY (Don't Repeat Yourself) mediante la creación de un módulo centralizado para la ejecución de middlewares en el framework Insitu.
5
+
6
+ ## Motivación
7
+ Se identificaron múltiples instancias de código repetido para la ejecución de middlewares en diferentes archivos del framework, lo cual violaba el principio DRY y dificultaba la mantenibilidad.
8
+
9
+ ## Solución Implementada
10
+
11
+ ### 1. Creación del módulo centralizado
12
+ Se creó el archivo `lib/utils/executeMiddleware.js` que contiene la lógica reutilizable para ejecutar middlewares:
13
+
14
+ ```javascript
15
+ /**
16
+ * Módulo centralizado para la ejecución de middlewares
17
+ * Implementación del componente utils/executeMiddleware.js
18
+ * Insitu Framework - Funcionalidad de ejecución de middleware reutilizable
19
+ */
20
+
21
+ /**
22
+ * Método para ejecutar un middleware con manejo de promesas
23
+ * @param {Function} middleware - Middleware a ejecutar
24
+ * @param {Object} req - Objeto de solicitud
25
+ * @param {Object} res - Objeto de respuesta
26
+ * @param {Function} nextFn - Función next opcional
27
+ * @returns {Promise} - Promesa que se resuelve cuando el middleware termina
28
+ */
29
+ function executeMiddleware(middleware, req, res, nextFn = null) {
30
+ return new Promise((resolve, reject) => {
31
+ // Si no se proporciona una función next personalizada, usar una por defecto
32
+ const next = nextFn || ((err) => {
33
+ if (err) {
34
+ reject(err);
35
+ } else {
36
+ resolve();
37
+ }
38
+ });
39
+
40
+ const result = middleware(req, res, next);
41
+
42
+ // Si el middleware devuelve una promesa, esperarla
43
+ if (result && typeof result.then === 'function') {
44
+ result.then(resolve).catch(reject);
45
+ }
46
+ });
47
+ }
48
+
49
+ module.exports = { executeMiddleware };
50
+ ```
51
+
52
+ ### 2. Actualización de archivos existentes
53
+
54
+ #### a) Actualización de `lib/core/server.js`
55
+ - Se agregó la importación del módulo centralizado
56
+ - Se reemplazó la definición local del método `executeMiddleware` con una referencia al método centralizado
57
+
58
+ #### b) Actualización de `lib/loader/routeLoader.js`
59
+ - Se agregó la importación del módulo centralizado
60
+ - Se reemplazaron las dos instancias de lógica repetida de middleware con llamadas al método centralizado
61
+
62
+ #### c) Actualización de `lib/core/router.js`
63
+ - Se agregó la importación del módulo centralizado
64
+ - Se actualizó el método `use` para usar el método centralizado
65
+
66
+ #### d) Optimización adicional en `lib/core/router.js`
67
+ - Se implementó la definición dinámica de métodos HTTP para evitar repetición de código
68
+
69
+ ## Beneficios Obtenidos
70
+
71
+ 1. **Eliminación de código duplicado**: Se eliminaron múltiples instancias de la misma lógica de ejecución de middleware
72
+ 2. **Mejor mantenibilidad**: Cualquier cambio en la lógica de ejecución de middleware solo necesita hacerse en un lugar
73
+ 3. **Consistencia**: Todos los puntos donde se ejecutan middlewares utilizan exactamente la misma lógica
74
+ 4. **Reducción de errores**: Menos código duplicado significa menos posibilidades de introducir inconsistencias o errores
75
+ 5. **Claridad del código**: La intención de las funciones es más clara y el código es más legible
76
+
77
+ ## Pruebas Realizadas
78
+
79
+ Se realizaron pruebas completas para asegurar que la funcionalidad del sistema permanece intacta:
80
+ - El servidor responde correctamente a solicitudes HTTP
81
+ - La consola de administración funciona correctamente
82
+ - Las operaciones CRUD (como crear usuarios) funcionan como se esperaba
83
+ - Las estadísticas y el sistema de caché operan correctamente
84
+ - Todos los comandos de administración están disponibles y funcionan
85
+
86
+ ## Estado Funcional
87
+
88
+ El comportamiento funcional del sistema permanece exactamente igual después de las refactorizaciones. Todos los casos de uso originales siguen funcionando como se esperaba, demostrando que la implementación centralizada es completamente compatible con la funcionalidad existente.