jerkjs 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 (167) hide show
  1. package/CHANGELOG.md +3 -2
  2. package/README.md +1 -1
  3. package/examples.arj +0 -0
  4. package/index.js +1 -1
  5. package/lib/middleware/compressor.js +34 -18
  6. package/package.json +1 -1
  7. package/standard/CompressionTestController.js +38 -0
  8. package/standard/HealthController.js +16 -0
  9. package/standard/HomeController.js +12 -0
  10. package/standard/ProductController.js +18 -0
  11. package/standard/README.md +47 -0
  12. package/standard/UserController.js +23 -0
  13. package/standard/package.json +22 -0
  14. package/standard/routes.json +58 -0
  15. package/standard/server.js +140 -0
  16. package/cookies.txt +0 -5
  17. package/examples/advanced/controllers/productController.js +0 -64
  18. package/examples/advanced/controllers/userController.js +0 -85
  19. package/examples/advanced/routes.json +0 -51
  20. package/examples/advanced_example.js +0 -93
  21. package/examples/basic/controllers/userController.js +0 -85
  22. package/examples/basic_example.js +0 -72
  23. package/examples/frontend/README.md +0 -71
  24. package/examples/frontend/app.js +0 -71
  25. package/examples/frontend/controllers/apiController.js +0 -39
  26. package/examples/frontend/controllers/authController.js +0 -220
  27. package/examples/frontend/controllers/formController.js +0 -47
  28. package/examples/frontend/controllers/messageController.js +0 -96
  29. package/examples/frontend/controllers/pageController.js +0 -178
  30. package/examples/frontend/controllers/staticController.js +0 -167
  31. package/examples/frontend/routes.json +0 -90
  32. package/examples/hooks/app.js +0 -136
  33. package/examples/hooks/controllers/authController.js +0 -54
  34. package/examples/hooks/controllers/mainController.js +0 -41
  35. package/examples/hooks/controllers/productController.js +0 -39
  36. package/examples/hooks/controllers/userController.js +0 -69
  37. package/examples/hooks/routes.json +0 -51
  38. package/examples/hooks/views/home.html +0 -50
  39. package/examples/mvc_example/app.js +0 -138
  40. package/examples/mvc_example/views/home/index.html +0 -26
  41. package/examples/mvc_example/views/home/simple.html +0 -3
  42. package/examples/mvc_example/views/layout.html +0 -23
  43. package/examples/mvc_example/views/test.html +0 -3
  44. package/examples/mvc_example/views/user/invalid.html +0 -6
  45. package/examples/mvc_example/views/user/list.html +0 -36
  46. package/examples/mvc_example/views/user/notfound.html +0 -6
  47. package/examples/mvc_example/views/user/profile.html +0 -11
  48. package/examples/mvc_routes_example/app.js +0 -34
  49. package/examples/mvc_routes_example/controllers/mainController.js +0 -27
  50. package/examples/mvc_routes_example/controllers/productController.js +0 -47
  51. package/examples/mvc_routes_example/controllers/userController.js +0 -76
  52. package/examples/mvc_routes_example/routes.json +0 -30
  53. package/examples/mvc_routes_example/views/layout.html +0 -31
  54. package/examples/mvc_routes_example/views/main/index.html +0 -11
  55. package/examples/mvc_routes_example/views/product/catalog.html +0 -24
  56. package/examples/mvc_routes_example/views/user/invalid.html +0 -6
  57. package/examples/mvc_routes_example/views/user/list.html +0 -40
  58. package/examples/mvc_routes_example/views/user/notfound.html +0 -6
  59. package/examples/mvc_routes_example/views/user/profile.html +0 -18
  60. package/examples/mvc_welcome/README.md +0 -34
  61. package/examples/mvc_welcome/app.js +0 -50
  62. package/examples/mvc_welcome/controllers/welcomeController.js +0 -41
  63. package/examples/mvc_welcome/package.json +0 -26
  64. package/examples/mvc_welcome/views/home/welcome.html +0 -82
  65. package/examples/public/README.md +0 -92
  66. package/examples/public/app.js +0 -72
  67. package/examples/public/controllers/healthController.js +0 -20
  68. package/examples/public/controllers/mainController.js +0 -22
  69. package/examples/public/controllers/userController.js +0 -139
  70. package/examples/public/routes.json +0 -51
  71. package/examples/v2/README.md +0 -72
  72. package/examples/v2/app.js +0 -74
  73. package/examples/v2/app_fixed.js +0 -74
  74. package/examples/v2/controllers/authController.js +0 -64
  75. package/examples/v2/controllers/mainController.js +0 -24
  76. package/examples/v2/controllers/protectedController.js +0 -12
  77. package/examples/v2/controllers/userController.js +0 -16
  78. package/examples/v2/package.json +0 -27
  79. package/examples/v2/routes.json +0 -30
  80. package/examples/v2/test_api.sh +0 -47
  81. package/examples/v2/tokens_example.sqlite +0 -0
  82. package/examples/v2.1_firewall_demo/README.md +0 -113
  83. package/examples/v2.1_firewall_demo/app.js +0 -182
  84. package/examples/v2.1_firewall_demo/package.json +0 -27
  85. package/examples/v2.1_hooks_demo/README.md +0 -85
  86. package/examples/v2.1_hooks_demo/app.js +0 -101
  87. package/examples/v2.1_hooks_demo/controllers/hooksController.js +0 -29
  88. package/examples/v2.1_hooks_demo/controllers/mainController.js +0 -18
  89. package/examples/v2.1_hooks_demo/package.json +0 -27
  90. package/examples/v2.1_hooks_demo/routes.json +0 -16
  91. package/examples/v2.1_openapi_demo/README.md +0 -82
  92. package/examples/v2.1_openapi_demo/app.js +0 -296
  93. package/examples/v2.1_openapi_demo/package.json +0 -26
  94. package/examples/v2_cors/README.md +0 -82
  95. package/examples/v2_cors/app.js +0 -108
  96. package/examples/v2_cors/package.json +0 -23
  97. package/examples/v2_json_auth/README.md +0 -83
  98. package/examples/v2_json_auth/app.js +0 -72
  99. package/examples/v2_json_auth/controllers/authController.js +0 -67
  100. package/examples/v2_json_auth/controllers/mainController.js +0 -16
  101. package/examples/v2_json_auth/controllers/protectedController.js +0 -12
  102. package/examples/v2_json_auth/controllers/tokenController.js +0 -28
  103. package/examples/v2_json_auth/controllers/userController.js +0 -15
  104. package/examples/v2_json_auth/package.json +0 -26
  105. package/examples/v2_json_auth/routes.json +0 -37
  106. package/examples/v2_json_auth/tokens.json +0 -20
  107. package/examples/v2_mariadb_auth/README.md +0 -94
  108. package/examples/v2_mariadb_auth/app.js +0 -81
  109. package/examples/v2_mariadb_auth/controllers/authController.js +0 -95
  110. package/examples/v2_mariadb_auth/controllers/mainController.js +0 -31
  111. package/examples/v2_mariadb_auth/controllers/protectedController.js +0 -12
  112. package/examples/v2_mariadb_auth/controllers/userController.js +0 -17
  113. package/examples/v2_mariadb_auth/package.json +0 -27
  114. package/examples/v2_mariadb_auth/routes.json +0 -37
  115. package/examples/v2_no_auth/README.md +0 -75
  116. package/examples/v2_no_auth/app.js +0 -72
  117. package/examples/v2_no_auth/controllers/healthController.js +0 -14
  118. package/examples/v2_no_auth/controllers/mainController.js +0 -19
  119. package/examples/v2_no_auth/controllers/productController.js +0 -31
  120. package/examples/v2_no_auth/controllers/publicController.js +0 -16
  121. package/examples/v2_no_auth/package.json +0 -22
  122. package/examples/v2_no_auth/routes.json +0 -37
  123. package/examples/v2_oauth/README.md +0 -70
  124. package/examples/v2_oauth/app.js +0 -90
  125. package/examples/v2_oauth/controllers/mainController.js +0 -45
  126. package/examples/v2_oauth/controllers/oauthController.js +0 -247
  127. package/examples/v2_oauth/controllers/protectedController.js +0 -13
  128. package/examples/v2_oauth/controllers/userController.js +0 -17
  129. package/examples/v2_oauth/package.json +0 -26
  130. package/examples/v2_oauth/routes.json +0 -44
  131. package/examples/v2_openapi/README.md +0 -77
  132. package/examples/v2_openapi/app.js +0 -222
  133. package/examples/v2_openapi/controllers/authController.js +0 -52
  134. package/examples/v2_openapi/controllers/mainController.js +0 -26
  135. package/examples/v2_openapi/controllers/productController.js +0 -17
  136. package/examples/v2_openapi/controllers/userController.js +0 -27
  137. package/examples/v2_openapi/package.json +0 -26
  138. package/examples/v2_openapi/routes.json +0 -37
  139. package/v2examplle/v2_json_auth/README.md +0 -83
  140. package/v2examplle/v2_json_auth/app.js +0 -72
  141. package/v2examplle/v2_json_auth/controllers/authController.js +0 -67
  142. package/v2examplle/v2_json_auth/controllers/mainController.js +0 -16
  143. package/v2examplle/v2_json_auth/controllers/protectedController.js +0 -12
  144. package/v2examplle/v2_json_auth/controllers/tokenController.js +0 -28
  145. package/v2examplle/v2_json_auth/controllers/userController.js +0 -15
  146. package/v2examplle/v2_json_auth/package.json +0 -26
  147. package/v2examplle/v2_json_auth/routes.json +0 -37
  148. package/v2examplle/v2_json_auth/tokens.json +0 -20
  149. package/v2examplle/v2_mariadb_auth/README.md +0 -94
  150. package/v2examplle/v2_mariadb_auth/app.js +0 -81
  151. package/v2examplle/v2_mariadb_auth/controllers/authController.js +0 -95
  152. package/v2examplle/v2_mariadb_auth/controllers/mainController.js +0 -31
  153. package/v2examplle/v2_mariadb_auth/controllers/protectedController.js +0 -12
  154. package/v2examplle/v2_mariadb_auth/controllers/userController.js +0 -17
  155. package/v2examplle/v2_mariadb_auth/package.json +0 -27
  156. package/v2examplle/v2_mariadb_auth/routes.json +0 -37
  157. package/v2examplle/v2_sqlite_auth/README.md +0 -72
  158. package/v2examplle/v2_sqlite_auth/app.js +0 -74
  159. package/v2examplle/v2_sqlite_auth/app_fixed.js +0 -74
  160. package/v2examplle/v2_sqlite_auth/controllers/authController.js +0 -64
  161. package/v2examplle/v2_sqlite_auth/controllers/mainController.js +0 -24
  162. package/v2examplle/v2_sqlite_auth/controllers/protectedController.js +0 -12
  163. package/v2examplle/v2_sqlite_auth/controllers/userController.js +0 -16
  164. package/v2examplle/v2_sqlite_auth/package.json +0 -27
  165. package/v2examplle/v2_sqlite_auth/routes.json +0 -30
  166. package/v2examplle/v2_sqlite_auth/test_api.sh +0 -47
  167. package/v2examplle/v2_sqlite_auth/tokens_example.sqlite +0 -0
@@ -1,94 +0,0 @@
1
- # Ejemplo API con Autenticación MariaDB
2
-
3
- Este ejemplo demuestra cómo crear una API con autenticación basada en tokens almacenados en MariaDB utilizando el Framework JERK.
4
-
5
- ## Características
6
-
7
- - Autenticación JWT con tokens almacenados en MariaDB
8
- - Rutas protegidas y públicas
9
- - Sistema de login/logout para obtener y revocar tokens
10
- - Controladores organizados por funcionalidad
11
- - Revocación de tokens en la base de datos
12
-
13
- ## Configuración
14
-
15
- 1. Asegúrate de tener instaladas las dependencias del framework JERK
16
- 2. Instala mariadb si aún no está instalado: `npm install mariadb`
17
- 3. Asegúrate de tener MariaDB instalado y en ejecución
18
- 4. Crea la base de datos `token_db` en MariaDB
19
-
20
- ## Preparación de la base de datos
21
-
22
- Antes de ejecutar la aplicación, asegúrate de tener MariaDB en ejecución y crea la base de datos:
23
-
24
- ```sql
25
- CREATE DATABASE IF NOT EXISTS token_db;
26
- USE token_db;
27
- ```
28
-
29
- La tabla de tokens se creará automáticamente al iniciar la aplicación.
30
-
31
- ## Uso
32
-
33
- 1. Inicia el servidor:
34
- ```bash
35
- node app.js
36
- ```
37
-
38
- 2. El servidor escuchará en `http://localhost:8090`
39
-
40
- ## Endpoints
41
-
42
- - `GET /` - Página de inicio (público)
43
- - `POST /login` - Iniciar sesión y obtener token (público)
44
- - `GET /protected` - Contenido protegido (requiere token)
45
- - `GET /profile` - Perfil de usuario (requiere token)
46
- - `POST /logout` - Cerrar sesión y revocar token (requiere token)
47
-
48
- ## Ejemplo de uso
49
-
50
- 1. Iniciar sesión:
51
- ```bash
52
- curl -X POST http://localhost:8090/login \
53
- -H "Content-Type: application/json" \
54
- -d '{"username": "admin", "password": "password"}'
55
- ```
56
-
57
- 2. Acceder a contenido protegido:
58
- ```bash
59
- curl -X GET http://localhost:8090/protected \
60
- -H "Authorization: Bearer TU_TOKEN_AQUI"
61
- ```
62
-
63
- 3. Ver perfil de usuario:
64
- ```bash
65
- curl -X GET http://localhost:8090/profile \
66
- -H "Authorization: Bearer TU_TOKEN_AQUI"
67
- ```
68
-
69
- 4. Cerrar sesión y revocar token:
70
- ```bash
71
- curl -X POST http://localhost:8090/logout \
72
- -H "Authorization: Bearer TU_TOKEN_AQUI"
73
- ```
74
-
75
- ## Estructura del proyecto
76
-
77
- ```
78
- examples/v2_mariadb_auth/
79
- ├── app.js # Punto de entrada de la aplicación
80
- ├── routes.json # Definición de rutas
81
- ├── controllers/ # Controladores de las rutas
82
- │ ├── mainController.js
83
- │ ├── authController.js
84
- │ ├── protectedController.js
85
- │ └── userController.js
86
- └── README.md
87
- ```
88
-
89
- ## Seguridad
90
-
91
- - Los tokens se almacenan en una base de datos MariaDB
92
- - Los tokens expiran después de 1 hora
93
- - Las rutas protegidas requieren un token válido en el header Authorization
94
- - Los tokens pueden ser revocados mediante el endpoint de logout
@@ -1,81 +0,0 @@
1
- const {
2
- APIServer,
3
- Authenticator,
4
- RouteLoader,
5
- Logger,
6
- MariaDBTokenAdapter
7
- } = require('../../index.js');
8
-
9
- async function startServer() {
10
- // Crear instancia del servidor
11
- const server = new APIServer({
12
- port: 8090,
13
- host: 'localhost'
14
- });
15
-
16
- // Crear instancia del logger
17
- const logger = new Logger({ level: 'info' });
18
-
19
- try {
20
- // Crear instancia del adaptador de tokens MariaDB
21
- const tokenAdapter = new MariaDBTokenAdapter({
22
- host: 'localhost',
23
- user: 'root',
24
- password: '', // Dejar vacío si no hay contraseña para root
25
- database: 'token_db',
26
- tableName: 'mariadb_tokens'
27
- });
28
-
29
- // Inicializar el adaptador de tokens
30
- await tokenAdapter.initialize();
31
- logger.info('MariaDB Token Adapter inicializado correctamente');
32
-
33
- // Crear instancia del autenticador
34
- const authenticator = new Authenticator({ logger });
35
-
36
- // Registrar estrategia de autenticación JWT que utiliza el adaptador MariaDB
37
- authenticator.use('jwt-mariadb', async (req, options = {}) => {
38
- const authHeader = req.headers.authorization;
39
- const token = authHeader && authHeader.split(' ')[1]; // Bearer TOKEN
40
-
41
- if (!token) {
42
- return false;
43
- }
44
-
45
- // Validar el token contra la base de datos MariaDB
46
- const tokenRecord = await tokenAdapter.validateToken(token);
47
-
48
- if (tokenRecord) {
49
- // Agregar información del usuario a la solicitud
50
- req.user = {
51
- userId: tokenRecord.user_id,
52
- tokenType: tokenRecord.token_type,
53
- expiresAt: tokenRecord.expires_at
54
- };
55
- return true;
56
- }
57
-
58
- return false;
59
- });
60
-
61
- // Agregar el autenticador al servidor para que pueda ser usado por el RouteLoader
62
- server.authenticator = authenticator;
63
-
64
- // Cargar rutas desde archivo JSON
65
- const routeLoader = new RouteLoader();
66
- await routeLoader.loadRoutes(server, './routes.json');
67
-
68
- // Iniciar el servidor
69
- server.start();
70
-
71
- logger.info('Servidor iniciado en http://localhost:8090');
72
- } catch (error) {
73
- logger.error('Error iniciando el servidor:', error.message);
74
- process.exit(1);
75
- }
76
- }
77
-
78
- // Iniciar el servidor
79
- startServer();
80
-
81
- module.exports = { startServer };
@@ -1,95 +0,0 @@
1
- const jwt = require('jsonwebtoken');
2
- const { MariaDBTokenAdapter } = require('../../../index.js');
3
-
4
- // Adaptador de tokens para este controlador
5
- const tokenAdapter = new MariaDBTokenAdapter({
6
- host: 'localhost',
7
- user: 'root',
8
- password: '',
9
- database: 'token_db',
10
- tableName: 'mariadb_tokens'
11
- });
12
-
13
- // Asegurarse de que el adaptador esté inicializado
14
- tokenAdapter.initialize().catch(console.error);
15
-
16
- const authController = {
17
- login: async (req, res) => {
18
- try {
19
- const { username, password } = req.body;
20
-
21
- // Validación simple de credenciales (esto debería ser más robusto en producción)
22
- if (!username || !password) {
23
- res.writeHead(400, { 'Content-Type': 'application/json' });
24
- res.end(JSON.stringify({ error: 'Nombre de usuario y contraseña requeridos' }));
25
- return;
26
- }
27
-
28
- // Simulación de autenticación (en una aplicación real, esto verificaría contra una base de datos)
29
- if (username === 'admin' && password === 'password') {
30
- // Generar un token JWT
31
- const payload = {
32
- userId: 1,
33
- username: username,
34
- role: 'admin'
35
- };
36
-
37
- // Secret para firmar el token (en producción, debería estar en variables de entorno)
38
- const secret = 'super-secret-key-for-mariadb-example';
39
- const token = jwt.sign(payload, secret, { expiresIn: '1h' });
40
-
41
- // Guardar el token en la base de datos MariaDB
42
- await tokenAdapter.saveToken(
43
- token,
44
- { userId: 1 },
45
- 'access',
46
- new Date(Date.now() + 60 * 60 * 1000) // 1 hora
47
- );
48
-
49
- res.writeHead(200, { 'Content-Type': 'application/json' });
50
- res.end(JSON.stringify({
51
- message: 'Inicio de sesión exitoso',
52
- token: token,
53
- user: payload
54
- }));
55
- } else {
56
- res.writeHead(401, { 'Content-Type': 'application/json' });
57
- res.end(JSON.stringify({ error: 'Credenciales inválidas' }));
58
- }
59
- } catch (error) {
60
- console.error('Error en login:', error);
61
- res.writeHead(500, { 'Content-Type': 'application/json' });
62
- res.end(JSON.stringify({ error: 'Error interno del servidor' }));
63
- }
64
- },
65
-
66
- logout: async (req, res) => {
67
- try {
68
- const authHeader = req.headers.authorization;
69
- const token = authHeader && authHeader.split(' ')[1]; // Bearer TOKEN
70
-
71
- if (!token) {
72
- res.writeHead(400, { 'Content-Type': 'application/json' });
73
- res.end(JSON.stringify({ error: 'Token no proporcionado' }));
74
- return;
75
- }
76
-
77
- // Revocar el token en la base de datos MariaDB
78
- const revoked = await tokenAdapter.revokeToken(token);
79
-
80
- if (revoked) {
81
- res.writeHead(200, { 'Content-Type': 'application/json' });
82
- res.end(JSON.stringify({ message: 'Sesión cerrada exitosamente' }));
83
- } else {
84
- res.writeHead(400, { 'Content-Type': 'application/json' });
85
- res.end(JSON.stringify({ error: 'No se pudo revocar el token' }));
86
- }
87
- } catch (error) {
88
- console.error('Error en logout:', error);
89
- res.writeHead(500, { 'Content-Type': 'application/json' });
90
- res.end(JSON.stringify({ error: 'Error interno del servidor' }));
91
- }
92
- }
93
- };
94
-
95
- module.exports = authController;
@@ -1,31 +0,0 @@
1
- const jwt = require('jsonwebtoken');
2
- const { MariaDBTokenAdapter } = require('../../../index.js');
3
-
4
- // Adaptador de tokens para este controlador
5
- const tokenAdapter = new MariaDBTokenAdapter({
6
- host: 'localhost',
7
- user: 'root',
8
- password: '',
9
- database: 'token_db',
10
- tableName: 'mariadb_tokens'
11
- });
12
-
13
- // Asegurarse de que el adaptador esté inicializado
14
- tokenAdapter.initialize().catch(console.error);
15
-
16
- const mainController = {
17
- home: (req, res) => {
18
- res.writeHead(200, { 'Content-Type': 'application/json' });
19
- res.end(JSON.stringify({
20
- message: 'Bienvenido a la API de ejemplo con autenticación MariaDB',
21
- endpoints: {
22
- 'POST /login': 'Iniciar sesión y obtener token',
23
- 'GET /protected': 'Contenido protegido (requiere token)',
24
- 'GET /profile': 'Perfil de usuario (requiere token)',
25
- 'POST /logout': 'Cerrar sesión y revocar token (requiere token)'
26
- }
27
- }));
28
- }
29
- };
30
-
31
- module.exports = mainController;
@@ -1,12 +0,0 @@
1
- const protectedController = {
2
- getProtectedData: (req, res) => {
3
- res.writeHead(200, { 'Content-Type': 'application/json' });
4
- res.end(JSON.stringify({
5
- message: 'Datos protegidos accesados exitosamente',
6
- user: req.user,
7
- timestamp: new Date().toISOString()
8
- }));
9
- }
10
- };
11
-
12
- module.exports = protectedController;
@@ -1,17 +0,0 @@
1
- const userController = {
2
- getProfile: (req, res) => {
3
- res.writeHead(200, { 'Content-Type': 'application/json' });
4
- res.end(JSON.stringify({
5
- profile: {
6
- id: req.user.userId,
7
- username: req.user.username || 'Usuario',
8
- role: req.user.role || 'guest',
9
- tokenType: req.user.tokenType,
10
- expiresAt: req.user.expiresAt
11
- },
12
- message: 'Perfil de usuario obtenido exitosamente'
13
- }));
14
- }
15
- };
16
-
17
- module.exports = userController;
@@ -1,27 +0,0 @@
1
- {
2
- "name": "jerk-mariadb-example",
3
- "version": "1.0.0",
4
- "description": "Ejemplo de API con autenticación MariaDB 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
- "authentication",
14
- "mariadb",
15
- "jwt",
16
- "framework"
17
- ],
18
- "author": "JERK Framework",
19
- "license": "MIT",
20
- "dependencies": {
21
- "jsonwebtoken": "^9.0.0",
22
- "mariadb": "^3.0.0"
23
- },
24
- "devDependencies": {
25
- "nodemon": "^3.0.0"
26
- }
27
- }
@@ -1,37 +0,0 @@
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": "/protected",
18
- "method": "GET",
19
- "controller": "./controllers/protectedController.js",
20
- "handler": "getProtectedData",
21
- "auth": "jwt-mariadb"
22
- },
23
- {
24
- "path": "/profile",
25
- "method": "GET",
26
- "controller": "./controllers/userController.js",
27
- "handler": "getProfile",
28
- "auth": "jwt-mariadb"
29
- },
30
- {
31
- "path": "/logout",
32
- "method": "POST",
33
- "controller": "./controllers/authController.js",
34
- "handler": "logout",
35
- "auth": "jwt-mariadb"
36
- }
37
- ]
@@ -1,75 +0,0 @@
1
- # Ejemplo API Pública sin Autenticación
2
-
3
- Este ejemplo demuestra cómo crear una API pública sin autenticación utilizando el Framework JERK.
4
-
5
- ## Características
6
-
7
- - API completamente pública sin requerir tokens o autenticación
8
- - Rutas para diferentes tipos de datos
9
- - Documentación OpenAPI generada automáticamente
10
- - Endpoints de ejemplo para productos y datos públicos
11
-
12
- ## Configuración
13
-
14
- No se requieren dependencias adicionales más allá del Framework JERK.
15
-
16
- ## Uso
17
-
18
- 1. Inicia el servidor:
19
- ```bash
20
- node app.js
21
- ```
22
-
23
- 2. El servidor escuchará en `http://localhost:8089`
24
-
25
- ## Endpoints
26
-
27
- - `GET /` - Página de inicio
28
- - `GET /public` - Datos públicos de ejemplo
29
- - `GET /products` - Lista de productos
30
- - `GET /products/:id` - Producto específico por ID
31
- - `GET /health` - Estado del servicio
32
- - `GET /docs` - Documentación interactiva de la API
33
- - `GET /openapi.json` - Especificación OpenAPI
34
-
35
- ## Ejemplo de uso
36
-
37
- 1. Consultar productos:
38
- ```bash
39
- curl http://localhost:8089/products
40
- ```
41
-
42
- 2. Consultar producto específico:
43
- ```bash
44
- curl http://localhost:8089/products/1
45
- ```
46
-
47
- 3. Consultar datos públicos:
48
- ```bash
49
- curl http://localhost:8089/public
50
- ```
51
-
52
- 4. Ver estado del servicio:
53
- ```bash
54
- curl http://localhost:8089/health
55
- ```
56
-
57
- ## Estructura del proyecto
58
-
59
- ```
60
- examples/v2_no_auth/
61
- ├── app.js # Punto de entrada de la aplicación
62
- ├── routes.json # Definición de rutas
63
- ├── controllers/ # Controladores de las rutas
64
- │ ├── mainController.js
65
- │ ├── publicController.js
66
- │ ├── productController.js
67
- │ └── healthController.js
68
- └── README.md
69
- ```
70
-
71
- ## Notas
72
-
73
- - Esta API no requiere autenticación, por lo que todos los endpoints son públicos
74
- - Adecuada para servicios públicos, APIs de datos abiertos o prototipos
75
- - La documentación OpenAPI se genera automáticamente y está disponible en `/docs`
@@ -1,72 +0,0 @@
1
- const {
2
- APIServer,
3
- RouteLoader,
4
- Logger,
5
- OpenApiGenerator
6
- } = require('../../index.js');
7
-
8
- async function startServer() {
9
- // Crear instancia del servidor
10
- const server = new APIServer({
11
- port: 8089,
12
- host: 'localhost'
13
- });
14
-
15
- // Crear instancia del logger
16
- const logger = new Logger({ level: 'info' });
17
-
18
- try {
19
- // Cargar rutas desde archivo JSON
20
- const routeLoader = new RouteLoader();
21
- await routeLoader.loadRoutes(server, './routes.json');
22
-
23
- // Crear instancia del generador de OpenAPI
24
- const openApiGenerator = new OpenApiGenerator({
25
- title: 'API Pública de Ejemplo',
26
- description: 'Una API pública sin autenticación',
27
- version: '1.0.0'
28
- });
29
-
30
- // Agregar rutas a la documentación OpenAPI
31
- openApiGenerator.addRoute({
32
- path: '/public',
33
- method: 'GET',
34
- config: {
35
- summary: 'Endpoint público de ejemplo',
36
- description: 'Devuelve datos públicos sin requerir autenticación',
37
- responses: {
38
- '200': {
39
- description: 'Datos públicos',
40
- content: {
41
- 'application/json': {
42
- schema: {
43
- type: 'object',
44
- properties: {
45
- message: { type: 'string' },
46
- timestamp: { type: 'string' }
47
- }
48
- }
49
- }
50
- }
51
- }
52
- }
53
- }
54
- });
55
-
56
- // Agregar ruta de documentación al servidor
57
- openApiGenerator.addDocumentationRoute(server);
58
-
59
- // Iniciar el servidor
60
- server.start();
61
-
62
- logger.info('Servidor iniciado en http://localhost:8089');
63
- } catch (error) {
64
- logger.error('Error iniciando el servidor:', error.message);
65
- process.exit(1);
66
- }
67
- }
68
-
69
- // Iniciar el servidor
70
- startServer();
71
-
72
- module.exports = { startServer };
@@ -1,14 +0,0 @@
1
- const healthController = {
2
- getStatus: (req, res) => {
3
- res.writeHead(200, { 'Content-Type': 'application/json' });
4
- res.end(JSON.stringify({
5
- status: 'healthy',
6
- uptime: process.uptime(),
7
- timestamp: new Date().toISOString(),
8
- service: 'API Pública de Ejemplo',
9
- version: '1.0.0'
10
- }));
11
- }
12
- };
13
-
14
- module.exports = healthController;
@@ -1,19 +0,0 @@
1
- const mainController = {
2
- home: (req, res) => {
3
- res.writeHead(200, { 'Content-Type': 'application/json' });
4
- res.end(JSON.stringify({
5
- message: 'Bienvenido a la API pública de ejemplo',
6
- endpoints: {
7
- 'GET /': 'Esta página de inicio',
8
- 'GET /public': 'Datos públicos de ejemplo',
9
- 'GET /products': 'Lista de productos',
10
- 'GET /products/:id': 'Producto por ID',
11
- 'GET /health': 'Estado del servicio',
12
- 'GET /docs': 'Documentación interactiva de la API',
13
- 'GET /openapi.json': 'Especificación OpenAPI'
14
- }
15
- }));
16
- }
17
- };
18
-
19
- module.exports = mainController;
@@ -1,31 +0,0 @@
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
- getAllProducts: (req, res) => {
12
- res.writeHead(200, { 'Content-Type': 'application/json' });
13
- res.end(JSON.stringify(products));
14
- },
15
-
16
- getProductById: (req, res) => {
17
- const productId = parseInt(req.params.id);
18
- const product = products.find(p => p.id === productId);
19
-
20
- if (!product) {
21
- res.writeHead(404, { 'Content-Type': 'application/json' });
22
- res.end(JSON.stringify({ error: 'Producto no encontrado' }));
23
- return;
24
- }
25
-
26
- res.writeHead(200, { 'Content-Type': 'application/json' });
27
- res.end(JSON.stringify(product));
28
- }
29
- };
30
-
31
- module.exports = productController;
@@ -1,16 +0,0 @@
1
- const publicController = {
2
- getPublicData: (req, res) => {
3
- res.writeHead(200, { 'Content-Type': 'application/json' });
4
- res.end(JSON.stringify({
5
- message: 'Este es un endpoint público sin autenticación',
6
- timestamp: new Date().toISOString(),
7
- data: {
8
- randomValue: Math.floor(Math.random() * 100),
9
- serverStatus: 'operational',
10
- publicInfo: 'Esta información es accesible para todos'
11
- }
12
- }));
13
- }
14
- };
15
-
16
- module.exports = publicController;
@@ -1,22 +0,0 @@
1
- {
2
- "name": "jerk-public-example",
3
- "version": "1.0.0",
4
- "description": "Ejemplo de API pública sin autenticación 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
- "public",
14
- "no-authentication",
15
- "framework"
16
- ],
17
- "author": "JERK Framework",
18
- "license": "MIT",
19
- "devDependencies": {
20
- "nodemon": "^3.0.0"
21
- }
22
- }