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.
- package/.env.example +67 -0
- package/CHANGELOG.md +167 -0
- package/README.md +1 -3
- package/config/database.json +11 -0
- package/controllers/admin/AuthController.js +2 -1
- package/core/ViewHelper.js +75 -0
- package/core/hotReload.js +1 -1
- package/data/blackcoffee_admin.db-shm +0 -0
- package/data/blackcoffee_admin.db-wal +0 -0
- package/includes/adminAuth.js +5 -3
- package/includes/sessions.js +1 -1
- package/otrack.tar.gz +0 -0
- package/package.json +4 -2
- package/programatically/initFlow.js +2 -2
- package/test-aplicacion.con-logisession/BlackCoffee.js +0 -226
- package/test-aplicacion.con-logisession/SSL_SETUP.md +0 -53
- package/test-aplicacion.con-logisession/certs/ca-certificate.pem +0 -32
- package/test-aplicacion.con-logisession/certs/ca-private-key.pem +0 -52
- package/test-aplicacion.con-logisession/certs/certificate-2048.pem +0 -22
- package/test-aplicacion.con-logisession/certs/certificate.pem +0 -32
- package/test-aplicacion.con-logisession/certs/private-key-2048.pem +0 -28
- package/test-aplicacion.con-logisession/certs/private-key.pem +0 -52
- package/test-aplicacion.con-logisession/config/iaQueueSetup.js +0 -84
- package/test-aplicacion.con-logisession/config/qwen-rules.json +0 -39
- package/test-aplicacion.con-logisession/controllers/analyticsController.js +0 -117
- package/test-aplicacion.con-logisession/controllers/auth/AdminAuthController.js +0 -142
- package/test-aplicacion.con-logisession/controllers/auth/AuthController.js +0 -439
- package/test-aplicacion.con-logisession/controllers/auth/AuthViewController.js +0 -223
- package/test-aplicacion.con-logisession/controllers/endpointController.js +0 -66
- package/test-aplicacion.con-logisession/controllers/example.js +0 -183
- package/test-aplicacion.con-logisession/controllers/iaQueueController.js +0 -367
- package/test-aplicacion.con-logisession/controllers/queueController.js +0 -206
- package/test-aplicacion.con-logisession/controllers/qwenQueueController.js +0 -197
- package/test-aplicacion.con-logisession/controllers/test.js +0 -0
- package/test-aplicacion.con-logisession/controllers/tracking/EventsNoFinishController.js +0 -78
- package/test-aplicacion.con-logisession/controllers/tracking/TrackingController.js +0 -412
- package/test-aplicacion.con-logisession/controllers/tracking/TrackingControllerWithLoadModel.js +0 -437
- package/test-aplicacion.con-logisession/hooks/admin-hooks.js +0 -20
- package/test-aplicacion.con-logisession/hooks/general-hooks.js +0 -97
- package/test-aplicacion.con-logisession/hooks/queue-hooks.js +0 -64
- package/test-aplicacion.con-logisession/hooks/route-directory-hooks.js +0 -38
- package/test-aplicacion.con-logisession/hooks/security-hooks.js +0 -24
- package/test-aplicacion.con-logisession/insitu-admin-client/README.md +0 -69
- package/test-aplicacion.con-logisession/insitu-admin-client/package.json +0 -23
- package/test-aplicacion.con-logisession/insitu-admin-client.js +0 -257
- package/test-aplicacion.con-logisession/models/ExampleModel.js +0 -88
- package/test-aplicacion.con-logisession/models/QueueJobModel.js +0 -263
- package/test-aplicacion.con-logisession/models/TokenModel.js +0 -207
- package/test-aplicacion.con-logisession/models/auth/AuthModel.js +0 -66
- package/test-aplicacion.con-logisession/models/auth/UserModel.js +0 -189
- package/test-aplicacion.con-logisession/models/tracking/CompletedCartModel.js +0 -213
- package/test-aplicacion.con-logisession/models/tracking/EventModel.js +0 -366
- package/test-aplicacion.con-logisession/models/tracking/EventsNoFinishModel.js +0 -131
- package/test-aplicacion.con-logisession/models/tracking/SessionModel.js +0 -360
- package/test-aplicacion.con-logisession/models/tracking/SiteFlowModel.js +0 -286
- package/test-aplicacion.con-logisession/models/tracking/TokenModel.js +0 -207
- package/test-aplicacion.con-logisession/package-lock.json +0 -3313
- package/test-aplicacion.con-logisession/package.json +0 -32
- package/test-aplicacion.con-logisession/public/blackcoffee-welcome/index.html +0 -1339
- package/test-aplicacion.con-logisession/public/css/style.css +0 -64
- package/test-aplicacion.con-logisession/public/ejemplo-estatica/index.html +0 -18
- package/test-aplicacion.con-logisession/public/ejemplo-estatica/script.js +0 -16
- package/test-aplicacion.con-logisession/public/ejemplo-estatica/styles.css +0 -43
- package/test-aplicacion.con-logisession/public/images/logo.svg +0 -7
- package/test-aplicacion.con-logisession/public/js/main.js +0 -67
- package/test-aplicacion.con-logisession/routes/analytics-routes.json +0 -8
- package/test-aplicacion.con-logisession/routes/auth-routes.json +0 -98
- package/test-aplicacion.con-logisession/routes/blackcoffee-welcome-routes.json +0 -20
- package/test-aplicacion.con-logisession/routes/duplicate-test-routes.json.disabled +0 -16
- package/test-aplicacion.con-logisession/routes/ejemplo-estatica-routes.json +0 -11
- package/test-aplicacion.con-logisession/routes/endpoints-routes.json +0 -8
- package/test-aplicacion.con-logisession/routes/ia-queue-routes.json +0 -26
- package/test-aplicacion.con-logisession/routes/product-routes.json.disabled +0 -20
- package/test-aplicacion.con-logisession/routes/queue-routes.json +0 -32
- package/test-aplicacion.con-logisession/routes/qwen-routes.json +0 -14
- package/test-aplicacion.con-logisession/routes/static-routes.json +0 -29
- package/test-aplicacion.con-logisession/routes/tracking-routes.json +0 -58
- package/test-aplicacion.con-logisession/routes/tracking-with-loadmodel-routes.json +0 -51
- package/test-aplicacion.con-logisession/utils/dbAdapter.js +0 -88
- package/test-aplicacion.con-logisession/utils/qbWrapper.js +0 -4
- package/test-aplicacion.con-logisession/utils/queueProcessor.js +0 -305
- package/test-aplicacion.con-logisession/utils/qwenRulesService.js +0 -131
- package/test-aplicacion.con-logisession/utils/tokenHelper.js +0 -22
- package/test-aplicacion.con-logisession/views/auth/dashboard.html +0 -443
- package/test-aplicacion.con-logisession/views/auth/forgot-password.html +0 -200
- package/test-aplicacion.con-logisession/views/auth/login.html +0 -213
- package/test-aplicacion.con-logisession/views/auth/register.html +0 -294
- package/test-aplicacion.con-logisession/views/contact/form.html +0 -47
- package/test-aplicacion.con-logisession/views/products/index.html +0 -39
|
@@ -1,439 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Controlador de autenticación para el framework JERK
|
|
3
|
-
* AuthController.js
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
const { ControllerBase } = require('insitu-js');
|
|
7
|
-
const AuthModel = require('../../models/auth/AuthModel');
|
|
8
|
-
const { validateToken } = require('../../utils/tokenHelper');
|
|
9
|
-
const jwt = require('jsonwebtoken');
|
|
10
|
-
|
|
11
|
-
class AuthController extends ControllerBase {
|
|
12
|
-
constructor(options = {}) {
|
|
13
|
-
super(options);
|
|
14
|
-
this.authModel = new AuthModel();
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Endpoint para login de usuarios
|
|
19
|
-
* POST /api/auth/login
|
|
20
|
-
*/
|
|
21
|
-
async login(req, res) {
|
|
22
|
-
try {
|
|
23
|
-
const { username, password } = req.body;
|
|
24
|
-
|
|
25
|
-
if (!username || !password) {
|
|
26
|
-
return this.json(res, {
|
|
27
|
-
success: false,
|
|
28
|
-
error: 'Username y password son requeridos'
|
|
29
|
-
}, 400);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
// Autenticar al usuario
|
|
33
|
-
const user = await this.authModel.authenticateUser(username, password);
|
|
34
|
-
|
|
35
|
-
if (!user) {
|
|
36
|
-
return this.json(res, {
|
|
37
|
-
success: false,
|
|
38
|
-
error: 'Credenciales inválidas'
|
|
39
|
-
}, 401);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
// Crear sesión de usuario autenticado
|
|
43
|
-
if (req.session) {
|
|
44
|
-
req.session.create({
|
|
45
|
-
authenticated: true,
|
|
46
|
-
userId: user.id,
|
|
47
|
-
username: user.username,
|
|
48
|
-
email: user.email
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
// Generar token JWT para el usuario autenticado
|
|
53
|
-
const jwt = require('jsonwebtoken');
|
|
54
|
-
const secret = process.env.JWT_SECRET || 'default_secret_key_for_dev';
|
|
55
|
-
|
|
56
|
-
const tokenPayload = {
|
|
57
|
-
userId: user.id,
|
|
58
|
-
username: user.username,
|
|
59
|
-
email: user.email
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
const token = jwt.sign(tokenPayload, secret, { expiresIn: '24h' });
|
|
63
|
-
|
|
64
|
-
// Guardar el token en la base de datos
|
|
65
|
-
const TokenModel = require('../../models/tracking/TokenModel');
|
|
66
|
-
const tokenModel = new TokenModel();
|
|
67
|
-
|
|
68
|
-
await tokenModel.createToken({
|
|
69
|
-
token: token,
|
|
70
|
-
user_id: user.id,
|
|
71
|
-
store_id: 1 // ID del store predeterminado
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
// Obtener información del usuario
|
|
75
|
-
const userInfo = await this.authModel.getUserById(user.id);
|
|
76
|
-
|
|
77
|
-
this.json(res, {
|
|
78
|
-
success: true,
|
|
79
|
-
message: 'Inicio de sesión exitoso',
|
|
80
|
-
token: token, // Incluir el token en la respuesta
|
|
81
|
-
user: {
|
|
82
|
-
id: user.id,
|
|
83
|
-
username: user.username,
|
|
84
|
-
email: user.email,
|
|
85
|
-
roles: userInfo.roles || [],
|
|
86
|
-
capabilities: userInfo.capabilities || []
|
|
87
|
-
}
|
|
88
|
-
});
|
|
89
|
-
} catch (error) {
|
|
90
|
-
console.error('Error en login:', error);
|
|
91
|
-
this.json(res, {
|
|
92
|
-
success: false,
|
|
93
|
-
error: error.message
|
|
94
|
-
}, 500);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* Endpoint para registro de usuarios
|
|
100
|
-
* POST /api/auth/register
|
|
101
|
-
*/
|
|
102
|
-
async register(req, res) {
|
|
103
|
-
try {
|
|
104
|
-
const { username, password, email } = req.body;
|
|
105
|
-
|
|
106
|
-
if (!username || !password || !email) {
|
|
107
|
-
return this.json(res, {
|
|
108
|
-
success: false,
|
|
109
|
-
error: 'Username, password y email son requeridos'
|
|
110
|
-
}, 400);
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
// Verificar si el usuario ya existe
|
|
114
|
-
const existingUser = await this.authModel.userModel.getUserByIdentifier(username);
|
|
115
|
-
if (existingUser) {
|
|
116
|
-
return this.json(res, {
|
|
117
|
-
success: false,
|
|
118
|
-
error: 'El nombre de usuario ya existe'
|
|
119
|
-
}, 409);
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
// Verificar si el email ya existe
|
|
123
|
-
const existingEmail = await this.authModel.userModel.queryBuilder
|
|
124
|
-
.reset()
|
|
125
|
-
.select('*')
|
|
126
|
-
.where('email', email)
|
|
127
|
-
.first();
|
|
128
|
-
|
|
129
|
-
if (existingEmail) {
|
|
130
|
-
return this.json(res, {
|
|
131
|
-
success: false,
|
|
132
|
-
error: 'El email ya está registrado'
|
|
133
|
-
}, 409);
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
// Registrar al nuevo usuario
|
|
137
|
-
const newUser = await this.authModel.registerUser({
|
|
138
|
-
username,
|
|
139
|
-
password,
|
|
140
|
-
email
|
|
141
|
-
});
|
|
142
|
-
|
|
143
|
-
// Obtener información del usuario
|
|
144
|
-
const userInfo = await this.authModel.getUserById(newUser.id);
|
|
145
|
-
|
|
146
|
-
this.json(res, {
|
|
147
|
-
success: true,
|
|
148
|
-
message: 'Usuario registrado exitosamente',
|
|
149
|
-
user: {
|
|
150
|
-
id: newUser.id,
|
|
151
|
-
username: newUser.username,
|
|
152
|
-
email: newUser.email,
|
|
153
|
-
roles: userInfo.roles || [],
|
|
154
|
-
capabilities: userInfo.capabilities || []
|
|
155
|
-
}
|
|
156
|
-
});
|
|
157
|
-
} catch (error) {
|
|
158
|
-
console.error('Error en registro:', error);
|
|
159
|
-
this.json(res, {
|
|
160
|
-
success: false,
|
|
161
|
-
error: error.message
|
|
162
|
-
}, 500);
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
/**
|
|
167
|
-
* Endpoint para obtener el perfil del usuario autenticado
|
|
168
|
-
* GET /api/auth/profile
|
|
169
|
-
*/
|
|
170
|
-
async profile(req, res) {
|
|
171
|
-
try {
|
|
172
|
-
// Verificar si el usuario está autenticado a través de la sesión
|
|
173
|
-
if (!req.session || !req.session.data || !req.session.data.authenticated) {
|
|
174
|
-
return this.json(res, {
|
|
175
|
-
success: false,
|
|
176
|
-
error: 'Usuario no autenticado'
|
|
177
|
-
}, 401);
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
// Obtener información del usuario desde la sesión
|
|
181
|
-
const sessionData = req.session.data;
|
|
182
|
-
const userId = sessionData.userId;
|
|
183
|
-
|
|
184
|
-
// Obtener información del usuario
|
|
185
|
-
const user = await this.authModel.getUserById(userId);
|
|
186
|
-
|
|
187
|
-
if (!user) {
|
|
188
|
-
return this.json(res, {
|
|
189
|
-
success: false,
|
|
190
|
-
error: 'Usuario no encontrado'
|
|
191
|
-
}, 404);
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
this.json(res, {
|
|
195
|
-
success: true,
|
|
196
|
-
user: {
|
|
197
|
-
id: user.id,
|
|
198
|
-
username: user.username,
|
|
199
|
-
email: user.email,
|
|
200
|
-
roles: user.roles,
|
|
201
|
-
capabilities: user.capabilities
|
|
202
|
-
}
|
|
203
|
-
});
|
|
204
|
-
} catch (error) {
|
|
205
|
-
console.error('Error en profile:', error);
|
|
206
|
-
this.json(res, {
|
|
207
|
-
success: false,
|
|
208
|
-
error: error.message
|
|
209
|
-
}, 500);
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
/**
|
|
214
|
-
* Endpoint para verificar si un usuario tiene una capability específica
|
|
215
|
-
* GET /api/auth/check-capability
|
|
216
|
-
*/
|
|
217
|
-
async checkCapability(req, res) {
|
|
218
|
-
try {
|
|
219
|
-
// Verificar si el usuario está autenticado a través de la sesión
|
|
220
|
-
if (!req.session || !req.session.data || !req.session.data.authenticated) {
|
|
221
|
-
return this.json(res, {
|
|
222
|
-
success: false,
|
|
223
|
-
error: 'Usuario no autenticado'
|
|
224
|
-
}, 401);
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
// Obtener información del usuario desde la sesión
|
|
228
|
-
const sessionData = req.session.data;
|
|
229
|
-
const userId = sessionData.userId;
|
|
230
|
-
|
|
231
|
-
// Obtener el nombre de la capability de los parámetros de consulta
|
|
232
|
-
const capabilityName = req.query.capability;
|
|
233
|
-
if (!capabilityName) {
|
|
234
|
-
return this.json(res, {
|
|
235
|
-
success: false,
|
|
236
|
-
error: 'Nombre de capability requerido'
|
|
237
|
-
}, 400);
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
// Verificar si el usuario tiene la capability
|
|
241
|
-
const hasCapability = await this.authModel.userHasCapability(userId, capabilityName);
|
|
242
|
-
|
|
243
|
-
this.json(res, {
|
|
244
|
-
success: true,
|
|
245
|
-
hasCapability: hasCapability,
|
|
246
|
-
capability: capabilityName,
|
|
247
|
-
userId: userId
|
|
248
|
-
});
|
|
249
|
-
} catch (error) {
|
|
250
|
-
console.error('Error en checkCapability:', error);
|
|
251
|
-
this.json(res, {
|
|
252
|
-
success: false,
|
|
253
|
-
error: error.message
|
|
254
|
-
}, 500);
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
/**
|
|
259
|
-
* Endpoint para logout de usuarios
|
|
260
|
-
* POST /api/auth/logout
|
|
261
|
-
*/
|
|
262
|
-
async logout(req, res) {
|
|
263
|
-
try {
|
|
264
|
-
// Destruir la sesión si existe
|
|
265
|
-
if (req.session) {
|
|
266
|
-
req.session.destroy();
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
// Si se proporciona un token en el header, revocarlo
|
|
270
|
-
const authHeader = req.headers['authorization'];
|
|
271
|
-
if (authHeader && authHeader.startsWith('Bearer ')) {
|
|
272
|
-
const token = authHeader.substring(7); // Remover 'Bearer ' del principio
|
|
273
|
-
|
|
274
|
-
// Revocar el token específico
|
|
275
|
-
const TokenModel = require('../../models/tracking/TokenModel');
|
|
276
|
-
const tokenModel = new TokenModel();
|
|
277
|
-
|
|
278
|
-
try {
|
|
279
|
-
await tokenModel.revokeToken(token);
|
|
280
|
-
} catch (revokeError) {
|
|
281
|
-
console.error('Error revocando token durante logout:', revokeError);
|
|
282
|
-
// No lanzar error si falla la revocación del token, solo registrar
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
this.json(res, {
|
|
287
|
-
success: true,
|
|
288
|
-
message: 'Cierre de sesión exitoso'
|
|
289
|
-
});
|
|
290
|
-
} catch (error) {
|
|
291
|
-
console.error('Error en logout:', error);
|
|
292
|
-
this.json(res, {
|
|
293
|
-
success: false,
|
|
294
|
-
error: error.message
|
|
295
|
-
}, 500);
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
/**
|
|
300
|
-
* Método para validar token
|
|
301
|
-
*/
|
|
302
|
-
async validateToken(token) {
|
|
303
|
-
try {
|
|
304
|
-
const isValid = await validateToken(token);
|
|
305
|
-
return isValid;
|
|
306
|
-
} catch (error) {
|
|
307
|
-
console.error('Error validando token:', error);
|
|
308
|
-
return false;
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
/**
|
|
313
|
-
* Endpoint para verificar si un usuario tiene un rol específico
|
|
314
|
-
* GET /api/auth/check-role
|
|
315
|
-
*/
|
|
316
|
-
async checkRole(req, res) {
|
|
317
|
-
try {
|
|
318
|
-
// Verificar si el usuario está autenticado a través de la sesión o token
|
|
319
|
-
const isAuthenticated = await this.checkAuthentication(req);
|
|
320
|
-
|
|
321
|
-
if (!isAuthenticated) {
|
|
322
|
-
return this.json(res, {
|
|
323
|
-
success: false,
|
|
324
|
-
error: 'Usuario no autenticado'
|
|
325
|
-
}, 401);
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
// Obtener el ID del usuario desde la sesión o token
|
|
329
|
-
const userId = await this.getUserIdFromRequest(req);
|
|
330
|
-
|
|
331
|
-
// Obtener el nombre del rol de los parámetros de consulta
|
|
332
|
-
const roleName = req.query.role;
|
|
333
|
-
if (!roleName) {
|
|
334
|
-
return this.json(res, {
|
|
335
|
-
success: false,
|
|
336
|
-
error: 'Nombre de rol requerido'
|
|
337
|
-
}, 400);
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
// Verificar si el usuario tiene el rol
|
|
341
|
-
const UserRoleModel = require('../models/UserRoleModel');
|
|
342
|
-
const userRoleModel = new UserRoleModel();
|
|
343
|
-
|
|
344
|
-
const hasRole = await userRoleModel.userHasRoleByName(userId, roleName);
|
|
345
|
-
|
|
346
|
-
this.json(res, {
|
|
347
|
-
success: true,
|
|
348
|
-
hasRole: hasRole,
|
|
349
|
-
role: roleName,
|
|
350
|
-
userId: userId
|
|
351
|
-
});
|
|
352
|
-
} catch (error) {
|
|
353
|
-
console.error('Error en checkRole:', error);
|
|
354
|
-
this.json(res, {
|
|
355
|
-
success: false,
|
|
356
|
-
error: error.message
|
|
357
|
-
}, 500);
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
/**
|
|
362
|
-
* Método para verificar autenticación (token o sesión)
|
|
363
|
-
*/
|
|
364
|
-
async checkAuthentication(req) {
|
|
365
|
-
// Primero verificar si hay un token de autorización
|
|
366
|
-
const authHeader = req.headers['authorization'];
|
|
367
|
-
if (authHeader && authHeader.startsWith('Bearer ')) {
|
|
368
|
-
const token = authHeader.substring(7); // Remover 'Bearer ' del principio
|
|
369
|
-
const isValidToken = await this.validateToken(token);
|
|
370
|
-
return isValidToken;
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
// Luego verificar si hay una sesión válida
|
|
374
|
-
if (req.session && req.session.data && req.session.data.authenticated) {
|
|
375
|
-
return true;
|
|
376
|
-
}
|
|
377
|
-
|
|
378
|
-
// Si no hay token ni sesión válidos
|
|
379
|
-
return false;
|
|
380
|
-
}
|
|
381
|
-
|
|
382
|
-
/**
|
|
383
|
-
* Método para obtener el ID del usuario desde la solicitud (token o sesión)
|
|
384
|
-
*/
|
|
385
|
-
async getUserIdFromRequest(req) {
|
|
386
|
-
// Primero intentar obtener de token
|
|
387
|
-
const authHeader = req.headers['authorization'];
|
|
388
|
-
if (authHeader && authHeader.startsWith('Bearer ')) {
|
|
389
|
-
const token = authHeader.substring(7);
|
|
390
|
-
const jwt = require('jsonwebtoken');
|
|
391
|
-
const secret = process.env.JWT_SECRET || 'default_secret_key_for_dev';
|
|
392
|
-
|
|
393
|
-
try {
|
|
394
|
-
const decoded = jwt.verify(token, secret);
|
|
395
|
-
return decoded.userId;
|
|
396
|
-
} catch (error) {
|
|
397
|
-
console.error('Error decodificando token:', error);
|
|
398
|
-
return null;
|
|
399
|
-
}
|
|
400
|
-
}
|
|
401
|
-
|
|
402
|
-
// Luego intentar obtener de sesión
|
|
403
|
-
if (req.session && req.session.data && req.session.data.authenticated) {
|
|
404
|
-
return req.session.data.userId;
|
|
405
|
-
}
|
|
406
|
-
|
|
407
|
-
return null;
|
|
408
|
-
}
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
// Exportar métodos individualmente para que RouteLoader pueda acceder a ellos
|
|
412
|
-
const controllerInstance = new AuthController();
|
|
413
|
-
|
|
414
|
-
module.exports = {
|
|
415
|
-
login: (req, res) => {
|
|
416
|
-
controllerInstance.setRequestResponse(req, res);
|
|
417
|
-
controllerInstance.login(req, res);
|
|
418
|
-
},
|
|
419
|
-
register: (req, res) => {
|
|
420
|
-
controllerInstance.setRequestResponse(req, res);
|
|
421
|
-
controllerInstance.register(req, res);
|
|
422
|
-
},
|
|
423
|
-
profile: (req, res) => {
|
|
424
|
-
controllerInstance.setRequestResponse(req, res);
|
|
425
|
-
controllerInstance.profile(req, res);
|
|
426
|
-
},
|
|
427
|
-
checkCapability: (req, res) => {
|
|
428
|
-
controllerInstance.setRequestResponse(req, res);
|
|
429
|
-
controllerInstance.checkCapability(req, res);
|
|
430
|
-
},
|
|
431
|
-
logout: (req, res) => {
|
|
432
|
-
controllerInstance.setRequestResponse(req, res);
|
|
433
|
-
controllerInstance.logout(req, res);
|
|
434
|
-
},
|
|
435
|
-
checkRole: (req, res) => {
|
|
436
|
-
controllerInstance.setRequestResponse(req, res);
|
|
437
|
-
controllerInstance.checkRole(req, res);
|
|
438
|
-
}
|
|
439
|
-
};
|
|
@@ -1,223 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Controlador para vistas de autenticación
|
|
3
|
-
* AuthViewController.js
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
const { ControllerBase } = require('insitu-js');
|
|
7
|
-
|
|
8
|
-
class AuthViewController extends ControllerBase {
|
|
9
|
-
constructor(options = {}) {
|
|
10
|
-
super(options);
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Muestra la página de inicio de sesión
|
|
15
|
-
* GET /login
|
|
16
|
-
*/
|
|
17
|
-
async showLogin(req, res) {
|
|
18
|
-
try {
|
|
19
|
-
// Preparar datos para la vista
|
|
20
|
-
this.set('title', 'Iniciar Sesión');
|
|
21
|
-
this.set('message', 'Por favor, ingresa tus credenciales para continuar');
|
|
22
|
-
|
|
23
|
-
// Renderizar la vista
|
|
24
|
-
const html = this.view('auth/login', {
|
|
25
|
-
title: 'Iniciar Sesión',
|
|
26
|
-
message: 'Por favor, ingresa tus credenciales para continuar'
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
30
|
-
res.end(html);
|
|
31
|
-
} catch (error) {
|
|
32
|
-
console.error('Error en showLogin:', error);
|
|
33
|
-
res.writeHead(500, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
34
|
-
res.end(`
|
|
35
|
-
<!DOCTYPE html>
|
|
36
|
-
<html>
|
|
37
|
-
<head>
|
|
38
|
-
<title>Error</title>
|
|
39
|
-
<meta charset="utf-8">
|
|
40
|
-
</head>
|
|
41
|
-
<body>
|
|
42
|
-
<h1>Error al cargar la página de inicio de sesión</h1>
|
|
43
|
-
<p>${error.message}</p>
|
|
44
|
-
<a href="/">Volver al inicio</a>
|
|
45
|
-
</body>
|
|
46
|
-
</html>
|
|
47
|
-
`);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* Muestra la página de registro
|
|
53
|
-
* GET /register
|
|
54
|
-
*/
|
|
55
|
-
async showRegister(req, res) {
|
|
56
|
-
try {
|
|
57
|
-
// Preparar datos para la vista
|
|
58
|
-
this.set('title', 'Registrarse');
|
|
59
|
-
this.set('message', 'Crea una cuenta para comenzar');
|
|
60
|
-
|
|
61
|
-
// Renderizar la vista
|
|
62
|
-
const html = this.view('auth/register', {
|
|
63
|
-
title: 'Registrarse',
|
|
64
|
-
message: 'Crea una cuenta para comenzar'
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
68
|
-
res.end(html);
|
|
69
|
-
} catch (error) {
|
|
70
|
-
console.error('Error en showRegister:', error);
|
|
71
|
-
res.writeHead(500, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
72
|
-
res.end(`
|
|
73
|
-
<!DOCTYPE html>
|
|
74
|
-
<html>
|
|
75
|
-
<head>
|
|
76
|
-
<title>Error</title>
|
|
77
|
-
<meta charset="utf-8">
|
|
78
|
-
</head>
|
|
79
|
-
<body>
|
|
80
|
-
<h1>Error al cargar la página de registro</h1>
|
|
81
|
-
<p>${error.message}</p>
|
|
82
|
-
<a href="/">Volver al inicio</a>
|
|
83
|
-
</body>
|
|
84
|
-
</html>
|
|
85
|
-
`);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* Muestra la página de olvido de contraseña
|
|
91
|
-
* GET /forgot-password
|
|
92
|
-
*/
|
|
93
|
-
async showForgotPassword(req, res) {
|
|
94
|
-
try {
|
|
95
|
-
// Preparar datos para la vista
|
|
96
|
-
this.set('title', 'Recuperar Contraseña');
|
|
97
|
-
this.set('message', 'Ingresa tu email para recuperar tu contraseña');
|
|
98
|
-
|
|
99
|
-
// Renderizar la vista
|
|
100
|
-
const html = this.view('auth/forgot-password', {
|
|
101
|
-
title: 'Recuperar Contraseña',
|
|
102
|
-
message: 'Ingresa tu email para recuperar tu contraseña'
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
106
|
-
res.end(html);
|
|
107
|
-
} catch (error) {
|
|
108
|
-
console.error('Error en showForgotPassword:', error);
|
|
109
|
-
res.writeHead(500, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
110
|
-
res.end(`
|
|
111
|
-
<!DOCTYPE html>
|
|
112
|
-
<html>
|
|
113
|
-
<head>
|
|
114
|
-
<title>Error</title>
|
|
115
|
-
<meta charset="utf-8">
|
|
116
|
-
</head>
|
|
117
|
-
<body>
|
|
118
|
-
<h1>Error al cargar la página de recuperación de contraseña</h1>
|
|
119
|
-
<p>${error.message}</p>
|
|
120
|
-
<a href="/">Volver al inicio</a>
|
|
121
|
-
</body>
|
|
122
|
-
</html>
|
|
123
|
-
`);
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
/**
|
|
128
|
-
* Muestra la página de dashboard (después del login)
|
|
129
|
-
* GET /dashboard
|
|
130
|
-
*/
|
|
131
|
-
async showDashboard(req, res) {
|
|
132
|
-
try {
|
|
133
|
-
// Mostrar información de depuración sobre la sesión
|
|
134
|
-
console.log('[DEBUG] showDashboard - req.session:', req.session);
|
|
135
|
-
console.log('[DEBUG] showDashboard - req.session.data:', req.session?.data);
|
|
136
|
-
console.log('[DEBUG] showDashboard - req.session.data.authenticated:', req.session?.data?.authenticated);
|
|
137
|
-
|
|
138
|
-
// Verificar si el usuario está autenticado a través de la sesión
|
|
139
|
-
if (!req.session || !req.session.data || !req.session.data.authenticated) {
|
|
140
|
-
// Redirigir al login si no está autenticado
|
|
141
|
-
console.log('[DEBUG] showDashboard - No autenticado, redirigiendo a /login');
|
|
142
|
-
res.writeHead(302, { 'Location': '/login' });
|
|
143
|
-
res.end();
|
|
144
|
-
return;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
// Obtener información del usuario desde la sesión
|
|
148
|
-
const sessionData = req.session.data;
|
|
149
|
-
const userId = sessionData.userId;
|
|
150
|
-
|
|
151
|
-
// Obtener información del usuario
|
|
152
|
-
const AuthModel = require('../../models/auth/AuthModel');
|
|
153
|
-
const authModel = new AuthModel();
|
|
154
|
-
const user = await authModel.getUserById(userId);
|
|
155
|
-
|
|
156
|
-
// Preparar datos para la vista
|
|
157
|
-
this.set('title', 'Panel de Control');
|
|
158
|
-
this.set('user', user);
|
|
159
|
-
|
|
160
|
-
// Renderizar la vista
|
|
161
|
-
const html = this.view('auth/dashboard', {
|
|
162
|
-
title: 'Panel de Control',
|
|
163
|
-
user: user
|
|
164
|
-
});
|
|
165
|
-
|
|
166
|
-
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
167
|
-
res.end(html);
|
|
168
|
-
} catch (error) {
|
|
169
|
-
console.error('Error en showDashboard:', error);
|
|
170
|
-
res.writeHead(500, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
171
|
-
res.end(`
|
|
172
|
-
<!DOCTYPE html>
|
|
173
|
-
<html>
|
|
174
|
-
<head>
|
|
175
|
-
<title>Error</title>
|
|
176
|
-
<meta charset="utf-8">
|
|
177
|
-
</head>
|
|
178
|
-
<body>
|
|
179
|
-
<h1>Error al cargar el panel de control</h1>
|
|
180
|
-
<p>${error.message}</p>
|
|
181
|
-
<a href="/login">Ir al inicio de sesión</a>
|
|
182
|
-
</body>
|
|
183
|
-
</html>
|
|
184
|
-
`);
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
/**
|
|
189
|
-
* Método para validar token
|
|
190
|
-
*/
|
|
191
|
-
async validateToken(token) {
|
|
192
|
-
try {
|
|
193
|
-
const { validateToken } = require('../../utils/tokenHelper');
|
|
194
|
-
const isValid = await validateToken(token);
|
|
195
|
-
return isValid;
|
|
196
|
-
} catch (error) {
|
|
197
|
-
console.error('Error validando token:', error);
|
|
198
|
-
return false;
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
// Exportar métodos individualmente para que RouteLoader pueda acceder a ellos
|
|
204
|
-
const controllerInstance = new AuthViewController();
|
|
205
|
-
|
|
206
|
-
module.exports = {
|
|
207
|
-
showLogin: (req, res) => {
|
|
208
|
-
controllerInstance.setRequestResponse(req, res);
|
|
209
|
-
controllerInstance.showLogin(req, res);
|
|
210
|
-
},
|
|
211
|
-
showRegister: (req, res) => {
|
|
212
|
-
controllerInstance.setRequestResponse(req, res);
|
|
213
|
-
controllerInstance.showRegister(req, res);
|
|
214
|
-
},
|
|
215
|
-
showForgotPassword: (req, res) => {
|
|
216
|
-
controllerInstance.setRequestResponse(req, res);
|
|
217
|
-
controllerInstance.showForgotPassword(req, res);
|
|
218
|
-
},
|
|
219
|
-
showDashboard: (req, res) => {
|
|
220
|
-
controllerInstance.setRequestResponse(req, res);
|
|
221
|
-
controllerInstance.showDashboard(req, res);
|
|
222
|
-
}
|
|
223
|
-
};
|