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,207 @@
1
+ /**
2
+ * Modelo para la tabla tokens en el framework JERK
3
+ * Implementación del componente MVC TokenModel.js
4
+ * Utiliza MariaDB como adaptador de base de datos
5
+ */
6
+
7
+ const { ModelBase, hooks } = require('insitu-js');
8
+ const { getSharedAdapter } = require('../../utils/dbAdapter');
9
+ const { QueryBuilder } = require('insitu-js');
10
+
11
+ class TokenModel extends ModelBase {
12
+ constructor(options = {}) {
13
+ // Obtener el adaptador centralizado
14
+ const adapter = getSharedAdapter();
15
+
16
+ super({
17
+ ...options,
18
+ tableName: options.tableName || 'tokens',
19
+ adapter: adapter
20
+ });
21
+
22
+ // Inicializar QueryBuilder con el adaptador centralizado
23
+ this.queryBuilder = new QueryBuilder(adapter, 'tokens');
24
+
25
+ // Definir campos del modelo
26
+ this.fields = {
27
+ id: { type: 'integer', primaryKey: true, autoIncrement: true },
28
+ token: { type: 'string', required: true },
29
+ created_at: { type: 'datetime', auto: 'create' },
30
+ store_id: { type: 'integer' }
31
+ };
32
+ }
33
+
34
+ /**
35
+ * Valida un token contra la base de datos
36
+ * @param {string} token - Token a validar
37
+ * @returns {Promise<boolean>} - True si el token es válido y no revocado, false en caso contrario
38
+ */
39
+ async validateToken(token) {
40
+ if (!token) {
41
+ // Disparar hook de validación de token fallida
42
+ hooks.doAction('token_validation_failed', { token: token, reason: 'Token vacío o nulo' });
43
+ return false;
44
+ }
45
+
46
+ // Disparar hook de inicio de validación de token
47
+ hooks.doAction('token_validation_start', { token: token });
48
+
49
+ try {
50
+ // Buscar el token en la base de datos usando QueryBuilder
51
+ const tokenRecord = await this.queryBuilder
52
+ .reset()
53
+ .select('*')
54
+ .where('token', token)
55
+ .first();
56
+
57
+ if (tokenRecord) {
58
+ // Verificar si el token está revocado
59
+ if (tokenRecord.revoked === 1) {
60
+ // Disparar hook de validación de token fallida por revocación
61
+ hooks.doAction('token_validation_failed', { token: token, reason: 'Token revocado' });
62
+ return false;
63
+ }
64
+
65
+ // Disparar hook de validación de token exitosa
66
+ hooks.doAction('token_validation_success', { token: token, tokenRecord: tokenRecord });
67
+ return true;
68
+ } else {
69
+ // Disparar hook de validación de token fallida
70
+ hooks.doAction('token_validation_failed', { token: token, reason: 'Token no encontrado en la base de datos' });
71
+ return false;
72
+ }
73
+ } catch (error) {
74
+ console.error('[ERROR] TokenModel.validateToken:', error);
75
+ // Disparar hook de validación de token fallida por error
76
+ hooks.doAction('token_validation_error', { token: token, error: error.message });
77
+ return false;
78
+ }
79
+ }
80
+
81
+ /**
82
+ * Obtiene un token por su valor
83
+ * @param {string} token - Valor del token
84
+ * @returns {Promise<Object|null>} - Registro del token o null si no existe
85
+ */
86
+ async getToken(token) {
87
+ if (!token) {
88
+ return null;
89
+ }
90
+
91
+ try {
92
+ return await this.queryBuilder
93
+ .reset()
94
+ .select('*')
95
+ .where('token', token)
96
+ .first();
97
+ } catch (error) {
98
+ console.error('[ERROR] TokenModel.getToken:', error);
99
+ return null;
100
+ }
101
+ }
102
+
103
+ /**
104
+ * Obtiene todos los tokens
105
+ * @returns {Promise<Array>} - Lista de todos los tokens
106
+ */
107
+ async getAllTokens() {
108
+ try {
109
+ return await this.queryBuilder
110
+ .reset()
111
+ .select('*')
112
+ .get();
113
+ } catch (error) {
114
+ console.error('[ERROR] TokenModel.getAllTokens:', error);
115
+ return [];
116
+ }
117
+ }
118
+
119
+ /**
120
+ * Crea un nuevo token
121
+ * @param {Object} tokenData - Datos del token
122
+ * @returns {Promise<Object>} - Token creado
123
+ */
124
+ async createToken(tokenData) {
125
+ try {
126
+ const result = await this.queryBuilder
127
+ .reset()
128
+ .insert(tokenData);
129
+
130
+ // Obtener y devolver el token recién creado
131
+ return await this.queryBuilder
132
+ .reset()
133
+ .select('*')
134
+ .where('id', result.insertId)
135
+ .first();
136
+ } catch (error) {
137
+ console.error('[ERROR] TokenModel.createToken:', error);
138
+ throw error;
139
+ }
140
+ }
141
+
142
+ /**
143
+ * Revoca un token marcándolo como inhabilitado
144
+ * @param {string} token - Token a revocar
145
+ * @returns {Promise<boolean>} - True si se revocó correctamente
146
+ */
147
+ async revokeToken(token) {
148
+ try {
149
+ const result = await this.queryBuilder
150
+ .reset()
151
+ .update({
152
+ revoked: 1,
153
+ revoked_at: new Date()
154
+ })
155
+ .where('token', token);
156
+
157
+ return result.affectedRows > 0;
158
+ } catch (error) {
159
+ console.error(`[ERROR] TokenModel.revokeToken:`, error);
160
+ throw error;
161
+ }
162
+ }
163
+
164
+ /**
165
+ * Revoca todos los tokens de un usuario
166
+ * @param {number} userId - ID del usuario
167
+ * @returns {Promise<number>} - Número de tokens revocados
168
+ */
169
+ async revokeAllUserTokens(userId) {
170
+ try {
171
+ const result = await this.queryBuilder
172
+ .reset()
173
+ .update({
174
+ revoked: 1,
175
+ revoked_at: new Date()
176
+ })
177
+ .where('user_id', userId);
178
+
179
+ return result.affectedRows;
180
+ } catch (error) {
181
+ console.error(`[ERROR] TokenModel.revokeAllUserTokens:`, error);
182
+ throw error;
183
+ }
184
+ }
185
+
186
+ /**
187
+ * Verifica si un token está revocado
188
+ * @param {string} token - Token a verificar
189
+ * @returns {Promise<boolean>} - True si el token está revocado
190
+ */
191
+ async isTokenRevoked(token) {
192
+ try {
193
+ const tokenRecord = await this.queryBuilder
194
+ .reset()
195
+ .select(['revoked'])
196
+ .where('token', token)
197
+ .first();
198
+
199
+ return tokenRecord ? tokenRecord.revoked === 1 : true;
200
+ } catch (error) {
201
+ console.error(`[ERROR] TokenModel.isTokenRevoked:`, error);
202
+ return true; // En caso de error, asumir que está revocado por seguridad
203
+ }
204
+ }
205
+ }
206
+
207
+ module.exports = TokenModel;