blackcoffee2 2.1.0 → 2.1.2

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 (89) hide show
  1. package/.env.example +67 -0
  2. package/CHANGELOG.md +167 -0
  3. package/README.md +1 -3
  4. package/config/database.json +11 -0
  5. package/controllers/admin/AuthController.js +2 -1
  6. package/core/ViewHelper.js +75 -0
  7. package/core/hotReload.js +1 -1
  8. package/data/blackcoffee_admin.db-shm +0 -0
  9. package/data/blackcoffee_admin.db-wal +0 -0
  10. package/includes/adminAuth.js +5 -3
  11. package/includes/sessions.js +1 -1
  12. package/otrack.tar.gz +0 -0
  13. package/package.json +4 -2
  14. package/programatically/initFlow.js +2 -2
  15. package/test-aplicacion.con-logisession/BlackCoffee.js +0 -226
  16. package/test-aplicacion.con-logisession/SSL_SETUP.md +0 -53
  17. package/test-aplicacion.con-logisession/certs/ca-certificate.pem +0 -32
  18. package/test-aplicacion.con-logisession/certs/ca-private-key.pem +0 -52
  19. package/test-aplicacion.con-logisession/certs/certificate-2048.pem +0 -22
  20. package/test-aplicacion.con-logisession/certs/certificate.pem +0 -32
  21. package/test-aplicacion.con-logisession/certs/private-key-2048.pem +0 -28
  22. package/test-aplicacion.con-logisession/certs/private-key.pem +0 -52
  23. package/test-aplicacion.con-logisession/config/iaQueueSetup.js +0 -84
  24. package/test-aplicacion.con-logisession/config/qwen-rules.json +0 -39
  25. package/test-aplicacion.con-logisession/controllers/analyticsController.js +0 -117
  26. package/test-aplicacion.con-logisession/controllers/auth/AdminAuthController.js +0 -142
  27. package/test-aplicacion.con-logisession/controllers/auth/AuthController.js +0 -439
  28. package/test-aplicacion.con-logisession/controllers/auth/AuthViewController.js +0 -223
  29. package/test-aplicacion.con-logisession/controllers/endpointController.js +0 -66
  30. package/test-aplicacion.con-logisession/controllers/example.js +0 -183
  31. package/test-aplicacion.con-logisession/controllers/iaQueueController.js +0 -367
  32. package/test-aplicacion.con-logisession/controllers/queueController.js +0 -206
  33. package/test-aplicacion.con-logisession/controllers/qwenQueueController.js +0 -197
  34. package/test-aplicacion.con-logisession/controllers/test.js +0 -0
  35. package/test-aplicacion.con-logisession/controllers/tracking/EventsNoFinishController.js +0 -78
  36. package/test-aplicacion.con-logisession/controllers/tracking/TrackingController.js +0 -412
  37. package/test-aplicacion.con-logisession/controllers/tracking/TrackingControllerWithLoadModel.js +0 -437
  38. package/test-aplicacion.con-logisession/hooks/admin-hooks.js +0 -20
  39. package/test-aplicacion.con-logisession/hooks/general-hooks.js +0 -97
  40. package/test-aplicacion.con-logisession/hooks/queue-hooks.js +0 -64
  41. package/test-aplicacion.con-logisession/hooks/route-directory-hooks.js +0 -38
  42. package/test-aplicacion.con-logisession/hooks/security-hooks.js +0 -24
  43. package/test-aplicacion.con-logisession/insitu-admin-client/README.md +0 -69
  44. package/test-aplicacion.con-logisession/insitu-admin-client/package.json +0 -23
  45. package/test-aplicacion.con-logisession/insitu-admin-client.js +0 -257
  46. package/test-aplicacion.con-logisession/models/ExampleModel.js +0 -88
  47. package/test-aplicacion.con-logisession/models/QueueJobModel.js +0 -263
  48. package/test-aplicacion.con-logisession/models/TokenModel.js +0 -207
  49. package/test-aplicacion.con-logisession/models/auth/AuthModel.js +0 -66
  50. package/test-aplicacion.con-logisession/models/auth/UserModel.js +0 -189
  51. package/test-aplicacion.con-logisession/models/tracking/CompletedCartModel.js +0 -213
  52. package/test-aplicacion.con-logisession/models/tracking/EventModel.js +0 -366
  53. package/test-aplicacion.con-logisession/models/tracking/EventsNoFinishModel.js +0 -131
  54. package/test-aplicacion.con-logisession/models/tracking/SessionModel.js +0 -360
  55. package/test-aplicacion.con-logisession/models/tracking/SiteFlowModel.js +0 -286
  56. package/test-aplicacion.con-logisession/models/tracking/TokenModel.js +0 -207
  57. package/test-aplicacion.con-logisession/package-lock.json +0 -3313
  58. package/test-aplicacion.con-logisession/package.json +0 -32
  59. package/test-aplicacion.con-logisession/public/blackcoffee-welcome/index.html +0 -1339
  60. package/test-aplicacion.con-logisession/public/css/style.css +0 -64
  61. package/test-aplicacion.con-logisession/public/ejemplo-estatica/index.html +0 -18
  62. package/test-aplicacion.con-logisession/public/ejemplo-estatica/script.js +0 -16
  63. package/test-aplicacion.con-logisession/public/ejemplo-estatica/styles.css +0 -43
  64. package/test-aplicacion.con-logisession/public/images/logo.svg +0 -7
  65. package/test-aplicacion.con-logisession/public/js/main.js +0 -67
  66. package/test-aplicacion.con-logisession/routes/analytics-routes.json +0 -8
  67. package/test-aplicacion.con-logisession/routes/auth-routes.json +0 -98
  68. package/test-aplicacion.con-logisession/routes/blackcoffee-welcome-routes.json +0 -20
  69. package/test-aplicacion.con-logisession/routes/duplicate-test-routes.json.disabled +0 -16
  70. package/test-aplicacion.con-logisession/routes/ejemplo-estatica-routes.json +0 -11
  71. package/test-aplicacion.con-logisession/routes/endpoints-routes.json +0 -8
  72. package/test-aplicacion.con-logisession/routes/ia-queue-routes.json +0 -26
  73. package/test-aplicacion.con-logisession/routes/product-routes.json.disabled +0 -20
  74. package/test-aplicacion.con-logisession/routes/queue-routes.json +0 -32
  75. package/test-aplicacion.con-logisession/routes/qwen-routes.json +0 -14
  76. package/test-aplicacion.con-logisession/routes/static-routes.json +0 -29
  77. package/test-aplicacion.con-logisession/routes/tracking-routes.json +0 -58
  78. package/test-aplicacion.con-logisession/routes/tracking-with-loadmodel-routes.json +0 -51
  79. package/test-aplicacion.con-logisession/utils/dbAdapter.js +0 -88
  80. package/test-aplicacion.con-logisession/utils/qbWrapper.js +0 -4
  81. package/test-aplicacion.con-logisession/utils/queueProcessor.js +0 -305
  82. package/test-aplicacion.con-logisession/utils/qwenRulesService.js +0 -131
  83. package/test-aplicacion.con-logisession/utils/tokenHelper.js +0 -22
  84. package/test-aplicacion.con-logisession/views/auth/dashboard.html +0 -443
  85. package/test-aplicacion.con-logisession/views/auth/forgot-password.html +0 -200
  86. package/test-aplicacion.con-logisession/views/auth/login.html +0 -213
  87. package/test-aplicacion.con-logisession/views/auth/register.html +0 -294
  88. package/test-aplicacion.con-logisession/views/contact/form.html +0 -47
  89. package/test-aplicacion.con-logisession/views/products/index.html +0 -39
@@ -1,206 +0,0 @@
1
- const { ControllerBase } = require('insitu-js');
2
- const QueueJobModel = require('../models/QueueJobModel');
3
- const { queueProcessor } = require('../utils/queueProcessor');
4
-
5
- class QueueController extends ControllerBase {
6
- constructor(options = {}) {
7
- super(options);
8
- // Usar la instancia global del modelo de cola
9
- const QueueJobModel = require('../models/QueueJobModel');
10
- this.jobModel = QueueJobModel;
11
- }
12
-
13
- // Añadir un trabajo a la cola
14
- async addToQueue(req, res) {
15
- try {
16
- let requestData = {};
17
-
18
- if (req.body) {
19
- if (typeof req.body === 'string') {
20
- requestData = JSON.parse(req.body);
21
- } else {
22
- requestData = req.body;
23
- }
24
- } else {
25
- let body = '';
26
- for await (const chunk of req) {
27
- body += chunk.toString();
28
- }
29
- requestData = JSON.parse(body);
30
- }
31
-
32
- // Validar que el payload exista
33
- if (!requestData.payload) {
34
- return this.json(res, {
35
- success: false,
36
- error: 'Missing payload in request'
37
- }, 400);
38
- }
39
-
40
- // Crear el trabajo
41
- const jobData = {
42
- queue: requestData.queue || 'default',
43
- payload: requestData.payload,
44
- max_attempts: requestData.max_attempts || 3,
45
- scheduled_for: requestData.scheduled_for || new Date().toISOString(),
46
- priority: requestData.priority || 0
47
- };
48
-
49
- const job = await this.jobModel.createJob(jobData);
50
-
51
- this.json(res, {
52
- success: true,
53
- data: {
54
- jobId: job.id,
55
- queue: job.queue,
56
- status: job.status,
57
- scheduled_for: job.scheduled_for
58
- }
59
- });
60
-
61
- } catch (error) {
62
- this.json(res, {
63
- success: false,
64
- error: error.message
65
- }, 500);
66
- }
67
- }
68
-
69
- // Consultar el estado de un trabajo
70
- async getJobStatus(req, res) {
71
- try {
72
- const jobId = req.params?.id || this.input('id', null);
73
-
74
- if (!jobId) {
75
- return this.json(res, {
76
- success: false,
77
- error: 'Job ID is required'
78
- }, 400);
79
- }
80
-
81
- const jobStatus = await this.jobModel.getJobStatus(jobId);
82
-
83
- if (!jobStatus) {
84
- return this.json(res, {
85
- success: false,
86
- error: 'Job not found'
87
- }, 404);
88
- }
89
-
90
- this.json(res, {
91
- success: true,
92
- data: jobStatus
93
- });
94
-
95
- } catch (error) {
96
- this.json(res, {
97
- success: false,
98
- error: error.message
99
- }, 500);
100
- }
101
- }
102
-
103
- // Obtener estadísticas de la cola
104
- async getQueueStats(req, res) {
105
- try {
106
- const stats = {
107
- pending: this.jobModel.getJobsByStatus('pending').length,
108
- processing: this.jobModel.getJobsByStatus('processing').length,
109
- completed: this.jobModel.getJobsByStatus('completed').length,
110
- failed: this.jobModel.getJobsByStatus('failed').length,
111
- queues: Array.from(this.jobModel.queues.keys())
112
- };
113
-
114
- this.json(res, {
115
- success: true,
116
- data: stats
117
- });
118
-
119
- } catch (error) {
120
- this.json(res, {
121
- success: false,
122
- error: error.message
123
- }, 500);
124
- }
125
- }
126
-
127
- // Obtener trabajos por estado
128
- async getJobsByStatus(req, res) {
129
- try {
130
- const status = req.params?.status || this.input('status', 'pending');
131
-
132
- if (!['pending', 'processing', 'completed', 'failed'].includes(status)) {
133
- return this.json(res, {
134
- success: false,
135
- error: 'Invalid status. Use: pending, processing, completed, or failed'
136
- }, 400);
137
- }
138
-
139
- const jobs = this.jobModel.getJobsByStatus(status);
140
-
141
- this.json(res, {
142
- success: true,
143
- count: jobs.length,
144
- data: jobs
145
- });
146
-
147
- } catch (error) {
148
- this.json(res, {
149
- success: false,
150
- error: error.message
151
- }, 500);
152
- }
153
- }
154
-
155
- // Reiniciar el procesador de colas
156
- async restartQueueProcessor(req, res) {
157
- try {
158
- queueProcessor.stop();
159
- await this.delay(1000); // Esperar un segundo
160
- queueProcessor.start();
161
-
162
- this.json(res, {
163
- success: true,
164
- message: 'Queue processor restarted successfully'
165
- });
166
-
167
- } catch (error) {
168
- this.json(res, {
169
- success: false,
170
- error: error.message
171
- }, 500);
172
- }
173
- }
174
-
175
- // Método de utilidad para crear un delay
176
- delay(ms) {
177
- return new Promise(resolve => setTimeout(resolve, ms));
178
- }
179
- }
180
-
181
- // Instanciar el controlador
182
- const controllerInstance = new QueueController();
183
-
184
- // Exportar métodos individualmente
185
- module.exports = {
186
- addToQueue: (req, res) => {
187
- controllerInstance.setRequestResponse(req, res);
188
- controllerInstance.addToQueue(req, res);
189
- },
190
- getJobStatus: (req, res) => {
191
- controllerInstance.setRequestResponse(req, res);
192
- controllerInstance.getJobStatus(req, res);
193
- },
194
- getQueueStats: (req, res) => {
195
- controllerInstance.setRequestResponse(req, res);
196
- controllerInstance.getQueueStats(req, res);
197
- },
198
- getJobsByStatus: (req, res) => {
199
- controllerInstance.setRequestResponse(req, res);
200
- controllerInstance.getJobsByStatus(req, res);
201
- },
202
- restartQueueProcessor: (req, res) => {
203
- controllerInstance.setRequestResponse(req, res);
204
- controllerInstance.restartQueueProcessor(req, res);
205
- }
206
- };
@@ -1,197 +0,0 @@
1
- const { ControllerBase } = require('insitu-js');
2
- const QueueJobModel = require('../models/QueueJobModel');
3
- const { queueProcessor } = require('../utils/queueProcessor');
4
-
5
- class QwenQueueController extends ControllerBase {
6
- constructor(options = {}) {
7
- super(options);
8
- // Usar la instancia global del modelo de cola
9
- const QueueJobModel = require('../models/QueueJobModel');
10
- this.jobModel = QueueJobModel;
11
- }
12
-
13
- // Añadir un trabajo de Qwen a la cola
14
- async processWithQwenQueue(req, res) {
15
- try {
16
- let requestData = {};
17
-
18
- if (req.body) {
19
- if (typeof req.body === 'string') {
20
- requestData = JSON.parse(req.body);
21
- } else {
22
- requestData = req.body;
23
- }
24
- } else {
25
- let body = '';
26
- for await (const chunk of req) {
27
- body += chunk.toString();
28
- }
29
- requestData = JSON.parse(body);
30
- }
31
-
32
- // Validar que existan las secciones requeridas
33
- if (!requestData.data && !requestData.metrics) {
34
- return this.json(res, {
35
- success: false,
36
- error: 'Missing data or metrics section in request'
37
- }, 400);
38
- }
39
-
40
- if (!requestData.prompt) {
41
- return this.json(res, {
42
- success: false,
43
- error: 'Missing prompt section in request'
44
- }, 400);
45
- }
46
-
47
- // Preparar el payload para el trabajo
48
- const payload = {
49
- data: requestData.data || requestData.metrics,
50
- prompt: requestData.prompt,
51
- userId: requestData.userId || null,
52
- requestId: Date.now()
53
- };
54
-
55
- // Crear el trabajo en la cola de Qwen
56
- const jobData = {
57
- queue: 'qwen',
58
- payload: payload,
59
- priority: requestData.priority || 0,
60
- max_attempts: requestData.max_attempts || 3
61
- };
62
-
63
- const job = await this.jobModel.createJob(jobData);
64
-
65
- this.json(res, {
66
- success: true,
67
- data: {
68
- jobId: job.id,
69
- queue: job.queue,
70
- status: job.status,
71
- message: 'Qwen job added to queue successfully'
72
- }
73
- });
74
-
75
- } catch (error) {
76
- this.json(res, {
77
- success: false,
78
- error: error.message
79
- }, 500);
80
- }
81
- }
82
-
83
- // Consultar el resultado de un trabajo de Qwen
84
- async getQwenResult(req, res) {
85
- try {
86
- const jobId = req.params?.id || this.input('id', null);
87
-
88
- if (!jobId) {
89
- return this.json(res, {
90
- success: false,
91
- error: 'Job ID is required'
92
- }, 400);
93
- }
94
-
95
- const jobStatus = await this.jobModel.getJobStatus(jobId);
96
-
97
- if (!jobStatus) {
98
- return this.json(res, {
99
- success: false,
100
- error: 'Job not found'
101
- }, 404);
102
- }
103
-
104
- // Solo devolver el resultado si el trabajo está completado
105
- if (jobStatus.status === 'completed') {
106
- this.json(res, {
107
- success: true,
108
- data: {
109
- jobId: jobStatus.id,
110
- status: jobStatus.status,
111
- result: jobStatus.result,
112
- createdAt: jobStatus.created_at,
113
- completedAt: jobStatus.updated_at
114
- }
115
- });
116
- } else if (jobStatus.status === 'failed') {
117
- this.json(res, {
118
- success: false,
119
- error: 'Job failed',
120
- data: {
121
- jobId: jobStatus.id,
122
- status: jobStatus.status,
123
- error: jobStatus.error,
124
- attempts: jobStatus.attempts
125
- }
126
- });
127
- } else {
128
- // El trabajo aún está pendiente o en proceso
129
- this.json(res, {
130
- success: true,
131
- data: {
132
- jobId: jobStatus.id,
133
- status: jobStatus.status,
134
- message: `Job is ${jobStatus.status}, please check again later`,
135
- attempts: jobStatus.attempts,
136
- createdAt: jobStatus.created_at
137
- }
138
- });
139
- }
140
-
141
- } catch (error) {
142
- this.json(res, {
143
- success: false,
144
- error: error.message
145
- }, 500);
146
- }
147
- }
148
-
149
- // Añadir un manejador personalizado para la cola de Qwen
150
- async initializeQwenHandler() {
151
- // Registrar un manejador personalizado para la cola de Qwen
152
- queueProcessor.registerHandler('qwen', async (payload) => {
153
- try {
154
- // Importar exec aquí para evitar problemas de dependencias
155
- const { exec } = require('child_process');
156
- const util = require('util');
157
- const execAsync = util.promisify(exec);
158
-
159
- // Preparar el comando para Qwen
160
- const dataString = JSON.stringify(payload.data).replace(/"/g, '\\"');
161
- const qwenCommand = `qwen -p "${payload.prompt} ${dataString}"`;
162
-
163
- // Ejecutar el comando de Qwen
164
- const result = await execAsync(qwenCommand);
165
-
166
- return {
167
- success: true,
168
- response: result.stdout,
169
- command: qwenCommand,
170
- userId: payload.userId,
171
- requestId: payload.requestId
172
- };
173
- } catch (error) {
174
- console.error('Error executing Qwen command:', error);
175
- throw new Error(`Qwen execution failed: ${error.message}`);
176
- }
177
- });
178
- }
179
- }
180
-
181
- // Instanciar el controlador
182
- const controllerInstance = new QwenQueueController();
183
-
184
- // Inicializar el manejador de Qwen
185
- controllerInstance.initializeQwenHandler();
186
-
187
- // Exportar métodos individualmente
188
- module.exports = {
189
- processWithQwenQueue: (req, res) => {
190
- controllerInstance.setRequestResponse(req, res);
191
- controllerInstance.processWithQwenQueue(req, res);
192
- },
193
- getQwenResult: (req, res) => {
194
- controllerInstance.setRequestResponse(req, res);
195
- controllerInstance.getQwenResult(req, res);
196
- }
197
- };
@@ -1,78 +0,0 @@
1
- /**
2
- * Controlador para obtener sesiones únicas de eventos no finalizados
3
- * EventsNoFinishController.js
4
- */
5
-
6
- const { ControllerBase } = require('insitu-js');
7
- const EventsNoFinishModel = require('../../models/tracking/EventsNoFinishModel');
8
-
9
- class EventsNoFinishController extends ControllerBase {
10
- constructor(options = {}) {
11
- super(options);
12
-
13
- // Inicializar modelo
14
- this.model = new EventsNoFinishModel();
15
- }
16
-
17
- /**
18
- * Endpoint para obtener sesiones únicas de eventos no finalizados
19
- * GET /api/events-no-finish/sessions
20
- */
21
- async getUniqueSessions(req, res) {
22
- // Verificar si la respuesta ya ha sido enviada
23
- if (res.headersSent) {
24
- return;
25
- }
26
-
27
- try {
28
- // Obtener parámetros de consulta
29
- const queryParams = { ...req.query };
30
-
31
- // Extraer parámetros de paginación
32
- const offset = parseInt(queryParams.offset) || 0;
33
- const limit = parseInt(queryParams.limit) || 10;
34
- const pagination = { offset, limit };
35
-
36
- // Obtener otros parámetros de filtro excluyendo los de paginación
37
- const filters = {};
38
- for (const [key, value] of Object.entries(queryParams)) {
39
- if (!['offset', 'limit', 'sort', 'order'].includes(key)) {
40
- if (value !== '') { // Solo añadir filtros que no estén vacíos
41
- filters[key] = value;
42
- }
43
- }
44
- }
45
-
46
- // Obtener los resultados usando el modelo
47
- const result = await this.model.getUniqueSessions(filters, pagination);
48
-
49
- // Convertir BigInt a string para evitar problemas de serialización
50
- const serializedResult = JSON.parse(JSON.stringify(result, (key, value) =>
51
- typeof value === 'bigint' ? value.toString() : value
52
- ));
53
-
54
- res.writeHead(200, { 'Content-Type': 'application/json' });
55
- res.end(JSON.stringify(serializedResult));
56
- } catch (error) {
57
- console.error('Error en getUniqueSessions:', error);
58
- if (!res.headersSent) {
59
- res.writeHead(500, { 'Content-Type': 'application/json' });
60
- res.end(JSON.stringify({
61
- total: 0,
62
- rows: [],
63
- error: error.message
64
- }));
65
- }
66
- }
67
- }
68
- }
69
-
70
- // Exportar métodos individualmente para que RouteLoader pueda acceder a ellos
71
- const controllerInstance = new EventsNoFinishController();
72
-
73
- module.exports = {
74
- getUniqueSessions: (req, res) => {
75
- controllerInstance.setRequestResponse(req, res);
76
- controllerInstance.getUniqueSessions(req, res);
77
- }
78
- };