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,432 @@
|
|
|
1
|
+
# App Hooks Handler - Documentación Técnica
|
|
2
|
+
|
|
3
|
+
## 📋 Descripción General
|
|
4
|
+
|
|
5
|
+
Este documento explica la función y carga del sistema de hooks para aplicaciones en BlackCoffee App Server.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 🗂️ Archivos Relacionados
|
|
10
|
+
|
|
11
|
+
En BlackCoffee existen **DOS** archivos relacionados con los hooks de aplicaciones:
|
|
12
|
+
|
|
13
|
+
### 1. `includes/appHooks.js` - EL QUE SE USA ACTUALMENTE
|
|
14
|
+
|
|
15
|
+
**Ubicación:** `/home/bds/blackcoffeeRC/includes/appHooks.js`
|
|
16
|
+
|
|
17
|
+
**Estado:** ✅ Activo y en uso
|
|
18
|
+
|
|
19
|
+
**Función:** Registrar los 13 hooks para el ciclo de vida de aplicaciones.
|
|
20
|
+
|
|
21
|
+
### 2. `app-hooks-handler.js` - Handler Oficial de Insitu
|
|
22
|
+
|
|
23
|
+
**Ubicación:** `node_modules/insitu-js/lib/core/hooks-handlers/app-hooks-handler.js`
|
|
24
|
+
|
|
25
|
+
**Estado:** ❌ Creado pero NO usado aún
|
|
26
|
+
|
|
27
|
+
**Función:** Centralizar el manejo de hooks de aplicaciones en Insitu Framework.
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## 🔧 `includes/appHooks.js` - Implementación Actual
|
|
32
|
+
|
|
33
|
+
### Función Principal
|
|
34
|
+
|
|
35
|
+
Registrar todos los hooks necesarios para la gestión de aplicaciones en BlackCoffee App Server.
|
|
36
|
+
|
|
37
|
+
### Los 13 Hooks Registrados
|
|
38
|
+
|
|
39
|
+
#### 1. Application Lifecycle (6 hooks)
|
|
40
|
+
|
|
41
|
+
```javascript
|
|
42
|
+
hooks.addAction('app_deploying', (manifest, tempPath) => {
|
|
43
|
+
console.log(`📦 [APP] Desplegando ${manifest.name} v${manifest.version}`);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
hooks.addAction('app_deployed', (manifest, tempPath, deployedPath) => {
|
|
47
|
+
console.log(`✅ [APP] ${manifest.name} v${manifest.version} desplegado en ${deployedPath}`);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
hooks.addAction('app_undeploying', (appName, version) => {
|
|
51
|
+
console.log(`🗑️ [APP] Removiendo ${appName} v${version}`);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
hooks.addAction('app_undeployed', (appName, version, removedPath) => {
|
|
55
|
+
console.log(`❌ [APP] ${appName} v${version} removido de ${removedPath}`);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
hooks.addAction('app_starting', (appName, version) => {
|
|
59
|
+
console.log(`▶️ [APP] Iniciando ${appName} v${version}`);
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
hooks.addAction('app_started', (appName, version) => {
|
|
63
|
+
console.log(`✅ [APP] ${appName} v${version} iniciada correctamente`);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
hooks.addAction('app_stopping', (appName, version) => {
|
|
67
|
+
console.log(`⏹️ [APP] Deteniendo ${appName} v${version}`);
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
hooks.addAction('app_stopped', (appName, version) => {
|
|
71
|
+
console.log(`⏹️ [APP] ${appName} v${version} detenida`);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
hooks.addAction('app_restarting', (appName, version) => {
|
|
75
|
+
console.log(`🔄 [APP] Reiniciando ${appName} v${version}`);
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
hooks.addAction('app_restarted', (appName, version) => {
|
|
79
|
+
console.log(`✅ [APP] ${appName} v${version} reiniciada`);
|
|
80
|
+
});
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
#### 2. Manifest Validation (2 hooks)
|
|
84
|
+
|
|
85
|
+
```javascript
|
|
86
|
+
hooks.addFilter('app_manifest_validating', (isValid, manifest, errors) => {
|
|
87
|
+
// Validaciones obligatorias básicas
|
|
88
|
+
const requiredFields = ['name', 'version'];
|
|
89
|
+
|
|
90
|
+
for (const field of requiredFields) {
|
|
91
|
+
if (!manifest[field]) {
|
|
92
|
+
errors.push(`Campo requerido faltante: ${field}`);
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Validar que name sea un string válido para URL
|
|
98
|
+
if (!/^[a-z0-9][a-z0-9-]*[a-z0-9]$|^[a-z0-9]$/.test(manifest.name)) {
|
|
99
|
+
errors.push('El nombre de la app debe ser alfanumérico (minúsculas)');
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
return isValid;
|
|
104
|
+
}, 10);
|
|
105
|
+
|
|
106
|
+
hooks.addAction('app_manifest_validated', (manifest, isValid, errors) => {
|
|
107
|
+
if (!isValid) {
|
|
108
|
+
console.error(`❌ [MANIFEST] ${manifest.name}: ${errors.join(', ')}`);
|
|
109
|
+
} else {
|
|
110
|
+
console.log(`✅ [MANIFEST] ${manifest.name} v${manifest.version} validado correctamente`);
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
#### 3. Route Registration (2 hooks)
|
|
116
|
+
|
|
117
|
+
```javascript
|
|
118
|
+
hooks.addFilter('before_app_routes_register', (routeConfig, appName, version) => {
|
|
119
|
+
// Validar que appName y version sean strings válidos
|
|
120
|
+
if (!appName || appName === 'unknown' || !version || version === 'unknown') {
|
|
121
|
+
console.warn(`[HOOK] Warning: appName o version no válidos`);
|
|
122
|
+
return routeConfig;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// Obtener prefijo del manifest o generar automático
|
|
126
|
+
const prefix = `/${appName}/${version}`;
|
|
127
|
+
|
|
128
|
+
// Evitar doble prefijo
|
|
129
|
+
if (!routeConfig.path.startsWith(prefix)) {
|
|
130
|
+
routeConfig.path = `${prefix}${routeConfig.path}`;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Agregar metadata de la app a la ruta
|
|
134
|
+
routeConfig.app = {
|
|
135
|
+
name: appName,
|
|
136
|
+
version: version,
|
|
137
|
+
deployedAt: new Date().toISOString()
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
return routeConfig;
|
|
141
|
+
}, 10, 3); // priority=10, acceptedArgs=3
|
|
142
|
+
|
|
143
|
+
hooks.addAction('after_app_routes_register', (routes, appName, version) => {
|
|
144
|
+
console.log(`📍 [ROUTES] ${routes.length} rutas registradas para ${appName} v${version}`);
|
|
145
|
+
});
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
#### 4. Dependency Management (2 hooks)
|
|
149
|
+
|
|
150
|
+
```javascript
|
|
151
|
+
hooks.addAction('app_dependencies_checking', (dependencies, appName, version) => {
|
|
152
|
+
if (dependencies && Object.keys(dependencies).length > 0) {
|
|
153
|
+
console.log(`📦 [DEPS] Verificando dependencias para ${appName} v${version}`);
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
hooks.addAction('app_dependencies_installed', (appName, version, success) => {
|
|
158
|
+
if (success) {
|
|
159
|
+
console.log(`✅ [DEPS] Dependencias instaladas para ${appName} v${version}`);
|
|
160
|
+
} else {
|
|
161
|
+
console.warn(`⚠️ [DEPS] Error instalando dependencias para ${appName} v${version}`);
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
#### 5. Configuration (2 hooks)
|
|
167
|
+
|
|
168
|
+
```javascript
|
|
169
|
+
hooks.addFilter('app_config_loading', (config, appName, version) => {
|
|
170
|
+
// Aquí se puede fusionar con configuración global si existe
|
|
171
|
+
return config;
|
|
172
|
+
}, 10);
|
|
173
|
+
|
|
174
|
+
hooks.addAction('app_config_loaded', (config, appName, version) => {
|
|
175
|
+
console.log(`⚙️ [CONFIG] Configuración cargada para ${appName} v${version}`);
|
|
176
|
+
});
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
## 📥 ¿Cómo se Carga en BlackCoffee?
|
|
182
|
+
|
|
183
|
+
### Archivo: `server.js`
|
|
184
|
+
|
|
185
|
+
#### Paso 1: Import (Línea 13)
|
|
186
|
+
|
|
187
|
+
```javascript
|
|
188
|
+
const { registerAppHooks } = require('./includes/appHooks');
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
#### Paso 2: Registro (Líneas 50-53)
|
|
192
|
+
|
|
193
|
+
```javascript
|
|
194
|
+
// Crear instancia del servidor
|
|
195
|
+
const server = new APIServer(config);
|
|
196
|
+
|
|
197
|
+
// Registrar hooks de App Server
|
|
198
|
+
registerAppHooks(server.hooks);
|
|
199
|
+
|
|
200
|
+
// Inicializar AppLoader y exponer globalmente
|
|
201
|
+
const appLoader = new AppLoader(server);
|
|
202
|
+
global.appLoader = appLoader;
|
|
203
|
+
server.appLoader = appLoader;
|
|
204
|
+
|
|
205
|
+
console.log('📦 AppLoader inicializado\n');
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
---
|
|
209
|
+
|
|
210
|
+
## 🔄 Flujo de Carga Completo
|
|
211
|
+
|
|
212
|
+
```
|
|
213
|
+
1. server.js se ejecuta
|
|
214
|
+
↓
|
|
215
|
+
2. Importa registerAppHooks desde includes/appHooks.js
|
|
216
|
+
↓
|
|
217
|
+
3. Crea instancia de APIServer (Insitu Framework)
|
|
218
|
+
↓
|
|
219
|
+
4. Llama registerAppHooks(server.hooks)
|
|
220
|
+
↓
|
|
221
|
+
5. registerAppHooks registra los 13 hooks en el HookSystem de Insitu
|
|
222
|
+
↓
|
|
223
|
+
6. Hooks quedan disponibles para todo el servidor
|
|
224
|
+
↓
|
|
225
|
+
7. appLoader.js usa los hooks cuando carga aplicaciones:
|
|
226
|
+
- hooks.applyFilters('before_app_routes_register', ...)
|
|
227
|
+
- hooks.doAction('after_app_routes_register', ...)
|
|
228
|
+
- hooks.doAction('app_deploying', ...)
|
|
229
|
+
- hooks.doAction('app_manifest_validated', ...)
|
|
230
|
+
- etc.
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
---
|
|
234
|
+
|
|
235
|
+
## 📊 Ejemplo de Uso en appLoader.js
|
|
236
|
+
|
|
237
|
+
### Archivo: `core/appLoader.js`
|
|
238
|
+
|
|
239
|
+
```javascript
|
|
240
|
+
async loadAppRoutes(routesPath, appName, version) {
|
|
241
|
+
const hooks = this.hooks;
|
|
242
|
+
const appPath = path.join(this.appsDir, appName, version);
|
|
243
|
+
|
|
244
|
+
try {
|
|
245
|
+
let routesData = fs.readFileSync(routesPath, 'utf8');
|
|
246
|
+
|
|
247
|
+
// Reemplazar __APP_DIR__ con la ruta real de la aplicación
|
|
248
|
+
routesData = routesData.replace(/__APP_DIR__/g, appPath);
|
|
249
|
+
|
|
250
|
+
const routes = JSON.parse(routesData);
|
|
251
|
+
|
|
252
|
+
if (!Array.isArray(routes)) {
|
|
253
|
+
throw new Error('El archivo de rutas debe contener un array');
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
console.log(`📍 Cargando ${routes.length} rutas para ${appName} v${version}...`);
|
|
257
|
+
|
|
258
|
+
for (const route of routes) {
|
|
259
|
+
// Crear ruta modificada con prefijo
|
|
260
|
+
const modifiedRoute = { ...route };
|
|
261
|
+
const prefix = `/${appName}/${version}`;
|
|
262
|
+
|
|
263
|
+
// Evitar doble prefijo
|
|
264
|
+
if (!modifiedRoute.path.startsWith(prefix)) {
|
|
265
|
+
modifiedRoute.path = `${prefix}${modifiedRoute.path}`;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// Agregar metadata de la app a la ruta
|
|
269
|
+
modifiedRoute.app = {
|
|
270
|
+
name: appName,
|
|
271
|
+
version: version,
|
|
272
|
+
deployedAt: new Date().toISOString()
|
|
273
|
+
};
|
|
274
|
+
|
|
275
|
+
// Disparar hook filter para permitir modificaciones adicionales
|
|
276
|
+
// applyFilters(hookName, value, ...additionalArgs)
|
|
277
|
+
// acceptedArgs debe ser 3 (routeConfig, appName, version)
|
|
278
|
+
const finalRoute = hooks.applyFilters(
|
|
279
|
+
'before_app_routes_register',
|
|
280
|
+
modifiedRoute,
|
|
281
|
+
appName,
|
|
282
|
+
version
|
|
283
|
+
);
|
|
284
|
+
|
|
285
|
+
console.log(` Registrando: ${finalRoute.method} ${finalRoute.path}`);
|
|
286
|
+
|
|
287
|
+
// Registrar ruta en el servidor
|
|
288
|
+
this.server.addRoute(finalRoute);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// Disparar hook after_app_routes_register
|
|
292
|
+
hooks.doAction('after_app_routes_register', routes, appName, version);
|
|
293
|
+
|
|
294
|
+
} catch (error) {
|
|
295
|
+
console.error(`❌ Error cargando rutas: ${error.message}`);
|
|
296
|
+
throw error;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
---
|
|
302
|
+
|
|
303
|
+
## 🆚 Comparación: appHooks.js vs app-hooks-handler.js
|
|
304
|
+
|
|
305
|
+
| Aspecto | `includes/appHooks.js` | `app-hooks-handler.js` (Insitu) |
|
|
306
|
+
|---------|----------------------|--------------------------------|
|
|
307
|
+
| **Ubicación** | BlackCoffee local | Insitu Framework |
|
|
308
|
+
| **Estado** | ✅ Activo y en uso | ❌ Creado pero NO usado |
|
|
309
|
+
| **Propósito** | Registrar hooks específicos | Centralizar handlers |
|
|
310
|
+
| **Carga** | `server.js` línea 13 | No importado |
|
|
311
|
+
| **Hooks** | 13 hooks registrados | 3 métodos handler |
|
|
312
|
+
| **Dependencia** | Ninguna | Requiere Insitu v1.2.1+ |
|
|
313
|
+
|
|
314
|
+
---
|
|
315
|
+
|
|
316
|
+
## 🎯 Handler Oficial de Insitu (NO USADO)
|
|
317
|
+
|
|
318
|
+
### Archivo: `node_modules/insitu-js/lib/core/hooks-handlers/app-hooks-handler.js`
|
|
319
|
+
|
|
320
|
+
### Métodos Disponibles
|
|
321
|
+
|
|
322
|
+
```javascript
|
|
323
|
+
class AppHooksHandler {
|
|
324
|
+
/**
|
|
325
|
+
* Dispara el hook antes de registrar las rutas de una aplicación
|
|
326
|
+
*/
|
|
327
|
+
static handleBeforeAppRouteRegister(server, routeConfig, appName, version) {
|
|
328
|
+
if (server.hooks) {
|
|
329
|
+
return server.hooks.applyFilters(
|
|
330
|
+
'before_app_routes_register',
|
|
331
|
+
routeConfig,
|
|
332
|
+
appName,
|
|
333
|
+
version
|
|
334
|
+
);
|
|
335
|
+
}
|
|
336
|
+
return routeConfig;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
/**
|
|
340
|
+
* Dispara el hook después de registrar las rutas de una aplicación
|
|
341
|
+
*/
|
|
342
|
+
static handleAfterAppRoutesRegister(server, routes, appName, version) {
|
|
343
|
+
if (server.hooks) {
|
|
344
|
+
server.hooks.doAction('after_app_routes_register', routes, appName, version);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
/**
|
|
349
|
+
* Dispara el hook cuando una ruta de aplicación es registrada
|
|
350
|
+
*/
|
|
351
|
+
static handleAppRouteRegistered(server, route, appName, version) {
|
|
352
|
+
if (server.hooks) {
|
|
353
|
+
server.hooks.doAction('app_route_registered', route, appName, version);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
module.exports = AppHooksHandler;
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
### ¿Cómo Integrarlo en el Futuro?
|
|
362
|
+
|
|
363
|
+
**Paso 1:** Importar en `server.js`
|
|
364
|
+
|
|
365
|
+
```javascript
|
|
366
|
+
const AppHooksHandler = require('insitu-js/lib/core/hooks-handlers/app-hooks-handler');
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
**Paso 2:** Usar en `core/appLoader.js`
|
|
370
|
+
|
|
371
|
+
```javascript
|
|
372
|
+
const AppHooksHandler = require('insitu-js/lib/core/hooks-handlers/app-hooks-handler');
|
|
373
|
+
|
|
374
|
+
// Reemplazar:
|
|
375
|
+
const finalRoute = hooks.applyFilters('before_app_routes_register', ...);
|
|
376
|
+
|
|
377
|
+
// Por:
|
|
378
|
+
const finalRoute = AppHooksHandler.handleBeforeAppRouteRegister(
|
|
379
|
+
this.server,
|
|
380
|
+
modifiedRoute,
|
|
381
|
+
appName,
|
|
382
|
+
version
|
|
383
|
+
);
|
|
384
|
+
|
|
385
|
+
// Y:
|
|
386
|
+
hooks.doAction('after_app_routes_register', routes, appName, version);
|
|
387
|
+
|
|
388
|
+
// Por:
|
|
389
|
+
AppHooksHandler.handleAfterAppRoutesRegister(
|
|
390
|
+
this.server,
|
|
391
|
+
routes,
|
|
392
|
+
appName,
|
|
393
|
+
version
|
|
394
|
+
);
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
**Paso 3:** Mantener `includes/appHooks.js` para hooks específicos de BlackCoffee que Insitu no tiene.
|
|
398
|
+
|
|
399
|
+
---
|
|
400
|
+
|
|
401
|
+
## 📝 Resumen
|
|
402
|
+
|
|
403
|
+
### Estado Actual
|
|
404
|
+
|
|
405
|
+
- ✅ `includes/appHooks.js` - **SE USA** - Registra 13 hooks en BlackCoffee
|
|
406
|
+
- ❌ `app-hooks-handler.js` (Insitu) - **NO SE USA** - Handler oficial creado pero no integrado
|
|
407
|
+
|
|
408
|
+
### Carga Actual
|
|
409
|
+
|
|
410
|
+
```javascript
|
|
411
|
+
// server.js línea 13
|
|
412
|
+
const { registerAppHooks } = require('./includes/appHooks');
|
|
413
|
+
|
|
414
|
+
// server.js línea 50
|
|
415
|
+
registerAppHooks(server.hooks);
|
|
416
|
+
```
|
|
417
|
+
|
|
418
|
+
### Hooks en Uso
|
|
419
|
+
|
|
420
|
+
1. **Application Lifecycle:** 6 hooks (deploy, undeploy, start, stop, restart)
|
|
421
|
+
2. **Manifest Validation:** 2 hooks (validating, validated)
|
|
422
|
+
3. **Route Registration:** 2 hooks (before, after)
|
|
423
|
+
4. **Dependency Management:** 2 hooks (checking, installed)
|
|
424
|
+
5. **Configuration:** 2 hooks (loading, loaded)
|
|
425
|
+
|
|
426
|
+
**Total:** 13 hooks operativos
|
|
427
|
+
|
|
428
|
+
---
|
|
429
|
+
|
|
430
|
+
**Documento creado:** 2026-02-16
|
|
431
|
+
**BlackCoffee:** v2.0.0
|
|
432
|
+
**Insitu Framework:** v1.2.1
|