blackcoffee2 2.1.0
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.
- package/CHANGELOG.md +664 -0
- package/LICENSE +201 -0
- package/NOTICE +25 -0
- package/README.md +246 -0
- package/apps.zip +0 -0
- package/bin/adminclient +105 -0
- package/bin/blackcoffee +133 -0
- package/cli/admin-users.js +282 -0
- package/cli/commands/app.js +561 -0
- package/cli/commands/config.js +182 -0
- package/cli/commands/db.js +257 -0
- package/cli/commands/server.js +200 -0
- package/config/applications.json +5 -0
- package/config/database.json +28 -0
- package/config/database.json.example +23 -0
- package/config/server.json +32 -0
- package/controllers/admin/AdminController.js +529 -0
- package/controllers/admin/AdminViewController.js +90 -0
- package/controllers/admin/AuthController.js +293 -0
- package/controllers/admin/DatabaseAdminController.js +218 -0
- package/core/SQLiteAdapter.js +333 -0
- package/core/appLoader.js +385 -0
- package/core/databasePoolManager.js +431 -0
- package/core/hotReload.js +363 -0
- package/data/ADMIN-README.md +145 -0
- package/data/CHANGELOG.md +48 -0
- package/data/GTK3-NODE-PROPOSALS.md +410 -0
- package/data/admin-db.js +150 -0
- package/data/admin-gui.js +452 -0
- package/data/blackcoffee_admin.db-shm +0 -0
- package/data/blackcoffee_admin.db-wal +0 -0
- package/data/migrations/001_create_admin_users.sql +33 -0
- package/docs/APP_HOOKS_HANDLER.md +432 -0
- package/docs/APP_HOOKS_REQUIREMENTS.md +588 -0
- package/docs/ARCHITECTURE.md +435 -0
- package/docs/CREAR_APP_Y_USAR_POOLS.md +1595 -0
- package/docs/EVENTS_APP_MANUAL.md +289 -0
- package/docs/INSITU_BINARY_UPLOAD_PROPOSAL.md +186 -0
- package/docs/INSITU_FIREWALL_EXCEPTION.md +187 -0
- package/docs/ROADMAP.md +242 -0
- package/docs/ROADMAP.md.backup +243 -0
- package/includes/404-hooks.js +423 -0
- package/includes/adminAuth.js +214 -0
- package/includes/adminExtension.js +53 -0
- package/includes/appHooks.js +302 -0
- package/includes/initAdminDb.js +115 -0
- package/includes/routeLoader.js +67 -0
- package/includes/sessions.js +223 -0
- package/issues/001-duplicate-module-loading.md +92 -0
- package/manuales/ADMIN_EXTENSION_COMMANDS_MANUAL.md +261 -0
- package/manuales/ADMIN_EXTENSION_HOOK_EXAMPLE.md +28 -0
- package/manuales/ADMIN_EXTENSION_INTEGRATION_MANUAL.md +232 -0
- package/manuales/CACHE_REGEX_COMMANDS.md +136 -0
- package/manuales/CACHE_SYSTEM_MAP.md +206 -0
- package/manuales/CREACION_DE_CONTROLADORES_INSITU.md +383 -0
- package/manuales/QUEUE_CLI_MODULE_MANUAL.md +289 -0
- package/manuales/QUEUE_SYSTEM_MANUAL.md +320 -0
- package/manuales/ROUTE_CACHE_MODULE_MANUAL.md +205 -0
- package/manuales/SESSION_MANAGER_GUIDE.md +529 -0
- package/manuales/SESSION_SECURITY_FLAGS.md +174 -0
- package/manuales/WAF_MODULE_MANUAL.md +229 -0
- package/manuales/after_route_handler_filter_example.md +116 -0
- package/manuales/after_route_handler_usage.md +130 -0
- package/manuales/an/303/241lisis-completo-insitu-framework.md +213 -0
- package/manuales/async_hooks_promises_guide.md +325 -0
- package/manuales/before_route_handler_filter_example.md +97 -0
- package/manuales/before_route_handler_usage.md +122 -0
- package/manuales/hooks_chaining_conditions_guide.md +261 -0
- package/manuales/hooks_filters_documentation.md +493 -0
- package/manuales/hooks_filters_documentation_en.md +493 -0
- package/manuales/hooks_vs_middlewares_comparison.md +87 -0
- package/manuales/manual-mvc-completo.md +934 -0
- package/manuales/modulos_administracion.md +89 -0
- package/manuales/router_execution_points.md +74 -0
- package/manuales/static_file_hooks_usage.md +222 -0
- package/models/AdminUserModel.js +132 -0
- package/package.json +45 -0
- package/programatically/PRoutes.js +89 -0
- package/programatically/initFlow.js +211 -0
- package/public/admin/css/db-pools.css +336 -0
- package/public/admin/css/styles.css +310 -0
- package/public/admin/database.html +312 -0
- package/public/admin/index.html +116 -0
- package/public/admin/js/app.js +470 -0
- package/public/admin/js/db-pools.js +253 -0
- package/public/admin/login.html +278 -0
- package/public/assets/css/styles.css +477 -0
- package/public/assets/js/main.js +89 -0
- package/public/index.html +136 -0
- package/public/templates/404.html +158 -0
- package/routes/admin-views.json +20 -0
- package/routes/admin.json +38 -0
- package/routes/auth.json +32 -0
- package/routes/static.json +18 -0
- package/server.js +299 -0
- package/test-aplicacion.con-logisession/BlackCoffee.js +226 -0
- package/test-aplicacion.con-logisession/SSL_SETUP.md +53 -0
- package/test-aplicacion.con-logisession/certs/ca-certificate.pem +32 -0
- package/test-aplicacion.con-logisession/certs/ca-private-key.pem +52 -0
- package/test-aplicacion.con-logisession/certs/certificate-2048.pem +22 -0
- package/test-aplicacion.con-logisession/certs/certificate.pem +32 -0
- package/test-aplicacion.con-logisession/certs/private-key-2048.pem +28 -0
- package/test-aplicacion.con-logisession/certs/private-key.pem +52 -0
- package/test-aplicacion.con-logisession/config/iaQueueSetup.js +84 -0
- package/test-aplicacion.con-logisession/config/qwen-rules.json +39 -0
- package/test-aplicacion.con-logisession/controllers/analyticsController.js +117 -0
- package/test-aplicacion.con-logisession/controllers/auth/AdminAuthController.js +142 -0
- package/test-aplicacion.con-logisession/controllers/auth/AuthController.js +439 -0
- package/test-aplicacion.con-logisession/controllers/auth/AuthViewController.js +223 -0
- package/test-aplicacion.con-logisession/controllers/endpointController.js +66 -0
- package/test-aplicacion.con-logisession/controllers/example.js +183 -0
- package/test-aplicacion.con-logisession/controllers/iaQueueController.js +367 -0
- package/test-aplicacion.con-logisession/controllers/queueController.js +206 -0
- package/test-aplicacion.con-logisession/controllers/qwenQueueController.js +197 -0
- package/test-aplicacion.con-logisession/controllers/test.js +0 -0
- package/test-aplicacion.con-logisession/controllers/tracking/EventsNoFinishController.js +78 -0
- package/test-aplicacion.con-logisession/controllers/tracking/TrackingController.js +412 -0
- package/test-aplicacion.con-logisession/controllers/tracking/TrackingControllerWithLoadModel.js +437 -0
- package/test-aplicacion.con-logisession/hooks/admin-hooks.js +20 -0
- package/test-aplicacion.con-logisession/hooks/general-hooks.js +97 -0
- package/test-aplicacion.con-logisession/hooks/queue-hooks.js +64 -0
- package/test-aplicacion.con-logisession/hooks/route-directory-hooks.js +38 -0
- package/test-aplicacion.con-logisession/hooks/security-hooks.js +24 -0
- package/test-aplicacion.con-logisession/insitu-admin-client/README.md +69 -0
- package/test-aplicacion.con-logisession/insitu-admin-client/package.json +23 -0
- package/test-aplicacion.con-logisession/insitu-admin-client.js +257 -0
- package/test-aplicacion.con-logisession/models/ExampleModel.js +88 -0
- package/test-aplicacion.con-logisession/models/QueueJobModel.js +263 -0
- package/test-aplicacion.con-logisession/models/TokenModel.js +207 -0
- package/test-aplicacion.con-logisession/models/auth/AuthModel.js +66 -0
- package/test-aplicacion.con-logisession/models/auth/UserModel.js +189 -0
- package/test-aplicacion.con-logisession/models/tracking/CompletedCartModel.js +213 -0
- package/test-aplicacion.con-logisession/models/tracking/EventModel.js +366 -0
- package/test-aplicacion.con-logisession/models/tracking/EventsNoFinishModel.js +131 -0
- package/test-aplicacion.con-logisession/models/tracking/SessionModel.js +360 -0
- package/test-aplicacion.con-logisession/models/tracking/SiteFlowModel.js +286 -0
- package/test-aplicacion.con-logisession/models/tracking/TokenModel.js +207 -0
- package/test-aplicacion.con-logisession/package-lock.json +3313 -0
- package/test-aplicacion.con-logisession/package.json +32 -0
- package/test-aplicacion.con-logisession/public/blackcoffee-welcome/index.html +1339 -0
- package/test-aplicacion.con-logisession/public/css/style.css +64 -0
- package/test-aplicacion.con-logisession/public/ejemplo-estatica/index.html +18 -0
- package/test-aplicacion.con-logisession/public/ejemplo-estatica/script.js +16 -0
- package/test-aplicacion.con-logisession/public/ejemplo-estatica/styles.css +43 -0
- package/test-aplicacion.con-logisession/public/images/logo.svg +7 -0
- package/test-aplicacion.con-logisession/public/js/main.js +67 -0
- package/test-aplicacion.con-logisession/routes/analytics-routes.json +8 -0
- package/test-aplicacion.con-logisession/routes/auth-routes.json +98 -0
- package/test-aplicacion.con-logisession/routes/blackcoffee-welcome-routes.json +20 -0
- package/test-aplicacion.con-logisession/routes/duplicate-test-routes.json.disabled +16 -0
- package/test-aplicacion.con-logisession/routes/ejemplo-estatica-routes.json +11 -0
- package/test-aplicacion.con-logisession/routes/endpoints-routes.json +8 -0
- package/test-aplicacion.con-logisession/routes/ia-queue-routes.json +26 -0
- package/test-aplicacion.con-logisession/routes/product-routes.json.disabled +20 -0
- package/test-aplicacion.con-logisession/routes/queue-routes.json +32 -0
- package/test-aplicacion.con-logisession/routes/qwen-routes.json +14 -0
- package/test-aplicacion.con-logisession/routes/static-routes.json +29 -0
- package/test-aplicacion.con-logisession/routes/tracking-routes.json +58 -0
- package/test-aplicacion.con-logisession/routes/tracking-with-loadmodel-routes.json +51 -0
- package/test-aplicacion.con-logisession/utils/dbAdapter.js +88 -0
- package/test-aplicacion.con-logisession/utils/qbWrapper.js +4 -0
- package/test-aplicacion.con-logisession/utils/queueProcessor.js +305 -0
- package/test-aplicacion.con-logisession/utils/qwenRulesService.js +131 -0
- package/test-aplicacion.con-logisession/utils/tokenHelper.js +22 -0
- package/test-aplicacion.con-logisession/views/auth/dashboard.html +443 -0
- package/test-aplicacion.con-logisession/views/auth/forgot-password.html +200 -0
- package/test-aplicacion.con-logisession/views/auth/login.html +213 -0
- package/test-aplicacion.con-logisession/views/auth/register.html +294 -0
- package/test-aplicacion.con-logisession/views/contact/form.html +47 -0
- package/test-aplicacion.con-logisession/views/products/index.html +39 -0
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
# Soporte para Chaining y Condiciones en Hooks y Filtros
|
|
2
|
+
|
|
3
|
+
## Uso Condicional de Hooks y Filtros
|
|
4
|
+
|
|
5
|
+
Sí, los hooks y filtros pueden ser condicionales basados en `matchedRoute`, `req` u otros parámetros. El framework permite implementar lógica condicional dentro de los callbacks de hooks y filtros.
|
|
6
|
+
|
|
7
|
+
### Ejemplos de Uso Condicional
|
|
8
|
+
|
|
9
|
+
#### 1. Condición basada en la ruta coincidente (matchedRoute)
|
|
10
|
+
|
|
11
|
+
```javascript
|
|
12
|
+
// Aplicar lógica solo a rutas específicas
|
|
13
|
+
hooks.addAction('before_route_handler', (req, res, matchedRoute) => {
|
|
14
|
+
// Verificar si la ruta coincide con un patrón específico
|
|
15
|
+
if (matchedRoute.path.startsWith('/admin/')) {
|
|
16
|
+
// Aplicar lógica específica para rutas de administración
|
|
17
|
+
console.log(`Acceso a área de administración: ${req.url}`);
|
|
18
|
+
|
|
19
|
+
// Verificar permisos de administrador
|
|
20
|
+
if (!req.user || req.user.role !== 'admin') {
|
|
21
|
+
res.writeHead(403, { 'Content-Type': 'application/json' });
|
|
22
|
+
res.end(JSON.stringify({ error: 'Acceso denegado: Requiere rol de administrador' }));
|
|
23
|
+
return; // Detener ejecución del handler original
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}, 10, 3);
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
#### 2. Condición basada en propiedades de la solicitud (req)
|
|
30
|
+
|
|
31
|
+
```javascript
|
|
32
|
+
// Aplicar lógica basada en cabeceras o propiedades de la solicitud
|
|
33
|
+
hooks.addFilter('before_static_file_load', (data, req, res, filePath, staticConfig) => {
|
|
34
|
+
// Verificar si el usuario tiene un rol específico
|
|
35
|
+
if (req.userRole === 'premium') {
|
|
36
|
+
// Permitir acceso a recursos premium
|
|
37
|
+
return {
|
|
38
|
+
...data,
|
|
39
|
+
staticConfig: {
|
|
40
|
+
...staticConfig,
|
|
41
|
+
// Configuración específica para usuarios premium
|
|
42
|
+
maxAge: 3600 * 24 * 7 // Cache por una semana
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Para usuarios normales, retornar sin cambios
|
|
48
|
+
return data;
|
|
49
|
+
}, 10, 4);
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
#### 3. Condición basada en el tipo de archivo o ruta
|
|
53
|
+
|
|
54
|
+
```javascript
|
|
55
|
+
// Aplicar lógica condicional según el tipo de archivo
|
|
56
|
+
hooks.addFilter('after_static_file_load', (data, req, res, filePath, staticConfig, fileContent) => {
|
|
57
|
+
// Solo aplicar a archivos HTML
|
|
58
|
+
if (filePath.endsWith('.html')) {
|
|
59
|
+
let content = data.fileContent.toString();
|
|
60
|
+
|
|
61
|
+
// Inyectar script condicionalmente
|
|
62
|
+
if (req.user && req.user.analyticsEnabled) {
|
|
63
|
+
content = content.replace('</body>', '<script src="/analytics.js"></script></body>');
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return {
|
|
67
|
+
...data,
|
|
68
|
+
fileContent: Buffer.from(content)
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
return data;
|
|
73
|
+
}, 10, 5);
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Composición y Encadenamiento de Hooks
|
|
77
|
+
|
|
78
|
+
### 1. Encadenamiento Simple (Cascada)
|
|
79
|
+
|
|
80
|
+
Los hooks se ejecutan en orden según su prioridad, permitiendo una composición en cascada:
|
|
81
|
+
|
|
82
|
+
```javascript
|
|
83
|
+
// Primer filtro: autenticación
|
|
84
|
+
hooks.addFilter('before_route_handler', (data, req, res, matchedRoute) => {
|
|
85
|
+
if (needsAuthentication(matchedRoute)) {
|
|
86
|
+
if (!req.isAuthenticated) {
|
|
87
|
+
res.writeHead(401);
|
|
88
|
+
res.end('Unauthorized');
|
|
89
|
+
return data; // Detener la cadena
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return data;
|
|
93
|
+
}, 5, 3);
|
|
94
|
+
|
|
95
|
+
// Segundo filtro: autorización (se ejecuta después si el primero no detuvo)
|
|
96
|
+
hooks.addFilter('before_route_handler', (data, req, res, matchedRoute) => {
|
|
97
|
+
if (needsAuthorization(matchedRoute)) {
|
|
98
|
+
if (!hasPermission(req.user, matchedRoute)) {
|
|
99
|
+
res.writeHead(403);
|
|
100
|
+
res.end('Forbidden');
|
|
101
|
+
return data; // Detener la cadena
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return data;
|
|
105
|
+
}, 10, 3); // Prioridad más alta que el anterior
|
|
106
|
+
|
|
107
|
+
// Tercer filtro: auditoría (se ejecuta si los anteriores permitieron continuar)
|
|
108
|
+
hooks.addFilter('before_route_handler', (data, req, res, matchedRoute) => {
|
|
109
|
+
logAccess(req, matchedRoute);
|
|
110
|
+
return data;
|
|
111
|
+
}, 15, 3); // Prioridad más alta que los anteriores
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### 2. Encadenamiento Condicional Avanzado
|
|
115
|
+
|
|
116
|
+
```javascript
|
|
117
|
+
// Cadena de procesamiento condicional
|
|
118
|
+
hooks.addFilter('after_route_handler', (data, req, res, matchedRoute) => {
|
|
119
|
+
// Solo aplicar a rutas que requieren métricas
|
|
120
|
+
if (requiresMetrics(matchedRoute)) {
|
|
121
|
+
// Calcular métricas
|
|
122
|
+
const metrics = calculateMetrics(req, res);
|
|
123
|
+
|
|
124
|
+
// Pasar métricas al siguiente filtro
|
|
125
|
+
return {
|
|
126
|
+
...data,
|
|
127
|
+
req: {
|
|
128
|
+
...req,
|
|
129
|
+
metrics: metrics
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return data;
|
|
135
|
+
}, 5, 3);
|
|
136
|
+
|
|
137
|
+
hooks.addFilter('after_route_handler', (data, req, res, matchedRoute) => {
|
|
138
|
+
// Solo aplicar si hay métricas disponibles
|
|
139
|
+
if (req.metrics) {
|
|
140
|
+
// Enviar métricas a servicio externo
|
|
141
|
+
sendMetricsToService(req.metrics);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
return data;
|
|
145
|
+
}, 10, 3);
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### 3. Patrón de Interruptor Condicional
|
|
149
|
+
|
|
150
|
+
```javascript
|
|
151
|
+
// Hook que actúa como interruptor basado en condiciones
|
|
152
|
+
hooks.addAction('before_route_handler', (req, res, matchedRoute) => {
|
|
153
|
+
// Verificar si la ruta está en modo mantenimiento
|
|
154
|
+
if (isMaintenanceMode() && isInMaintenanceArea(matchedRoute)) {
|
|
155
|
+
res.writeHead(503, { 'Content-Type': 'application/json' });
|
|
156
|
+
res.end(JSON.stringify({
|
|
157
|
+
error: 'Sistema en mantenimiento',
|
|
158
|
+
retryAfter: '300' // Reintentar en 5 minutos
|
|
159
|
+
}));
|
|
160
|
+
return; // Interrumpir la ejecución normal
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Verificar límite de tasa (rate limiting)
|
|
164
|
+
if (isRateLimited(req)) {
|
|
165
|
+
res.writeHead(429, { 'Content-Type': 'application/json' });
|
|
166
|
+
res.end(JSON.stringify({
|
|
167
|
+
error: 'Límite de solicitudes excedido',
|
|
168
|
+
retryAfter: '60' // Reintentar en 1 minuto
|
|
169
|
+
}));
|
|
170
|
+
return; // Interrumpir la ejecución normal
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// Si pasa todas las condiciones, continuar normalmente
|
|
174
|
+
}, 5, 3);
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
## Buenas Prácticas para Evitar Abusos
|
|
178
|
+
|
|
179
|
+
### 1. Separación de Responsabilidades
|
|
180
|
+
|
|
181
|
+
```javascript
|
|
182
|
+
// MAL: Un solo hook que hace muchas cosas
|
|
183
|
+
hooks.addFilter('before_route_handler', (data, req, res, matchedRoute) => {
|
|
184
|
+
// Mucha lógica mezclada aquí
|
|
185
|
+
authenticate(req);
|
|
186
|
+
authorize(req, matchedRoute);
|
|
187
|
+
logRequest(req);
|
|
188
|
+
validateInput(req);
|
|
189
|
+
// ...
|
|
190
|
+
return data;
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
// BIEN: Hooks separados por responsabilidad
|
|
194
|
+
hooks.addAction('before_route_handler', (req, res, matchedRoute) => {
|
|
195
|
+
authenticate(req);
|
|
196
|
+
}, 5, 3);
|
|
197
|
+
|
|
198
|
+
hooks.addAction('before_route_handler', (req, res, matchedRoute) => {
|
|
199
|
+
authorize(req, matchedRoute);
|
|
200
|
+
}, 10, 3);
|
|
201
|
+
|
|
202
|
+
hooks.addAction('before_route_handler', (req, res, matchedRoute) => {
|
|
203
|
+
logRequest(req);
|
|
204
|
+
}, 15, 3);
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
### 2. Uso de Prioridades Apropiadas
|
|
208
|
+
|
|
209
|
+
```javascript
|
|
210
|
+
// Prioridades recomendadas para diferentes tipos de hooks:
|
|
211
|
+
// 1-10: Validación y seguridad crítica
|
|
212
|
+
// 11-30: Autenticación y autorización
|
|
213
|
+
// 31-50: Preparación de contexto
|
|
214
|
+
// 51-70: Lógica de negocio
|
|
215
|
+
// 71-90: Auditoría y logging
|
|
216
|
+
// 91-100: Limpieza y post-procesamiento
|
|
217
|
+
|
|
218
|
+
hooks.addAction('before_route_handler', (req, res, matchedRoute) => {
|
|
219
|
+
// Validación de seguridad crítica - alta prioridad
|
|
220
|
+
validateSecurity(req);
|
|
221
|
+
}, 3, 3);
|
|
222
|
+
|
|
223
|
+
hooks.addAction('before_route_handler', (req, res, matchedRoute) => {
|
|
224
|
+
// Autenticación - prioridad media-alta
|
|
225
|
+
authenticate(req);
|
|
226
|
+
}, 15, 3);
|
|
227
|
+
|
|
228
|
+
hooks.addAction('before_route_handler', (req, res, matchedRoute) => {
|
|
229
|
+
// Preparación de contexto - prioridad media
|
|
230
|
+
setupContext(req);
|
|
231
|
+
}, 40, 3);
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
### 3. Manejo Correcto de la Cadena
|
|
235
|
+
|
|
236
|
+
```javascript
|
|
237
|
+
// Interrupción controlada de la cadena
|
|
238
|
+
hooks.addFilter('before_route_handler', (data, req, res, matchedRoute) => {
|
|
239
|
+
if (!isValidRequest(req)) {
|
|
240
|
+
if (!res.headersSent) {
|
|
241
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
242
|
+
res.end(JSON.stringify({ error: 'Solicitud inválida' }));
|
|
243
|
+
}
|
|
244
|
+
// Retornar data sin cambios para evitar ejecución del handler original
|
|
245
|
+
return data;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// Continuar la cadena si la validación pasa
|
|
249
|
+
return data;
|
|
250
|
+
}, 5, 3);
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
## Conclusión
|
|
254
|
+
|
|
255
|
+
Los hooks y filtros en el framework Insitu soportan completamente el uso condicional y la composición en cadena. La clave para aprovechar esta funcionalidad sin abusos es:
|
|
256
|
+
|
|
257
|
+
1. **Usar condiciones claras** basadas en `req`, `matchedRoute`, `res` u otros parámetros
|
|
258
|
+
2. **Separar responsabilidades** en hooks diferentes
|
|
259
|
+
3. **Utilizar prioridades apropiadas** para controlar el orden de ejecución
|
|
260
|
+
4. **Manejar correctamente las interrupciones** de la cadena cuando sea necesario
|
|
261
|
+
5. **Documentar el comportamiento** de los hooks complejos
|