jerkjs 2.0.1 → 2.0.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/README.md +4 -6
- package/docs/EXTENSION_MANUAL.md +955 -0
- package/docs/FIREWALL_MANUAL.md +416 -0
- package/docs/HOOKS_REFERENCE_IMPROVED.md +596 -0
- package/docs/MANUAL_API_SDK.md +536 -0
- package/docs/MARIADB_TOKENS_IMPLEMENTATION.md +110 -0
- package/docs/MIDDLEWARE_MANUAL.md +518 -0
- package/docs/OAUTH2_GOOGLE_MANUAL.md +405 -0
- package/docs/frontend-and-sessions.md +6 -6
- package/examples/advanced/controllers/productController.js +64 -0
- package/examples/advanced/controllers/userController.js +85 -0
- package/examples/advanced/routes.json +51 -0
- package/examples/advanced_example.js +93 -0
- package/examples/basic/controllers/userController.js +85 -0
- package/examples/basic_example.js +72 -0
- package/examples/mvc_example/app.js +138 -0
- package/examples/mvc_example/views/home/index.html +26 -0
- package/examples/mvc_example/views/home/simple.html +3 -0
- package/examples/mvc_example/views/layout.html +23 -0
- package/examples/mvc_example/views/test.html +3 -0
- package/examples/mvc_example/views/user/invalid.html +6 -0
- package/examples/mvc_example/views/user/list.html +36 -0
- package/examples/mvc_example/views/user/notfound.html +6 -0
- package/examples/mvc_example/views/user/profile.html +11 -0
- package/examples/mvc_routes_example/app.js +34 -0
- package/examples/mvc_routes_example/controllers/mainController.js +27 -0
- package/examples/mvc_routes_example/controllers/productController.js +47 -0
- package/examples/mvc_routes_example/controllers/userController.js +76 -0
- package/examples/mvc_routes_example/routes.json +30 -0
- package/examples/mvc_routes_example/views/layout.html +31 -0
- package/examples/mvc_routes_example/views/main/index.html +11 -0
- package/examples/mvc_routes_example/views/product/catalog.html +24 -0
- package/examples/mvc_routes_example/views/user/invalid.html +6 -0
- package/examples/mvc_routes_example/views/user/list.html +40 -0
- package/examples/mvc_routes_example/views/user/notfound.html +6 -0
- package/examples/mvc_routes_example/views/user/profile.html +18 -0
- package/examples/mvc_welcome/README.md +34 -0
- package/examples/mvc_welcome/app.js +50 -0
- package/examples/mvc_welcome/controllers/welcomeController.js +41 -0
- package/examples/mvc_welcome/package.json +26 -0
- package/examples/mvc_welcome/views/home/welcome.html +82 -0
- package/examples/v2/README.md +72 -0
- package/examples/v2/app.js +74 -0
- package/examples/v2/app_fixed.js +74 -0
- package/examples/v2/controllers/authController.js +64 -0
- package/examples/v2/controllers/mainController.js +24 -0
- package/examples/v2/controllers/protectedController.js +12 -0
- package/examples/v2/controllers/userController.js +16 -0
- package/examples/v2/package.json +27 -0
- package/examples/v2/routes.json +30 -0
- package/examples/v2/test_api.sh +47 -0
- package/examples/v2/tokens_example.sqlite +0 -0
- package/examples/v2.1_firewall_demo/README.md +113 -0
- package/examples/v2.1_firewall_demo/app.js +182 -0
- package/examples/v2.1_firewall_demo/package.json +27 -0
- package/examples/v2.1_hooks_demo/README.md +85 -0
- package/examples/v2.1_hooks_demo/app.js +101 -0
- package/examples/v2.1_hooks_demo/controllers/hooksController.js +29 -0
- package/examples/v2.1_hooks_demo/controllers/mainController.js +18 -0
- package/examples/v2.1_hooks_demo/package.json +27 -0
- package/examples/v2.1_hooks_demo/routes.json +16 -0
- package/examples/v2.1_openapi_demo/README.md +82 -0
- package/examples/v2.1_openapi_demo/app.js +296 -0
- package/examples/v2.1_openapi_demo/package.json +26 -0
- package/examples/v2_cors/README.md +82 -0
- package/examples/v2_cors/app.js +108 -0
- package/examples/v2_cors/package.json +23 -0
- package/examples/v2_json_auth/README.md +83 -0
- package/examples/v2_json_auth/app.js +72 -0
- package/examples/v2_json_auth/controllers/authController.js +67 -0
- package/examples/v2_json_auth/controllers/mainController.js +16 -0
- package/examples/v2_json_auth/controllers/protectedController.js +12 -0
- package/examples/v2_json_auth/controllers/tokenController.js +28 -0
- package/examples/v2_json_auth/controllers/userController.js +15 -0
- package/examples/v2_json_auth/package.json +26 -0
- package/examples/v2_json_auth/routes.json +37 -0
- package/examples/v2_json_auth/tokens.json +20 -0
- package/examples/v2_mariadb_auth/README.md +94 -0
- package/examples/v2_mariadb_auth/app.js +81 -0
- package/examples/v2_mariadb_auth/controllers/authController.js +95 -0
- package/examples/v2_mariadb_auth/controllers/mainController.js +31 -0
- package/examples/v2_mariadb_auth/controllers/protectedController.js +12 -0
- package/examples/v2_mariadb_auth/controllers/userController.js +17 -0
- package/examples/v2_mariadb_auth/package.json +27 -0
- package/examples/v2_mariadb_auth/routes.json +37 -0
- package/examples/v2_no_auth/README.md +75 -0
- package/examples/v2_no_auth/app.js +72 -0
- package/examples/v2_no_auth/controllers/healthController.js +14 -0
- package/examples/v2_no_auth/controllers/mainController.js +19 -0
- package/examples/v2_no_auth/controllers/productController.js +31 -0
- package/examples/v2_no_auth/controllers/publicController.js +16 -0
- package/examples/v2_no_auth/package.json +22 -0
- package/examples/v2_no_auth/routes.json +37 -0
- package/examples/v2_oauth/README.md +70 -0
- package/examples/v2_oauth/app.js +90 -0
- package/examples/v2_oauth/controllers/mainController.js +45 -0
- package/examples/v2_oauth/controllers/oauthController.js +247 -0
- package/examples/v2_oauth/controllers/protectedController.js +13 -0
- package/examples/v2_oauth/controllers/userController.js +17 -0
- package/examples/v2_oauth/package.json +26 -0
- package/examples/v2_oauth/routes.json +44 -0
- package/examples/v2_openapi/README.md +77 -0
- package/examples/v2_openapi/app.js +222 -0
- package/examples/v2_openapi/controllers/authController.js +52 -0
- package/examples/v2_openapi/controllers/mainController.js +26 -0
- package/examples/v2_openapi/controllers/productController.js +17 -0
- package/examples/v2_openapi/controllers/userController.js +27 -0
- package/examples/v2_openapi/package.json +26 -0
- package/examples/v2_openapi/routes.json +37 -0
- package/index.js +11 -3
- package/lib/core/handler.js +1 -1
- package/lib/core/hooks.js +1 -1
- package/lib/core/router.js +1 -1
- package/lib/core/server.js +1 -1
- package/lib/loader/controllerLoader.js +1 -1
- package/lib/loader/routeLoader.js +1 -1
- package/lib/middleware/auditLogger.js +1 -1
- package/lib/middleware/authenticator.js +1 -1
- package/lib/middleware/compressor.js +1 -1
- package/lib/middleware/cors.js +1 -1
- package/lib/middleware/firewall.js +1 -1
- package/lib/middleware/rateLimiter.js +1 -1
- package/lib/middleware/session.js +1 -1
- package/lib/middleware/validator.js +1 -1
- package/lib/mvc/controllerBase.js +207 -0
- package/lib/mvc/viewEngine.js +752 -0
- package/lib/utils/configParser.js +1 -1
- package/lib/utils/logger.js +1 -1
- package/lib/utils/openapiGenerator.js +1 -1
- package/lib/utils/tokenManager.js +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
const {
|
|
2
|
+
APIServer,
|
|
3
|
+
Authenticator,
|
|
4
|
+
RouteLoader,
|
|
5
|
+
Logger,
|
|
6
|
+
OpenApiGenerator,
|
|
7
|
+
TokenManager
|
|
8
|
+
} = require('../../index.js');
|
|
9
|
+
|
|
10
|
+
async function startServer() {
|
|
11
|
+
// Crear instancia del servidor
|
|
12
|
+
const server = new APIServer({
|
|
13
|
+
port: 8092,
|
|
14
|
+
host: 'localhost'
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
// Crear instancia del logger
|
|
18
|
+
const logger = new Logger({ level: 'info' });
|
|
19
|
+
|
|
20
|
+
try {
|
|
21
|
+
// Crear instancia del TokenManager con almacenamiento en memoria
|
|
22
|
+
const tokenManager = new TokenManager({
|
|
23
|
+
storage: 'memory'
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
// Crear instancia del autenticador
|
|
27
|
+
const authenticator = new Authenticator({ logger });
|
|
28
|
+
|
|
29
|
+
// Registrar estrategia de autenticación JWT
|
|
30
|
+
authenticator.use('jwt-openapi', async (req, options = {}) => {
|
|
31
|
+
const authHeader = req.headers.authorization;
|
|
32
|
+
const token = authHeader && authHeader.split(' ')[1]; // Bearer TOKEN
|
|
33
|
+
|
|
34
|
+
if (!token) {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Validar el token usando un secreto fijo para este ejemplo
|
|
39
|
+
const secret = 'super-secret-key-for-openapi-example';
|
|
40
|
+
const decoded = tokenManager.validateToken(token, secret);
|
|
41
|
+
|
|
42
|
+
if (decoded) {
|
|
43
|
+
req.user = decoded;
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return false;
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
// Agregar el autenticador al servidor para que pueda ser usado por el RouteLoader
|
|
51
|
+
server.authenticator = authenticator;
|
|
52
|
+
|
|
53
|
+
// Cargar rutas desde archivo JSON
|
|
54
|
+
const routeLoader = new RouteLoader();
|
|
55
|
+
await routeLoader.loadRoutes(server, './routes.json');
|
|
56
|
+
|
|
57
|
+
// Crear instancia del generador de OpenAPI
|
|
58
|
+
const openApiGenerator = new OpenApiGenerator({
|
|
59
|
+
title: 'API de Ejemplo con OpenAPI',
|
|
60
|
+
description: 'Una API de ejemplo que demuestra la funcionalidad OpenAPI del Framework JERK',
|
|
61
|
+
version: '1.0.0',
|
|
62
|
+
servers: [
|
|
63
|
+
{ url: 'http://localhost:8092', description: 'Servidor de desarrollo' }
|
|
64
|
+
]
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
// Agregar esquemas a la documentación
|
|
68
|
+
openApiGenerator.addSchema('User', {
|
|
69
|
+
type: 'object',
|
|
70
|
+
properties: {
|
|
71
|
+
id: { type: 'integer', example: 1 },
|
|
72
|
+
name: { type: 'string', example: 'John Doe' },
|
|
73
|
+
email: { type: 'string', example: 'john@example.com' },
|
|
74
|
+
role: { type: 'string', example: 'user' }
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
openApiGenerator.addSchema('Product', {
|
|
79
|
+
type: 'object',
|
|
80
|
+
properties: {
|
|
81
|
+
id: { type: 'integer', example: 1 },
|
|
82
|
+
name: { type: 'string', example: 'Laptop' },
|
|
83
|
+
price: { type: 'number', example: 999.99 },
|
|
84
|
+
category: { type: 'string', example: 'Electronics' }
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
openApiGenerator.addSchema('ApiResponse', {
|
|
89
|
+
type: 'object',
|
|
90
|
+
properties: {
|
|
91
|
+
success: { type: 'boolean', example: true },
|
|
92
|
+
message: { type: 'string', example: 'Operación exitosa' },
|
|
93
|
+
data: { type: 'object', description: 'Datos de la respuesta' }
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
// Agregar esquema de seguridad
|
|
98
|
+
openApiGenerator.addSecurityScheme('bearerAuth', {
|
|
99
|
+
type: 'http',
|
|
100
|
+
scheme: 'bearer',
|
|
101
|
+
bearerFormat: 'JWT',
|
|
102
|
+
description: 'Autenticación por token JWT'
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
// Agregar rutas a la documentación OpenAPI
|
|
106
|
+
openApiGenerator.addRoute({
|
|
107
|
+
path: '/users',
|
|
108
|
+
method: 'GET',
|
|
109
|
+
config: {
|
|
110
|
+
summary: 'Obtener todos los usuarios',
|
|
111
|
+
description: 'Devuelve una lista de todos los usuarios registrados',
|
|
112
|
+
security: [{ bearerAuth: [] }],
|
|
113
|
+
responses: {
|
|
114
|
+
'200': {
|
|
115
|
+
description: 'Lista de usuarios',
|
|
116
|
+
content: {
|
|
117
|
+
'application/json': {
|
|
118
|
+
schema: {
|
|
119
|
+
type: 'array',
|
|
120
|
+
items: {
|
|
121
|
+
$ref: '#/components/schemas/User'
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
},
|
|
127
|
+
'401': {
|
|
128
|
+
description: 'No autorizado - Token inválido o ausente'
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
openApiGenerator.addRoute({
|
|
135
|
+
path: '/products',
|
|
136
|
+
method: 'GET',
|
|
137
|
+
config: {
|
|
138
|
+
summary: 'Obtener todos los productos',
|
|
139
|
+
description: 'Devuelve una lista de todos los productos disponibles',
|
|
140
|
+
security: [{ bearerAuth: [] }],
|
|
141
|
+
responses: {
|
|
142
|
+
'200': {
|
|
143
|
+
description: 'Lista de productos',
|
|
144
|
+
content: {
|
|
145
|
+
'application/json': {
|
|
146
|
+
schema: {
|
|
147
|
+
type: 'array',
|
|
148
|
+
items: {
|
|
149
|
+
$ref: '#/components/schemas/Product'
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
},
|
|
155
|
+
'401': {
|
|
156
|
+
description: 'No autorizado - Token inválido o ausente'
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
openApiGenerator.addRoute({
|
|
163
|
+
path: '/login',
|
|
164
|
+
method: 'POST',
|
|
165
|
+
config: {
|
|
166
|
+
summary: 'Iniciar sesión',
|
|
167
|
+
description: 'Autenticación de usuario y obtención de token JWT',
|
|
168
|
+
requestBody: {
|
|
169
|
+
content: {
|
|
170
|
+
'application/json': {
|
|
171
|
+
schema: {
|
|
172
|
+
type: 'object',
|
|
173
|
+
properties: {
|
|
174
|
+
username: { type: 'string', example: 'admin' },
|
|
175
|
+
password: { type: 'string', example: 'password' }
|
|
176
|
+
},
|
|
177
|
+
required: ['username', 'password']
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
},
|
|
182
|
+
responses: {
|
|
183
|
+
'200': {
|
|
184
|
+
description: 'Inicio de sesión exitoso',
|
|
185
|
+
content: {
|
|
186
|
+
'application/json': {
|
|
187
|
+
schema: {
|
|
188
|
+
type: 'object',
|
|
189
|
+
properties: {
|
|
190
|
+
message: { type: 'string', example: 'Inicio de sesión exitoso' },
|
|
191
|
+
token: { type: 'string', example: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...' },
|
|
192
|
+
user: { $ref: '#/components/schemas/User' }
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
},
|
|
198
|
+
'401': {
|
|
199
|
+
description: 'Credenciales inválidas'
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
// Agregar ruta de documentación al servidor
|
|
206
|
+
openApiGenerator.addDocumentationRoute(server);
|
|
207
|
+
|
|
208
|
+
// Iniciar el servidor
|
|
209
|
+
server.start();
|
|
210
|
+
|
|
211
|
+
logger.info('Servidor iniciado en http://localhost:8092');
|
|
212
|
+
logger.info('Documentación OpenAPI disponible en http://localhost:8092/docs');
|
|
213
|
+
} catch (error) {
|
|
214
|
+
logger.error('Error iniciando el servidor:', error.message);
|
|
215
|
+
process.exit(1);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// Iniciar el servidor
|
|
220
|
+
startServer();
|
|
221
|
+
|
|
222
|
+
module.exports = { startServer };
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
const jwt = require('jsonwebtoken');
|
|
2
|
+
const { TokenManager } = require('../../../index.js');
|
|
3
|
+
|
|
4
|
+
// TokenManager para este controlador
|
|
5
|
+
const tokenManager = new TokenManager({
|
|
6
|
+
storage: 'memory'
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
const authController = {
|
|
10
|
+
login: async (req, res) => {
|
|
11
|
+
try {
|
|
12
|
+
const { username, password } = req.body;
|
|
13
|
+
|
|
14
|
+
// Validación simple de credenciales (esto debería ser más robusto en producción)
|
|
15
|
+
if (!username || !password) {
|
|
16
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
17
|
+
res.end(JSON.stringify({ error: 'Nombre de usuario y contraseña requeridos' }));
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// Simulación de autenticación (en una aplicación real, esto verificaría contra una base de datos)
|
|
22
|
+
if (username === 'admin' && password === 'password') {
|
|
23
|
+
// Generar un token JWT
|
|
24
|
+
const payload = {
|
|
25
|
+
userId: 1,
|
|
26
|
+
username: username,
|
|
27
|
+
role: 'admin'
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
// Secret para firmar el token (en producción, debería estar en variables de entorno)
|
|
31
|
+
const secret = 'super-secret-key-for-openapi-example';
|
|
32
|
+
const token = jwt.sign(payload, secret, { expiresIn: '1h' });
|
|
33
|
+
|
|
34
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
35
|
+
res.end(JSON.stringify({
|
|
36
|
+
message: 'Inicio de sesión exitoso',
|
|
37
|
+
token: token,
|
|
38
|
+
user: payload
|
|
39
|
+
}));
|
|
40
|
+
} else {
|
|
41
|
+
res.writeHead(401, { 'Content-Type': 'application/json' });
|
|
42
|
+
res.end(JSON.stringify({ error: 'Credenciales inválidas' }));
|
|
43
|
+
}
|
|
44
|
+
} catch (error) {
|
|
45
|
+
console.error('Error en login:', error);
|
|
46
|
+
res.writeHead(500, { 'Content-Type': 'application/json' });
|
|
47
|
+
res.end(JSON.stringify({ error: 'Error interno del servidor' }));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
module.exports = authController;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
const jwt = require('jsonwebtoken');
|
|
2
|
+
const { TokenManager } = require('../../../index.js');
|
|
3
|
+
|
|
4
|
+
// TokenManager para este controlador
|
|
5
|
+
const tokenManager = new TokenManager({
|
|
6
|
+
storage: 'memory'
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
const mainController = {
|
|
10
|
+
home: (req, res) => {
|
|
11
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
12
|
+
res.end(JSON.stringify({
|
|
13
|
+
message: 'Bienvenido a la API de ejemplo con funcionalidad OpenAPI',
|
|
14
|
+
endpoints: {
|
|
15
|
+
'POST /login': 'Iniciar sesión y obtener token',
|
|
16
|
+
'GET /users': 'Obtener lista de usuarios (requiere token)',
|
|
17
|
+
'GET /products': 'Obtener lista de productos (requiere token)',
|
|
18
|
+
'GET /profile': 'Obtener perfil de usuario (requiere token)',
|
|
19
|
+
'GET /docs': 'Documentación interactiva OpenAPI/Swagger',
|
|
20
|
+
'GET /openapi.json': 'Especificación OpenAPI'
|
|
21
|
+
}
|
|
22
|
+
}));
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
module.exports = mainController;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// Datos de ejemplo de productos
|
|
2
|
+
const products = [
|
|
3
|
+
{ id: 1, name: 'Laptop', price: 999.99, category: 'Electronics' },
|
|
4
|
+
{ id: 2, name: 'Mouse', price: 29.99, category: 'Electronics' },
|
|
5
|
+
{ id: 3, name: 'Keyboard', price: 79.99, category: 'Electronics' },
|
|
6
|
+
{ id: 4, name: 'Monitor', price: 299.99, category: 'Electronics' },
|
|
7
|
+
{ id: 5, name: 'Webcam', price: 89.99, category: 'Electronics' }
|
|
8
|
+
];
|
|
9
|
+
|
|
10
|
+
const productController = {
|
|
11
|
+
getProducts: (req, res) => {
|
|
12
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
13
|
+
res.end(JSON.stringify(products));
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
module.exports = productController;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// Datos de ejemplo de usuarios
|
|
2
|
+
const users = [
|
|
3
|
+
{ id: 1, name: 'John Doe', email: 'john@example.com', role: 'admin' },
|
|
4
|
+
{ id: 2, name: 'Jane Smith', email: 'jane@example.com', role: 'user' },
|
|
5
|
+
{ id: 3, name: 'Robert Johnson', email: 'robert@example.com', role: 'user' }
|
|
6
|
+
];
|
|
7
|
+
|
|
8
|
+
const userController = {
|
|
9
|
+
getUsers: (req, res) => {
|
|
10
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
11
|
+
res.end(JSON.stringify(users));
|
|
12
|
+
},
|
|
13
|
+
|
|
14
|
+
getProfile: (req, res) => {
|
|
15
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
16
|
+
res.end(JSON.stringify({
|
|
17
|
+
profile: {
|
|
18
|
+
id: req.user.userId,
|
|
19
|
+
username: req.user.username || 'Usuario',
|
|
20
|
+
role: req.user.role || 'guest'
|
|
21
|
+
},
|
|
22
|
+
message: 'Perfil de usuario obtenido exitosamente'
|
|
23
|
+
}));
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
module.exports = userController;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "jerk-openapi-example",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Ejemplo de API con funcionalidad OpenAPI usando el Framework JERK",
|
|
5
|
+
"main": "app.js",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"start": "node app.js",
|
|
8
|
+
"dev": "nodemon app.js"
|
|
9
|
+
},
|
|
10
|
+
"keywords": [
|
|
11
|
+
"api",
|
|
12
|
+
"sdk",
|
|
13
|
+
"openapi",
|
|
14
|
+
"swagger",
|
|
15
|
+
"documentation",
|
|
16
|
+
"framework"
|
|
17
|
+
],
|
|
18
|
+
"author": "JERK Framework",
|
|
19
|
+
"license": "MIT",
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"jsonwebtoken": "^9.0.0"
|
|
22
|
+
},
|
|
23
|
+
"devDependencies": {
|
|
24
|
+
"nodemon": "^3.0.0"
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"path": "/",
|
|
4
|
+
"method": "GET",
|
|
5
|
+
"controller": "./controllers/mainController.js",
|
|
6
|
+
"handler": "home",
|
|
7
|
+
"auth": "none"
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"path": "/login",
|
|
11
|
+
"method": "POST",
|
|
12
|
+
"controller": "./controllers/authController.js",
|
|
13
|
+
"handler": "login",
|
|
14
|
+
"auth": "none"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"path": "/users",
|
|
18
|
+
"method": "GET",
|
|
19
|
+
"controller": "./controllers/userController.js",
|
|
20
|
+
"handler": "getUsers",
|
|
21
|
+
"auth": "jwt-openapi"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"path": "/products",
|
|
25
|
+
"method": "GET",
|
|
26
|
+
"controller": "./controllers/productController.js",
|
|
27
|
+
"handler": "getProducts",
|
|
28
|
+
"auth": "jwt-openapi"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"path": "/profile",
|
|
32
|
+
"method": "GET",
|
|
33
|
+
"controller": "./controllers/userController.js",
|
|
34
|
+
"handler": "getProfile",
|
|
35
|
+
"auth": "jwt-openapi"
|
|
36
|
+
}
|
|
37
|
+
]
|
package/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Punto de entrada del framework
|
|
3
|
-
*
|
|
2
|
+
* Punto de entrada del framework JERK
|
|
3
|
+
* JERK Framework v2.0
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
const APIServer = require('./lib/core/server');
|
|
@@ -30,6 +30,10 @@ const SecurityEnhancedServer = require('./lib/core/securityEnhancedServer');
|
|
|
30
30
|
const Firewall = require('./lib/middleware/firewall');
|
|
31
31
|
const { SessionManager, sessionAuth } = require('./lib/middleware/session');
|
|
32
32
|
|
|
33
|
+
// Componentes MVC
|
|
34
|
+
const ViewEngine = require('./lib/mvc/viewEngine');
|
|
35
|
+
const ControllerBase = require('./lib/mvc/controllerBase');
|
|
36
|
+
|
|
33
37
|
// Exportar todos los componentes del framework
|
|
34
38
|
module.exports = {
|
|
35
39
|
// Componentes fundamentales (v1.0)
|
|
@@ -64,7 +68,11 @@ module.exports = {
|
|
|
64
68
|
|
|
65
69
|
// Componentes de sesión (v2.2.0)
|
|
66
70
|
SessionManager,
|
|
67
|
-
sessionAuth
|
|
71
|
+
sessionAuth,
|
|
72
|
+
|
|
73
|
+
// Componentes MVC (v2.3.0)
|
|
74
|
+
ViewEngine,
|
|
75
|
+
ControllerBase
|
|
68
76
|
};
|
|
69
77
|
|
|
70
78
|
// También exportar clases individuales por conveniencia
|
package/lib/core/handler.js
CHANGED
package/lib/core/hooks.js
CHANGED
package/lib/core/router.js
CHANGED
package/lib/core/server.js
CHANGED
package/lib/middleware/cors.js
CHANGED