jerkjs 2.1.1 → 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 (170) 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/performance_demo/app.js +0 -172
  66. package/examples/performance_demo_with_hooks/README.md +0 -52
  67. package/examples/performance_demo_with_hooks/app.js +0 -290
  68. package/examples/public/README.md +0 -92
  69. package/examples/public/app.js +0 -72
  70. package/examples/public/controllers/healthController.js +0 -20
  71. package/examples/public/controllers/mainController.js +0 -22
  72. package/examples/public/controllers/userController.js +0 -139
  73. package/examples/public/routes.json +0 -51
  74. package/examples/v2/README.md +0 -72
  75. package/examples/v2/app.js +0 -74
  76. package/examples/v2/app_fixed.js +0 -74
  77. package/examples/v2/controllers/authController.js +0 -64
  78. package/examples/v2/controllers/mainController.js +0 -24
  79. package/examples/v2/controllers/protectedController.js +0 -12
  80. package/examples/v2/controllers/userController.js +0 -16
  81. package/examples/v2/package.json +0 -27
  82. package/examples/v2/routes.json +0 -30
  83. package/examples/v2/test_api.sh +0 -47
  84. package/examples/v2/tokens_example.sqlite +0 -0
  85. package/examples/v2.1_firewall_demo/README.md +0 -113
  86. package/examples/v2.1_firewall_demo/app.js +0 -182
  87. package/examples/v2.1_firewall_demo/package.json +0 -27
  88. package/examples/v2.1_hooks_demo/README.md +0 -85
  89. package/examples/v2.1_hooks_demo/app.js +0 -101
  90. package/examples/v2.1_hooks_demo/controllers/hooksController.js +0 -29
  91. package/examples/v2.1_hooks_demo/controllers/mainController.js +0 -18
  92. package/examples/v2.1_hooks_demo/package.json +0 -27
  93. package/examples/v2.1_hooks_demo/routes.json +0 -16
  94. package/examples/v2.1_openapi_demo/README.md +0 -82
  95. package/examples/v2.1_openapi_demo/app.js +0 -296
  96. package/examples/v2.1_openapi_demo/package.json +0 -26
  97. package/examples/v2_cors/README.md +0 -82
  98. package/examples/v2_cors/app.js +0 -108
  99. package/examples/v2_cors/package.json +0 -23
  100. package/examples/v2_json_auth/README.md +0 -83
  101. package/examples/v2_json_auth/app.js +0 -72
  102. package/examples/v2_json_auth/controllers/authController.js +0 -67
  103. package/examples/v2_json_auth/controllers/mainController.js +0 -16
  104. package/examples/v2_json_auth/controllers/protectedController.js +0 -12
  105. package/examples/v2_json_auth/controllers/tokenController.js +0 -28
  106. package/examples/v2_json_auth/controllers/userController.js +0 -15
  107. package/examples/v2_json_auth/package.json +0 -26
  108. package/examples/v2_json_auth/routes.json +0 -37
  109. package/examples/v2_json_auth/tokens.json +0 -20
  110. package/examples/v2_mariadb_auth/README.md +0 -94
  111. package/examples/v2_mariadb_auth/app.js +0 -81
  112. package/examples/v2_mariadb_auth/controllers/authController.js +0 -95
  113. package/examples/v2_mariadb_auth/controllers/mainController.js +0 -31
  114. package/examples/v2_mariadb_auth/controllers/protectedController.js +0 -12
  115. package/examples/v2_mariadb_auth/controllers/userController.js +0 -17
  116. package/examples/v2_mariadb_auth/package.json +0 -27
  117. package/examples/v2_mariadb_auth/routes.json +0 -37
  118. package/examples/v2_no_auth/README.md +0 -75
  119. package/examples/v2_no_auth/app.js +0 -72
  120. package/examples/v2_no_auth/controllers/healthController.js +0 -14
  121. package/examples/v2_no_auth/controllers/mainController.js +0 -19
  122. package/examples/v2_no_auth/controllers/productController.js +0 -31
  123. package/examples/v2_no_auth/controllers/publicController.js +0 -16
  124. package/examples/v2_no_auth/package.json +0 -22
  125. package/examples/v2_no_auth/routes.json +0 -37
  126. package/examples/v2_oauth/README.md +0 -70
  127. package/examples/v2_oauth/app.js +0 -90
  128. package/examples/v2_oauth/controllers/mainController.js +0 -45
  129. package/examples/v2_oauth/controllers/oauthController.js +0 -247
  130. package/examples/v2_oauth/controllers/protectedController.js +0 -13
  131. package/examples/v2_oauth/controllers/userController.js +0 -17
  132. package/examples/v2_oauth/package.json +0 -26
  133. package/examples/v2_oauth/routes.json +0 -44
  134. package/examples/v2_openapi/README.md +0 -77
  135. package/examples/v2_openapi/app.js +0 -222
  136. package/examples/v2_openapi/controllers/authController.js +0 -52
  137. package/examples/v2_openapi/controllers/mainController.js +0 -26
  138. package/examples/v2_openapi/controllers/productController.js +0 -17
  139. package/examples/v2_openapi/controllers/userController.js +0 -27
  140. package/examples/v2_openapi/package.json +0 -26
  141. package/examples/v2_openapi/routes.json +0 -37
  142. package/v2examplle/v2_json_auth/README.md +0 -83
  143. package/v2examplle/v2_json_auth/app.js +0 -72
  144. package/v2examplle/v2_json_auth/controllers/authController.js +0 -67
  145. package/v2examplle/v2_json_auth/controllers/mainController.js +0 -16
  146. package/v2examplle/v2_json_auth/controllers/protectedController.js +0 -12
  147. package/v2examplle/v2_json_auth/controllers/tokenController.js +0 -28
  148. package/v2examplle/v2_json_auth/controllers/userController.js +0 -15
  149. package/v2examplle/v2_json_auth/package.json +0 -26
  150. package/v2examplle/v2_json_auth/routes.json +0 -37
  151. package/v2examplle/v2_json_auth/tokens.json +0 -20
  152. package/v2examplle/v2_mariadb_auth/README.md +0 -94
  153. package/v2examplle/v2_mariadb_auth/app.js +0 -81
  154. package/v2examplle/v2_mariadb_auth/controllers/authController.js +0 -95
  155. package/v2examplle/v2_mariadb_auth/controllers/mainController.js +0 -31
  156. package/v2examplle/v2_mariadb_auth/controllers/protectedController.js +0 -12
  157. package/v2examplle/v2_mariadb_auth/controllers/userController.js +0 -17
  158. package/v2examplle/v2_mariadb_auth/package.json +0 -27
  159. package/v2examplle/v2_mariadb_auth/routes.json +0 -37
  160. package/v2examplle/v2_sqlite_auth/README.md +0 -72
  161. package/v2examplle/v2_sqlite_auth/app.js +0 -74
  162. package/v2examplle/v2_sqlite_auth/app_fixed.js +0 -74
  163. package/v2examplle/v2_sqlite_auth/controllers/authController.js +0 -64
  164. package/v2examplle/v2_sqlite_auth/controllers/mainController.js +0 -24
  165. package/v2examplle/v2_sqlite_auth/controllers/protectedController.js +0 -12
  166. package/v2examplle/v2_sqlite_auth/controllers/userController.js +0 -16
  167. package/v2examplle/v2_sqlite_auth/package.json +0 -27
  168. package/v2examplle/v2_sqlite_auth/routes.json +0 -30
  169. package/v2examplle/v2_sqlite_auth/test_api.sh +0 -47
  170. package/v2examplle/v2_sqlite_auth/tokens_example.sqlite +0 -0
@@ -1,290 +0,0 @@
1
- const Jerk = require('../../index.js');
2
- const fs = require('fs');
3
- const path = require('path');
4
-
5
- // Función para verificar la disponibilidad del puerto
6
- const checkPortAvailability = async (port) => {
7
- const net = require('net');
8
-
9
- return new Promise((resolve) => {
10
- const server = net.createServer();
11
-
12
- server.listen(port, () => {
13
- server.close(() => {
14
- resolve(true); // Puerto disponible
15
- });
16
- });
17
-
18
- server.on('error', (err) => {
19
- if (err.code === 'EADDRINUSE') {
20
- resolve(false); // Puerto ocupado
21
- } else {
22
- resolve(false);
23
- }
24
- });
25
- });
26
- };
27
-
28
- // Buscar un puerto disponible entre 3000 y 3100
29
- const findAvailablePort = async () => {
30
- for (let port = 3000; port <= 3100; port++) {
31
- const isAvailable = await checkPortAvailability(port);
32
- if (isAvailable) {
33
- return port;
34
- }
35
- }
36
- throw new Error('No se encontró un puerto disponible entre 3000 y 3100');
37
- };
38
-
39
- // Función para obtener todas las rutas registradas
40
- const getAllRoutes = (app) => {
41
- // Acceder a las rutas desde la instancia de Jerk
42
- return app.routes || [];
43
- };
44
-
45
- // Crear instancia del servidor con configuraciones de rendimiento
46
- const createApp = async () => {
47
- const availablePort = await findAvailablePort();
48
-
49
- const app = new Jerk({
50
- port: availablePort,
51
- host: 'localhost',
52
- enableCompression: true, // Habilitar compresión
53
- maxBodySize: '50mb', // Permitir bodies extensos
54
- enableNestedRoutes: true // Habilitar rutas anidadas
55
- });
56
-
57
- // Middleware de compresión
58
- app.use(require('../../lib/middleware/compressor')());
59
-
60
- // Hook para registrar las rutas después de definirlas
61
- const routesInfo = [];
62
-
63
- // Sobreescribir métodos para capturar rutas
64
- const originalGet = app.get;
65
- const originalPost = app.post;
66
- const originalPut = app.put;
67
- const originalDelete = app.delete;
68
-
69
- app.get = function(path, handler) {
70
- routesInfo.push({ method: 'GET', path, description: 'Ruta registrada' });
71
- return originalGet.call(this, path, handler);
72
- };
73
-
74
- app.post = function(path, handler) {
75
- routesInfo.push({ method: 'POST', path, description: 'Ruta registrada' });
76
- return originalPost.call(this, path, handler);
77
- };
78
-
79
- app.put = function(path, handler) {
80
- routesInfo.push({ method: 'PUT', path, description: 'Ruta registrada' });
81
- return originalPut.call(this, path, handler);
82
- };
83
-
84
- app.delete = function(path, handler) {
85
- routesInfo.push({ method: 'DELETE', path, description: 'Ruta registrada' });
86
- return originalDelete.call(this, path, handler);
87
- };
88
-
89
- // Ruta para probar compresión con respuesta grande
90
- app.get('/api/compression-test', (req, res) => {
91
- // Generar una respuesta grande para demostrar compresión
92
- const largeData = {
93
- message: 'Esta es una respuesta grande para demostrar compresión',
94
- data: Array.from({ length: 1000 }, (_, i) => ({
95
- id: i,
96
- title: `Item ${i}`,
97
- description: `Este es un elemento de prueba número ${i} con información detallada`,
98
- metadata: {
99
- created: new Date().toISOString(),
100
- category: `categoria-${i % 10}`,
101
- tags: [`tag${i % 5}`, `etiqueta${i % 7}`]
102
- }
103
- }))
104
- };
105
-
106
- res.json(largeData);
107
- });
108
-
109
- // Ruta para probar bodies extensos
110
- app.post('/api/large-body', (req, res) => {
111
- const bodySize = JSON.stringify(req.body).length;
112
-
113
- res.json({
114
- message: 'Body recibido exitosamente',
115
- size: bodySize,
116
- status: 'success'
117
- });
118
- });
119
-
120
- // Rutas anidadas para demostrar jerarquía
121
- app.get('/api/users/:userId/posts', (req, res) => {
122
- const { userId } = req.params;
123
-
124
- res.json({
125
- message: `Posts del usuario ${userId}`,
126
- posts: Array.from({ length: 5 }, (_, i) => ({
127
- id: i + 1,
128
- title: `Post ${i + 1} de usuario ${userId}`,
129
- content: 'Contenido del post...'
130
- }))
131
- });
132
- });
133
-
134
- app.get('/api/users/:userId/posts/:postId/comments', (req, res) => {
135
- const { userId, postId } = req.params;
136
-
137
- res.json({
138
- message: `Comentarios del post ${postId} del usuario ${userId}`,
139
- comments: Array.from({ length: 3 }, (_, i) => ({
140
- id: i + 1,
141
- author: `Usuario${i + 1}`,
142
- content: `Comentario ${i + 1} en el post ${postId}`
143
- }))
144
- });
145
- });
146
-
147
- // Ruta para probar diferentes tipos de payloads grandes
148
- app.post('/api/upload-large-data', (req, res) => {
149
- const { dataType, dataSize } = req.body || {};
150
-
151
- let response;
152
- switch(dataType) {
153
- case 'text':
154
- response = {
155
- type: 'text',
156
- content: 'x'.repeat(dataSize || 10000),
157
- message: 'Texto largo generado para pruebas de compresión'
158
- };
159
- break;
160
- case 'json':
161
- response = {
162
- type: 'json',
163
- data: Array.from({ length: dataSize || 1000 }, (_, i) => ({
164
- id: i,
165
- value: Math.random(),
166
- label: `Elemento ${i}`
167
- })),
168
- message: 'JSON grande generado para pruebas de compresión'
169
- };
170
- break;
171
- default:
172
- response = {
173
- type: 'default',
174
- message: 'Tipo de dato no especificado, usando valores por defecto',
175
- sample: Array(100).fill().map((_, i) => `dato_${i}`)
176
- };
177
- }
178
-
179
- res.json(response);
180
- });
181
-
182
- // Endpoint para medir tiempo de respuesta
183
- app.get('/api/performance-test', (req, res) => {
184
- const startTime = Date.now();
185
-
186
- // Simular procesamiento intensivo
187
- const processData = () => {
188
- return Array.from({ length: 50000 }, (_, i) => ({
189
- id: i,
190
- computedValue: Math.sqrt(i) * Math.sin(i),
191
- timestamp: Date.now()
192
- }));
193
- };
194
-
195
- const processedData = processData();
196
- const endTime = Date.now();
197
-
198
- res.json({
199
- message: 'Prueba de rendimiento completada',
200
- processingTime: endTime - startTime,
201
- dataSize: processedData.length,
202
- status: 'success'
203
- });
204
- });
205
-
206
- // Ruta para mostrar todas las rutas disponibles usando hooks
207
- app.get('/routes', (req, res) => {
208
- const routesHtml = `
209
- <html>
210
- <head>
211
- <title>Rutas Disponibles - Demo de Rendimiento</title>
212
- <style>
213
- body { font-family: Arial, sans-serif; margin: 40px; }
214
- table { border-collapse: collapse; width: 100%; }
215
- th, td { border: 1px solid #ddd; padding: 12px; text-align: left; }
216
- th { background-color: #f2f2f2; }
217
- .method-get { color: green; }
218
- .method-post { color: orange; }
219
- .method-put { color: blue; }
220
- .method-delete { color: red; }
221
- </style>
222
- </head>
223
- <body>
224
- <h1>Rutas Disponibles - Demo de Rendimiento</h1>
225
- <p>Puerto: ${availablePort}</p>
226
- <table>
227
- <tr>
228
- <th>Método</th>
229
- <th>Ruta</th>
230
- <th>Descripción</th>
231
- </tr>
232
- ${routesInfo.map(route => `
233
- <tr>
234
- <td class="method-${route.method.toLowerCase()}">${route.method}</td>
235
- <td>${route.path}</td>
236
- <td>${route.description}</td>
237
- </tr>
238
- `).join('')}
239
- </table>
240
- <br>
241
- <a href="/">← Volver a la página principal</a>
242
- </body>
243
- </html>
244
- `;
245
-
246
- res.send(routesHtml);
247
- });
248
-
249
- // Ruta raíz para instrucciones
250
- app.get('/', (req, res) => {
251
- res.send(`
252
- <html>
253
- <head><title>Demo de Rendimiento - JERK Framework</title></head>
254
- <body>
255
- <h1>Demo de Rendimiento - JERK Framework</h1>
256
- <p>Puerto: ${availablePort}</p>
257
- <p>Esta demostración muestra las capacidades de rendimiento del framework:</p>
258
- <ul>
259
- <li><strong>Compresión</strong>: <a href="/api/compression-test">/api/compression-test</a> - Respuesta grande comprimida</li>
260
- <li><strong>Body Extensos</strong>: POST a <code>/api/large-body</code> con grandes cantidades de datos</li>
261
- <li><strong>Rutas Anidadas</strong>:
262
- <ul>
263
- <li><a href="/api/users/123/posts">/api/users/:userId/posts</a></li>
264
- <li><a href="/api/users/123/posts/456/comments">/api/users/:userId/posts/:postId/comments</a></li>
265
- </ul>
266
- </li>
267
- <li><strong>Upload de Datos Grandes</strong>: POST a <code>/api/upload-large-data</code> con diferentes tipos de datos</li>
268
- <li><strong>Prueba de Rendimiento</strong>: <a href="/api/performance-test">/api/performance-test</a> - Medición de tiempo de procesamiento</li>
269
- </ul>
270
- <p>Para ver todas las rutas disponibles: <a href="/routes">/routes</a></p>
271
- <p>Para probar bodies extensos, usa curl o Postman para hacer POST requests a los endpoints correspondientes.</p>
272
- </body>
273
- </html>
274
- `);
275
- });
276
-
277
- // Iniciar el servidor
278
- app.listen(() => {
279
- console.log(`Demo de rendimiento iniciado en http://localhost:${availablePort}`);
280
- console.log('Puerto asignado automáticamente para evitar conflictos');
281
- console.log('Visita http://localhost:' + availablePort + '/routes para ver todas las rutas disponibles');
282
- });
283
-
284
- return app;
285
- };
286
-
287
- // Ejecutar la aplicación
288
- createApp().catch(console.error);
289
-
290
- module.exports = createApp;
@@ -1,92 +0,0 @@
1
- # API Pública de Ejemplo
2
-
3
- Este ejemplo demuestra cómo crear una API pública usando el Framework JERK JS. La API incluye endpoints para gestionar usuarios y está protegida con CORS y rate limiting.
4
-
5
- ## Características
6
-
7
- - API REST pública sin autenticación requerida
8
- - Endpoints para gestión de usuarios (CRUD completo)
9
- - Protección con CORS para permitir solicitudes desde cualquier origen
10
- - Rate limiting para prevenir abusos
11
- - Endpoints de salud del sistema
12
- - Controladores organizados por funcionalidad
13
-
14
- ## Configuración
15
-
16
- 1. Asegúrate de tener instaladas las dependencias del framework JERK
17
- 2. No se requiere configuración adicional para esta API pública
18
-
19
- ## Uso
20
-
21
- 1. Inicia el servidor:
22
- ```bash
23
- node app.js
24
- ```
25
-
26
- 2. El servidor escuchará en `http://localhost:8081`
27
-
28
- ## Endpoints
29
-
30
- - `GET /` - Información general de la API (público)
31
- - `GET /users` - Lista todos los usuarios (público)
32
- - `GET /users/:id` - Obtiene un usuario específico (público)
33
- - `POST /users` - Crea un nuevo usuario (público)
34
- - `PUT /users/:id` - Actualiza un usuario existente (público)
35
- - `DELETE /users/:id` - Elimina un usuario (público)
36
- - `GET /health` - Verifica el estado del servicio (público)
37
-
38
- ## Ejemplos de uso
39
-
40
- 1. Obtener todos los usuarios:
41
- ```bash
42
- curl -X GET http://localhost:8081/users
43
- ```
44
-
45
- 2. Obtener un usuario específico:
46
- ```bash
47
- curl -X GET http://localhost:8081/users/1
48
- ```
49
-
50
- 3. Crear un nuevo usuario:
51
- ```bash
52
- curl -X POST http://localhost:8081/users \
53
- -H "Content-Type: application/json" \
54
- -d '{"name": "Nuevo Usuario", "email": "nuevo@ejemplo.com", "age": 28}'
55
- ```
56
-
57
- 4. Actualizar un usuario:
58
- ```bash
59
- curl -X PUT http://localhost:8081/users/1 \
60
- -H "Content-Type: application/json" \
61
- -d '{"name": "Usuario Actualizado", "email": "actualizado@ejemplo.com"}'
62
- ```
63
-
64
- 5. Eliminar un usuario:
65
- ```bash
66
- curl -X DELETE http://localhost:8081/users/1
67
- ```
68
-
69
- 6. Verificar estado del servicio:
70
- ```bash
71
- curl -X GET http://localhost:8081/health
72
- ```
73
-
74
- ## Estructura del proyecto
75
-
76
- ```
77
- examples/public/
78
- ├── app.js # Punto de entrada de la aplicación
79
- ├── routes.json # Definición de rutas
80
- ├── controllers/ # Controladores de las rutas
81
- │ ├── mainController.js
82
- │ ├── userController.js
83
- │ └── healthController.js
84
- └── README.md
85
- ```
86
-
87
- ## Seguridad
88
-
89
- - CORS configurado para permitir solicitudes desde cualquier origen
90
- - Rate limiting configurado para prevenir abusos (100 solicitudes por 15 minutos)
91
- - No se requiere autenticación para acceder a los endpoints
92
- - Validación de entrada en endpoints de creación/actualización
@@ -1,72 +0,0 @@
1
- const {
2
- APIServer,
3
- Router,
4
- RouteLoader,
5
- Logger,
6
- Cors,
7
- RateLimiter
8
- } = require('../../index.js');
9
-
10
- async function startServer() {
11
- // Crear instancia del servidor
12
- const server = new APIServer({
13
- port: 8081,
14
- host: 'localhost',
15
- requestTimeout: 30000, // 30 segundos
16
- connectionTimeout: 30000 // 30 segundos
17
- });
18
-
19
- // Crear instancia del logger
20
- const logger = new Logger({ level: 'info' });
21
-
22
- try {
23
- // Configurar CORS para permitir solicitudes desde cualquier origen
24
- const cors = new Cors({
25
- origin: '*',
26
- methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
27
- allowedHeaders: [
28
- 'Content-Type',
29
- 'Authorization',
30
- 'X-Requested-With',
31
- 'Accept',
32
- 'Origin'
33
- ]
34
- });
35
-
36
- // Aplicar middleware de CORS
37
- server.use(cors.middleware());
38
-
39
- // Configurar Rate Limiter para prevenir abusos
40
- const rateLimiter = new RateLimiter({
41
- windowMs: 15 * 60 * 1000, // 15 minutos
42
- maxRequests: 100 // Límite de 100 solicitudes por ventana
43
- });
44
-
45
- // Aplicar middleware de rate limiting
46
- server.use(rateLimiter.middleware());
47
-
48
- // Cargar rutas desde archivo JSON
49
- const routeLoader = new RouteLoader();
50
- await routeLoader.loadRoutes(server, './routes.json');
51
-
52
- // Iniciar el servidor
53
- server.start();
54
-
55
- logger.info('Servidor público iniciado en http://localhost:8081');
56
- logger.info('Endpoints disponibles:');
57
- logger.info('- GET / (Información del API)');
58
- logger.info('- GET /users (Lista de usuarios)');
59
- logger.info('- GET /users/:id (Obtener usuario específico)');
60
- logger.info('- POST /users (Crear nuevo usuario)');
61
- logger.info('- PUT /users/:id (Actualizar usuario)');
62
- logger.info('- DELETE /users/:id (Eliminar usuario)');
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,20 +0,0 @@
1
- const healthController = {
2
- checkHealth: (req, res) => {
3
- const healthStatus = {
4
- status: 'healthy',
5
- timestamp: new Date().toISOString(),
6
- uptime: process.uptime(),
7
- message: 'API Pública de Ejemplo está operando correctamente',
8
- version: '1.0.0',
9
- endpoints: {
10
- total: 7,
11
- active: true
12
- }
13
- };
14
-
15
- res.writeHead(200, { 'Content-Type': 'application/json' });
16
- res.end(JSON.stringify(healthStatus));
17
- }
18
- };
19
-
20
- module.exports = healthController;
@@ -1,22 +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
- version: '1.0.0',
7
- description: 'Esta es una API pública de ejemplo creada con el Framework JERK JS',
8
- endpoints: {
9
- 'GET /': 'Este mensaje',
10
- 'GET /users': 'Obtener lista de usuarios',
11
- 'GET /users/:id': 'Obtener usuario específico',
12
- 'POST /users': 'Crear nuevo usuario',
13
- 'PUT /users/:id': 'Actualizar usuario',
14
- 'DELETE /users/:id': 'Eliminar usuario',
15
- 'GET /health': 'Verificar estado del servicio'
16
- },
17
- documentation: 'Visita el README para más información sobre cómo usar esta API'
18
- }));
19
- }
20
- };
21
-
22
- module.exports = mainController;
@@ -1,139 +0,0 @@
1
- // Simulación de base de datos en memoria
2
- let users = [
3
- { id: 1, name: 'Juan Pérez', email: 'juan@example.com', age: 30 },
4
- { id: 2, name: 'María García', email: 'maria@example.com', age: 25 },
5
- { id: 3, name: 'Pedro Rodríguez', email: 'pedro@example.com', age: 35 }
6
- ];
7
-
8
- let nextId = 4;
9
-
10
- const userController = {
11
- getAllUsers: (req, res) => {
12
- res.writeHead(200, { 'Content-Type': 'application/json' });
13
- res.end(JSON.stringify({
14
- success: true,
15
- data: users,
16
- count: users.length
17
- }));
18
- },
19
-
20
- getUserById: (req, res) => {
21
- const userId = parseInt(req.params.id);
22
- const user = users.find(u => u.id === userId);
23
-
24
- if (!user) {
25
- res.writeHead(404, { 'Content-Type': 'application/json' });
26
- res.end(JSON.stringify({
27
- success: false,
28
- error: 'Usuario no encontrado'
29
- }));
30
- return;
31
- }
32
-
33
- res.writeHead(200, { 'Content-Type': 'application/json' });
34
- res.end(JSON.stringify({
35
- success: true,
36
- data: user
37
- }));
38
- },
39
-
40
- createUser: (req, res) => {
41
- try {
42
- const { name, email, age } = req.body;
43
-
44
- // Validación simple
45
- if (!name || !email) {
46
- res.writeHead(400, { 'Content-Type': 'application/json' });
47
- res.end(JSON.stringify({
48
- success: false,
49
- error: 'Nombre y correo electrónico son obligatorios'
50
- }));
51
- return;
52
- }
53
-
54
- // Crear nuevo usuario
55
- const newUser = {
56
- id: nextId++,
57
- name,
58
- email,
59
- age: age || null
60
- };
61
-
62
- users.push(newUser);
63
-
64
- res.writeHead(201, { 'Content-Type': 'application/json' });
65
- res.end(JSON.stringify({
66
- success: true,
67
- data: newUser,
68
- message: 'Usuario creado exitosamente'
69
- }));
70
- } catch (error) {
71
- res.writeHead(500, { 'Content-Type': 'application/json' });
72
- res.end(JSON.stringify({
73
- success: false,
74
- error: 'Error interno del servidor'
75
- }));
76
- }
77
- },
78
-
79
- updateUser: (req, res) => {
80
- try {
81
- const userId = parseInt(req.params.id);
82
- const { name, email, age } = req.body;
83
-
84
- const userIndex = users.findIndex(u => u.id === userId);
85
-
86
- if (userIndex === -1) {
87
- res.writeHead(404, { 'Content-Type': 'application/json' });
88
- res.end(JSON.stringify({
89
- success: false,
90
- error: 'Usuario no encontrado'
91
- }));
92
- return;
93
- }
94
-
95
- // Actualizar usuario
96
- if (name) users[userIndex].name = name;
97
- if (email) users[userIndex].email = email;
98
- if (age !== undefined) users[userIndex].age = age;
99
-
100
- res.writeHead(200, { 'Content-Type': 'application/json' });
101
- res.end(JSON.stringify({
102
- success: true,
103
- data: users[userIndex],
104
- message: 'Usuario actualizado exitosamente'
105
- }));
106
- } catch (error) {
107
- res.writeHead(500, { 'Content-Type': 'application/json' });
108
- res.end(JSON.stringify({
109
- success: false,
110
- error: 'Error interno del servidor'
111
- }));
112
- }
113
- },
114
-
115
- deleteUser: (req, res) => {
116
- const userId = parseInt(req.params.id);
117
- const userIndex = users.findIndex(u => u.id === userId);
118
-
119
- if (userIndex === -1) {
120
- res.writeHead(404, { 'Content-Type': 'application/json' });
121
- res.end(JSON.stringify({
122
- success: false,
123
- error: 'Usuario no encontrado'
124
- }));
125
- return;
126
- }
127
-
128
- const deletedUser = users.splice(userIndex, 1)[0];
129
-
130
- res.writeHead(200, { 'Content-Type': 'application/json' });
131
- res.end(JSON.stringify({
132
- success: true,
133
- data: deletedUser,
134
- message: 'Usuario eliminado exitosamente'
135
- }));
136
- }
137
- };
138
-
139
- module.exports = userController;
@@ -1,51 +0,0 @@
1
- [
2
- {
3
- "path": "/",
4
- "method": "GET",
5
- "controller": "./controllers/mainController.js",
6
- "handler": "home",
7
- "auth": "none"
8
- },
9
- {
10
- "path": "/users",
11
- "method": "GET",
12
- "controller": "./controllers/userController.js",
13
- "handler": "getAllUsers",
14
- "auth": "none"
15
- },
16
- {
17
- "path": "/users/:id",
18
- "method": "GET",
19
- "controller": "./controllers/userController.js",
20
- "handler": "getUserById",
21
- "auth": "none"
22
- },
23
- {
24
- "path": "/users",
25
- "method": "POST",
26
- "controller": "./controllers/userController.js",
27
- "handler": "createUser",
28
- "auth": "none"
29
- },
30
- {
31
- "path": "/users/:id",
32
- "method": "PUT",
33
- "controller": "./controllers/userController.js",
34
- "handler": "updateUser",
35
- "auth": "none"
36
- },
37
- {
38
- "path": "/users/:id",
39
- "method": "DELETE",
40
- "controller": "./controllers/userController.js",
41
- "handler": "deleteUser",
42
- "auth": "none"
43
- },
44
- {
45
- "path": "/health",
46
- "method": "GET",
47
- "controller": "./controllers/healthController.js",
48
- "handler": "checkHealth",
49
- "auth": "none"
50
- }
51
- ]