expressed-example-app 1.0.0 → 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/README.md +136 -0
- package/app.js +144 -92
- package/changelog-core-enrutador.md +177 -0
- package/controllers/mainController.js +96 -0
- package/controllers/productController.js +50 -0
- package/controllers/userController.js +48 -0
- package/documentacion-bug-enrutamiento.md +114 -0
- package/hooks-config.js +42 -0
- package/hooks-personalizados.js +54 -0
- package/package.json +29 -43
- package/queue-system.js +128 -0
- package/routes/main-routes.json +37 -0
- package/routes/queue-routes.json +44 -0
- package/test-hooks.js +31 -0
- package/test-routes.json +9 -0
- package/config/routes.json +0 -70
- package/controllers/EndpointController.js +0 -43
- package/controllers/HomeController.js +0 -19
- package/controllers/ProductController.js +0 -47
- package/controllers/QueueController.js +0 -26
- package/controllers/UserController.js +0 -73
- package/hooks/AppHooks.js +0 -60
- package/middleware/bodyCapture.js +0 -20
package/config/routes.json
DELETED
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"routes": [
|
|
3
|
-
{
|
|
4
|
-
"method": "GET",
|
|
5
|
-
"path": "/",
|
|
6
|
-
"controller": "HomeController.index",
|
|
7
|
-
"action": "index"
|
|
8
|
-
},
|
|
9
|
-
{
|
|
10
|
-
"method": "GET",
|
|
11
|
-
"path": "/users",
|
|
12
|
-
"controller": "UserController.list",
|
|
13
|
-
"action": "list"
|
|
14
|
-
},
|
|
15
|
-
{
|
|
16
|
-
"method": "GET",
|
|
17
|
-
"path": "/users/:id",
|
|
18
|
-
"controller": "UserController.show",
|
|
19
|
-
"action": "show"
|
|
20
|
-
},
|
|
21
|
-
{
|
|
22
|
-
"method": "POST",
|
|
23
|
-
"path": "/users",
|
|
24
|
-
"controller": "UserController.create",
|
|
25
|
-
"action": "create"
|
|
26
|
-
},
|
|
27
|
-
{
|
|
28
|
-
"method": "PUT",
|
|
29
|
-
"path": "/users/:id",
|
|
30
|
-
"controller": "UserController.update",
|
|
31
|
-
"action": "update"
|
|
32
|
-
},
|
|
33
|
-
{
|
|
34
|
-
"method": "DELETE",
|
|
35
|
-
"path": "/users/:id",
|
|
36
|
-
"controller": "UserController.destroy",
|
|
37
|
-
"action": "destroy"
|
|
38
|
-
},
|
|
39
|
-
{
|
|
40
|
-
"method": "GET",
|
|
41
|
-
"path": "/products",
|
|
42
|
-
"controller": "ProductController.list",
|
|
43
|
-
"action": "list"
|
|
44
|
-
},
|
|
45
|
-
{
|
|
46
|
-
"method": "GET",
|
|
47
|
-
"path": "/products/:id",
|
|
48
|
-
"controller": "ProductController.show",
|
|
49
|
-
"action": "show"
|
|
50
|
-
},
|
|
51
|
-
{
|
|
52
|
-
"method": "POST",
|
|
53
|
-
"path": "/products",
|
|
54
|
-
"controller": "ProductController.create",
|
|
55
|
-
"action": "create"
|
|
56
|
-
},
|
|
57
|
-
{
|
|
58
|
-
"method": "GET",
|
|
59
|
-
"path": "/queue/status",
|
|
60
|
-
"controller": "QueueController.status",
|
|
61
|
-
"action": "status"
|
|
62
|
-
},
|
|
63
|
-
{
|
|
64
|
-
"method": "GET",
|
|
65
|
-
"path": "/endpoints",
|
|
66
|
-
"controller": "EndpointController.listEndpoints",
|
|
67
|
-
"action": "listEndpoints"
|
|
68
|
-
}
|
|
69
|
-
]
|
|
70
|
-
}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Controlador de endpoints
|
|
3
|
-
*/
|
|
4
|
-
class EndpointController {
|
|
5
|
-
/**
|
|
6
|
-
* Lista todos los endpoints disponibles
|
|
7
|
-
* @param {Object} req - Objeto de solicitud
|
|
8
|
-
* @param {Object} res - Objeto de respuesta
|
|
9
|
-
*/
|
|
10
|
-
static listEndpoints(req, res) {
|
|
11
|
-
// El sistema de hooks será utilizado para obtener la lista de endpoints
|
|
12
|
-
if (req.app.locals.hooks) {
|
|
13
|
-
// Simular la recopilación de endpoints desde el sistema de rutas
|
|
14
|
-
const routes = [
|
|
15
|
-
{ method: 'GET', path: '/', description: 'Inicio de la aplicación' },
|
|
16
|
-
{ method: 'GET', path: '/users', description: 'Lista todos los usuarios' },
|
|
17
|
-
{ method: 'GET', path: '/users/:id', description: 'Muestra un usuario específico' },
|
|
18
|
-
{ method: 'POST', path: '/users', description: 'Crea un nuevo usuario' },
|
|
19
|
-
{ method: 'PUT', path: '/users/:id', description: 'Actualiza un usuario' },
|
|
20
|
-
{ method: 'DELETE', path: '/users/:id', description: 'Elimina un usuario' },
|
|
21
|
-
{ method: 'GET', path: '/products', description: 'Lista todos los productos' },
|
|
22
|
-
{ method: 'GET', path: '/products/:id', description: 'Muestra un producto específico' },
|
|
23
|
-
{ method: 'POST', path: '/products', description: 'Crea un nuevo producto' },
|
|
24
|
-
{ method: 'GET', path: '/queue/status', description: 'Estado del sistema de colas' },
|
|
25
|
-
{ method: 'GET', path: '/endpoints', description: 'Lista todos los endpoints disponibles' }
|
|
26
|
-
];
|
|
27
|
-
|
|
28
|
-
// Permitir que los hooks modifiquen la lista de endpoints
|
|
29
|
-
const processedEndpoints = req.app.locals.hooks.applyFilters('endpoints_list', routes);
|
|
30
|
-
|
|
31
|
-
res.json({
|
|
32
|
-
message: 'Lista de endpoints disponibles',
|
|
33
|
-
endpoints: processedEndpoints
|
|
34
|
-
});
|
|
35
|
-
} else {
|
|
36
|
-
res.status(500).json({
|
|
37
|
-
error: 'Sistema de hooks no disponible'
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
module.exports = EndpointController;
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Controlador de inicio
|
|
3
|
-
*/
|
|
4
|
-
class HomeController {
|
|
5
|
-
/**
|
|
6
|
-
* Acción de inicio
|
|
7
|
-
* @param {Object} req - Objeto de solicitud
|
|
8
|
-
* @param {Object} res - Objeto de respuesta
|
|
9
|
-
*/
|
|
10
|
-
static index(req, res) {
|
|
11
|
-
res.json({
|
|
12
|
-
message: 'Bienvenido a la aplicación de ejemplo',
|
|
13
|
-
version: '1.0.0',
|
|
14
|
-
timestamp: new Date().toISOString()
|
|
15
|
-
});
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
module.exports = HomeController;
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Controlador de productos
|
|
3
|
-
*/
|
|
4
|
-
class ProductController {
|
|
5
|
-
/**
|
|
6
|
-
* Lista todos los productos
|
|
7
|
-
* @param {Object} req - Objeto de solicitud
|
|
8
|
-
* @param {Object} res - Objeto de respuesta
|
|
9
|
-
*/
|
|
10
|
-
static list(req, res) {
|
|
11
|
-
res.json({
|
|
12
|
-
message: 'Lista de productos',
|
|
13
|
-
products: [
|
|
14
|
-
{ id: 1, name: 'Laptop', price: 999.99 },
|
|
15
|
-
{ id: 2, name: 'Mouse', price: 29.99 }
|
|
16
|
-
]
|
|
17
|
-
});
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Muestra un producto específico
|
|
22
|
-
* @param {Object} req - Objeto de solicitud
|
|
23
|
-
* @param {Object} res - Objeto de respuesta
|
|
24
|
-
*/
|
|
25
|
-
static show(req, res) {
|
|
26
|
-
const productId = req.params.id;
|
|
27
|
-
res.json({
|
|
28
|
-
message: `Información del producto ${productId}`,
|
|
29
|
-
product: { id: productId, name: `Product ${productId}`, price: 19.99 }
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Crea un nuevo producto
|
|
35
|
-
* @param {Object} req - Objeto de solicitud
|
|
36
|
-
* @param {Object} res - Objeto de respuesta
|
|
37
|
-
*/
|
|
38
|
-
static create(req, res) {
|
|
39
|
-
const productData = req.body;
|
|
40
|
-
res.status(201).json({
|
|
41
|
-
message: 'Producto creado exitosamente',
|
|
42
|
-
product: { id: Date.now(), ...productData }
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
module.exports = ProductController;
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Controlador del sistema de colas
|
|
3
|
-
*/
|
|
4
|
-
class QueueController {
|
|
5
|
-
/**
|
|
6
|
-
* Obtiene el estado del sistema de colas
|
|
7
|
-
* @param {Object} req - Objeto de solicitud
|
|
8
|
-
* @param {Object} res - Objeto de respuesta
|
|
9
|
-
*/
|
|
10
|
-
static status(req, res) {
|
|
11
|
-
// El sistema de colas será inyectado por el middleware
|
|
12
|
-
if (req.queueSystem) {
|
|
13
|
-
const status = req.queueSystem.getStatus();
|
|
14
|
-
res.json({
|
|
15
|
-
message: 'Estado del sistema de colas',
|
|
16
|
-
status: status
|
|
17
|
-
});
|
|
18
|
-
} else {
|
|
19
|
-
res.status(500).json({
|
|
20
|
-
error: 'Sistema de colas no disponible'
|
|
21
|
-
});
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
module.exports = QueueController;
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Controlador de usuarios
|
|
3
|
-
*/
|
|
4
|
-
class UserController {
|
|
5
|
-
/**
|
|
6
|
-
* Lista todos los usuarios
|
|
7
|
-
* @param {Object} req - Objeto de solicitud
|
|
8
|
-
* @param {Object} res - Objeto de respuesta
|
|
9
|
-
*/
|
|
10
|
-
static list(req, res) {
|
|
11
|
-
res.json({
|
|
12
|
-
message: 'Lista de usuarios',
|
|
13
|
-
users: [
|
|
14
|
-
{ id: 1, name: 'John Doe', email: 'john@example.com' },
|
|
15
|
-
{ id: 2, name: 'Jane Smith', email: 'jane@example.com' }
|
|
16
|
-
]
|
|
17
|
-
});
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Muestra un usuario específico
|
|
22
|
-
* @param {Object} req - Objeto de solicitud
|
|
23
|
-
* @param {Object} res - Objeto de respuesta
|
|
24
|
-
*/
|
|
25
|
-
static show(req, res) {
|
|
26
|
-
const userId = req.params.id;
|
|
27
|
-
res.json({
|
|
28
|
-
message: `Información del usuario ${userId}`,
|
|
29
|
-
user: { id: userId, name: `User ${userId}`, email: `user${userId}@example.com` }
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Crea un nuevo usuario
|
|
35
|
-
* @param {Object} req - Objeto de solicitud
|
|
36
|
-
* @param {Object} res - Objeto de respuesta
|
|
37
|
-
*/
|
|
38
|
-
static create(req, res) {
|
|
39
|
-
const userData = req.body;
|
|
40
|
-
res.status(201).json({
|
|
41
|
-
message: 'Usuario creado exitosamente',
|
|
42
|
-
user: { id: Date.now(), ...userData }
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Actualiza un usuario
|
|
48
|
-
* @param {Object} req - Objeto de solicitud
|
|
49
|
-
* @param {Object} res - Objeto de respuesta
|
|
50
|
-
*/
|
|
51
|
-
static update(req, res) {
|
|
52
|
-
const userId = req.params.id;
|
|
53
|
-
const userData = req.body;
|
|
54
|
-
res.json({
|
|
55
|
-
message: `Usuario ${userId} actualizado`,
|
|
56
|
-
user: { id: userId, ...userData }
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Elimina un usuario
|
|
62
|
-
* @param {Object} req - Objeto de solicitud
|
|
63
|
-
* @param {Object} res - Objeto de respuesta
|
|
64
|
-
*/
|
|
65
|
-
static destroy(req, res) {
|
|
66
|
-
const userId = req.params.id;
|
|
67
|
-
res.json({
|
|
68
|
-
message: `Usuario ${userId} eliminado`
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
module.exports = UserController;
|
package/hooks/AppHooks.js
DELETED
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Archivo de hooks para la aplicación
|
|
3
|
-
* Define todos los hooks utilizados en la aplicación
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
class AppHooks {
|
|
7
|
-
/**
|
|
8
|
-
* Registra todos los hooks de la aplicación
|
|
9
|
-
* @param {ExpressHooked} hooked - Instancia del sistema de hooks
|
|
10
|
-
*/
|
|
11
|
-
static registerHooks(hooked) {
|
|
12
|
-
// Hook para registrar información cuando comienza una solicitud
|
|
13
|
-
hooked.addAction('request_started', (req, res, next) => {
|
|
14
|
-
console.log(`[${new Date().toISOString()}] Nueva solicitud: ${req.method} ${req.url}`);
|
|
15
|
-
next();
|
|
16
|
-
});
|
|
17
|
-
|
|
18
|
-
// Hook para registrar información cuando se procesa una solicitud
|
|
19
|
-
hooked.addAction('request_processed', (req, res) => {
|
|
20
|
-
console.log(`[${new Date().toISOString()}] Solicitud procesada: ${req.method} ${req.url}`);
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
// Hook para registrar información detallada de cada solicitud
|
|
24
|
-
hooked.addAction('request_details_log', (req, res, routeInfo) => {
|
|
25
|
-
console.log(`\n--- Información de la Solicitud (mediante hook) ---`);
|
|
26
|
-
console.log(`Fecha/Hora: ${new Date().toISOString()}`);
|
|
27
|
-
console.log(`Método HTTP: ${req.method}`);
|
|
28
|
-
console.log(`Ruta: ${req.url}`);
|
|
29
|
-
if (routeInfo) {
|
|
30
|
-
console.log(`Ruta definida: ${routeInfo.method} ${routeInfo.path}`);
|
|
31
|
-
console.log(`Controlador: ${routeInfo.controller}`);
|
|
32
|
-
console.log(`Acción: ${routeInfo.action}`);
|
|
33
|
-
}
|
|
34
|
-
console.log(`IP Cliente: ${req.ip}`);
|
|
35
|
-
console.log(`Headers:`, req.headers);
|
|
36
|
-
if (Object.keys(req.params).length > 0) {
|
|
37
|
-
console.log(`Parámetros:`, req.params);
|
|
38
|
-
}
|
|
39
|
-
if (Object.keys(req.query).length > 0) {
|
|
40
|
-
console.log(`Query params:`, req.query);
|
|
41
|
-
}
|
|
42
|
-
if (req.body && Object.keys(req.body).length > 0) {
|
|
43
|
-
console.log(`Body:`, req.body);
|
|
44
|
-
}
|
|
45
|
-
console.log(`-----------------------------\n`);
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
// Hook para filtrar y modificar la lista de endpoints
|
|
49
|
-
hooked.addFilter('endpoints_list', (endpoints) => {
|
|
50
|
-
// Agregar información adicional a la lista de endpoints
|
|
51
|
-
return endpoints.map(endpoint => ({
|
|
52
|
-
...endpoint,
|
|
53
|
-
addedBy: 'hook-system',
|
|
54
|
-
timestamp: new Date().toISOString()
|
|
55
|
-
}));
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
module.exports = AppHooks;
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Middleware para capturar el body de las solicitudes
|
|
3
|
-
* Permite que el body esté disponible para los hooks
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
const express = require('express');
|
|
7
|
-
|
|
8
|
-
// Middleware para capturar el body
|
|
9
|
-
const captureBodyMiddleware = express.json({
|
|
10
|
-
verify: (req, res, buf, encoding) => {
|
|
11
|
-
req.rawBody = buf;
|
|
12
|
-
try {
|
|
13
|
-
req.capturedBody = JSON.parse(buf.toString(encoding));
|
|
14
|
-
} catch (e) {
|
|
15
|
-
req.capturedBody = buf.toString(encoding);
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
module.exports = { captureBodyMiddleware };
|