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.
Files changed (170) hide show
  1. package/CHANGELOG.md +664 -0
  2. package/LICENSE +201 -0
  3. package/NOTICE +25 -0
  4. package/README.md +246 -0
  5. package/apps.zip +0 -0
  6. package/bin/adminclient +105 -0
  7. package/bin/blackcoffee +133 -0
  8. package/cli/admin-users.js +282 -0
  9. package/cli/commands/app.js +561 -0
  10. package/cli/commands/config.js +182 -0
  11. package/cli/commands/db.js +257 -0
  12. package/cli/commands/server.js +200 -0
  13. package/config/applications.json +5 -0
  14. package/config/database.json +28 -0
  15. package/config/database.json.example +23 -0
  16. package/config/server.json +32 -0
  17. package/controllers/admin/AdminController.js +529 -0
  18. package/controllers/admin/AdminViewController.js +90 -0
  19. package/controllers/admin/AuthController.js +293 -0
  20. package/controllers/admin/DatabaseAdminController.js +218 -0
  21. package/core/SQLiteAdapter.js +333 -0
  22. package/core/appLoader.js +385 -0
  23. package/core/databasePoolManager.js +431 -0
  24. package/core/hotReload.js +363 -0
  25. package/data/ADMIN-README.md +145 -0
  26. package/data/CHANGELOG.md +48 -0
  27. package/data/GTK3-NODE-PROPOSALS.md +410 -0
  28. package/data/admin-db.js +150 -0
  29. package/data/admin-gui.js +452 -0
  30. package/data/blackcoffee_admin.db-shm +0 -0
  31. package/data/blackcoffee_admin.db-wal +0 -0
  32. package/data/migrations/001_create_admin_users.sql +33 -0
  33. package/docs/APP_HOOKS_HANDLER.md +432 -0
  34. package/docs/APP_HOOKS_REQUIREMENTS.md +588 -0
  35. package/docs/ARCHITECTURE.md +435 -0
  36. package/docs/CREAR_APP_Y_USAR_POOLS.md +1595 -0
  37. package/docs/EVENTS_APP_MANUAL.md +289 -0
  38. package/docs/INSITU_BINARY_UPLOAD_PROPOSAL.md +186 -0
  39. package/docs/INSITU_FIREWALL_EXCEPTION.md +187 -0
  40. package/docs/ROADMAP.md +242 -0
  41. package/docs/ROADMAP.md.backup +243 -0
  42. package/includes/404-hooks.js +423 -0
  43. package/includes/adminAuth.js +214 -0
  44. package/includes/adminExtension.js +53 -0
  45. package/includes/appHooks.js +302 -0
  46. package/includes/initAdminDb.js +115 -0
  47. package/includes/routeLoader.js +67 -0
  48. package/includes/sessions.js +223 -0
  49. package/issues/001-duplicate-module-loading.md +92 -0
  50. package/manuales/ADMIN_EXTENSION_COMMANDS_MANUAL.md +261 -0
  51. package/manuales/ADMIN_EXTENSION_HOOK_EXAMPLE.md +28 -0
  52. package/manuales/ADMIN_EXTENSION_INTEGRATION_MANUAL.md +232 -0
  53. package/manuales/CACHE_REGEX_COMMANDS.md +136 -0
  54. package/manuales/CACHE_SYSTEM_MAP.md +206 -0
  55. package/manuales/CREACION_DE_CONTROLADORES_INSITU.md +383 -0
  56. package/manuales/QUEUE_CLI_MODULE_MANUAL.md +289 -0
  57. package/manuales/QUEUE_SYSTEM_MANUAL.md +320 -0
  58. package/manuales/ROUTE_CACHE_MODULE_MANUAL.md +205 -0
  59. package/manuales/SESSION_MANAGER_GUIDE.md +529 -0
  60. package/manuales/SESSION_SECURITY_FLAGS.md +174 -0
  61. package/manuales/WAF_MODULE_MANUAL.md +229 -0
  62. package/manuales/after_route_handler_filter_example.md +116 -0
  63. package/manuales/after_route_handler_usage.md +130 -0
  64. package/manuales/an/303/241lisis-completo-insitu-framework.md +213 -0
  65. package/manuales/async_hooks_promises_guide.md +325 -0
  66. package/manuales/before_route_handler_filter_example.md +97 -0
  67. package/manuales/before_route_handler_usage.md +122 -0
  68. package/manuales/hooks_chaining_conditions_guide.md +261 -0
  69. package/manuales/hooks_filters_documentation.md +493 -0
  70. package/manuales/hooks_filters_documentation_en.md +493 -0
  71. package/manuales/hooks_vs_middlewares_comparison.md +87 -0
  72. package/manuales/manual-mvc-completo.md +934 -0
  73. package/manuales/modulos_administracion.md +89 -0
  74. package/manuales/router_execution_points.md +74 -0
  75. package/manuales/static_file_hooks_usage.md +222 -0
  76. package/models/AdminUserModel.js +132 -0
  77. package/package.json +45 -0
  78. package/programatically/PRoutes.js +89 -0
  79. package/programatically/initFlow.js +211 -0
  80. package/public/admin/css/db-pools.css +336 -0
  81. package/public/admin/css/styles.css +310 -0
  82. package/public/admin/database.html +312 -0
  83. package/public/admin/index.html +116 -0
  84. package/public/admin/js/app.js +470 -0
  85. package/public/admin/js/db-pools.js +253 -0
  86. package/public/admin/login.html +278 -0
  87. package/public/assets/css/styles.css +477 -0
  88. package/public/assets/js/main.js +89 -0
  89. package/public/index.html +136 -0
  90. package/public/templates/404.html +158 -0
  91. package/routes/admin-views.json +20 -0
  92. package/routes/admin.json +38 -0
  93. package/routes/auth.json +32 -0
  94. package/routes/static.json +18 -0
  95. package/server.js +299 -0
  96. package/test-aplicacion.con-logisession/BlackCoffee.js +226 -0
  97. package/test-aplicacion.con-logisession/SSL_SETUP.md +53 -0
  98. package/test-aplicacion.con-logisession/certs/ca-certificate.pem +32 -0
  99. package/test-aplicacion.con-logisession/certs/ca-private-key.pem +52 -0
  100. package/test-aplicacion.con-logisession/certs/certificate-2048.pem +22 -0
  101. package/test-aplicacion.con-logisession/certs/certificate.pem +32 -0
  102. package/test-aplicacion.con-logisession/certs/private-key-2048.pem +28 -0
  103. package/test-aplicacion.con-logisession/certs/private-key.pem +52 -0
  104. package/test-aplicacion.con-logisession/config/iaQueueSetup.js +84 -0
  105. package/test-aplicacion.con-logisession/config/qwen-rules.json +39 -0
  106. package/test-aplicacion.con-logisession/controllers/analyticsController.js +117 -0
  107. package/test-aplicacion.con-logisession/controllers/auth/AdminAuthController.js +142 -0
  108. package/test-aplicacion.con-logisession/controllers/auth/AuthController.js +439 -0
  109. package/test-aplicacion.con-logisession/controllers/auth/AuthViewController.js +223 -0
  110. package/test-aplicacion.con-logisession/controllers/endpointController.js +66 -0
  111. package/test-aplicacion.con-logisession/controllers/example.js +183 -0
  112. package/test-aplicacion.con-logisession/controllers/iaQueueController.js +367 -0
  113. package/test-aplicacion.con-logisession/controllers/queueController.js +206 -0
  114. package/test-aplicacion.con-logisession/controllers/qwenQueueController.js +197 -0
  115. package/test-aplicacion.con-logisession/controllers/test.js +0 -0
  116. package/test-aplicacion.con-logisession/controllers/tracking/EventsNoFinishController.js +78 -0
  117. package/test-aplicacion.con-logisession/controllers/tracking/TrackingController.js +412 -0
  118. package/test-aplicacion.con-logisession/controllers/tracking/TrackingControllerWithLoadModel.js +437 -0
  119. package/test-aplicacion.con-logisession/hooks/admin-hooks.js +20 -0
  120. package/test-aplicacion.con-logisession/hooks/general-hooks.js +97 -0
  121. package/test-aplicacion.con-logisession/hooks/queue-hooks.js +64 -0
  122. package/test-aplicacion.con-logisession/hooks/route-directory-hooks.js +38 -0
  123. package/test-aplicacion.con-logisession/hooks/security-hooks.js +24 -0
  124. package/test-aplicacion.con-logisession/insitu-admin-client/README.md +69 -0
  125. package/test-aplicacion.con-logisession/insitu-admin-client/package.json +23 -0
  126. package/test-aplicacion.con-logisession/insitu-admin-client.js +257 -0
  127. package/test-aplicacion.con-logisession/models/ExampleModel.js +88 -0
  128. package/test-aplicacion.con-logisession/models/QueueJobModel.js +263 -0
  129. package/test-aplicacion.con-logisession/models/TokenModel.js +207 -0
  130. package/test-aplicacion.con-logisession/models/auth/AuthModel.js +66 -0
  131. package/test-aplicacion.con-logisession/models/auth/UserModel.js +189 -0
  132. package/test-aplicacion.con-logisession/models/tracking/CompletedCartModel.js +213 -0
  133. package/test-aplicacion.con-logisession/models/tracking/EventModel.js +366 -0
  134. package/test-aplicacion.con-logisession/models/tracking/EventsNoFinishModel.js +131 -0
  135. package/test-aplicacion.con-logisession/models/tracking/SessionModel.js +360 -0
  136. package/test-aplicacion.con-logisession/models/tracking/SiteFlowModel.js +286 -0
  137. package/test-aplicacion.con-logisession/models/tracking/TokenModel.js +207 -0
  138. package/test-aplicacion.con-logisession/package-lock.json +3313 -0
  139. package/test-aplicacion.con-logisession/package.json +32 -0
  140. package/test-aplicacion.con-logisession/public/blackcoffee-welcome/index.html +1339 -0
  141. package/test-aplicacion.con-logisession/public/css/style.css +64 -0
  142. package/test-aplicacion.con-logisession/public/ejemplo-estatica/index.html +18 -0
  143. package/test-aplicacion.con-logisession/public/ejemplo-estatica/script.js +16 -0
  144. package/test-aplicacion.con-logisession/public/ejemplo-estatica/styles.css +43 -0
  145. package/test-aplicacion.con-logisession/public/images/logo.svg +7 -0
  146. package/test-aplicacion.con-logisession/public/js/main.js +67 -0
  147. package/test-aplicacion.con-logisession/routes/analytics-routes.json +8 -0
  148. package/test-aplicacion.con-logisession/routes/auth-routes.json +98 -0
  149. package/test-aplicacion.con-logisession/routes/blackcoffee-welcome-routes.json +20 -0
  150. package/test-aplicacion.con-logisession/routes/duplicate-test-routes.json.disabled +16 -0
  151. package/test-aplicacion.con-logisession/routes/ejemplo-estatica-routes.json +11 -0
  152. package/test-aplicacion.con-logisession/routes/endpoints-routes.json +8 -0
  153. package/test-aplicacion.con-logisession/routes/ia-queue-routes.json +26 -0
  154. package/test-aplicacion.con-logisession/routes/product-routes.json.disabled +20 -0
  155. package/test-aplicacion.con-logisession/routes/queue-routes.json +32 -0
  156. package/test-aplicacion.con-logisession/routes/qwen-routes.json +14 -0
  157. package/test-aplicacion.con-logisession/routes/static-routes.json +29 -0
  158. package/test-aplicacion.con-logisession/routes/tracking-routes.json +58 -0
  159. package/test-aplicacion.con-logisession/routes/tracking-with-loadmodel-routes.json +51 -0
  160. package/test-aplicacion.con-logisession/utils/dbAdapter.js +88 -0
  161. package/test-aplicacion.con-logisession/utils/qbWrapper.js +4 -0
  162. package/test-aplicacion.con-logisession/utils/queueProcessor.js +305 -0
  163. package/test-aplicacion.con-logisession/utils/qwenRulesService.js +131 -0
  164. package/test-aplicacion.con-logisession/utils/tokenHelper.js +22 -0
  165. package/test-aplicacion.con-logisession/views/auth/dashboard.html +443 -0
  166. package/test-aplicacion.con-logisession/views/auth/forgot-password.html +200 -0
  167. package/test-aplicacion.con-logisession/views/auth/login.html +213 -0
  168. package/test-aplicacion.con-logisession/views/auth/register.html +294 -0
  169. package/test-aplicacion.con-logisession/views/contact/form.html +47 -0
  170. 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