jerkjs 2.5.4 → 2.5.6

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 (49) hide show
  1. package/BENCHMARK_RESULTS.md +60 -0
  2. package/CHANGELOG.md +18 -0
  3. package/README.md +108 -454
  4. package/README_LEGACY.md +513 -0
  5. package/doc-2.5/SESSION_SECURITY_FLAGS.md +174 -0
  6. package/doc-2.5/an/303/241lisis-completo-jerk-framework.md +213 -0
  7. package/docs/SERVER_OPTIMIZATION_NOTES.md +87 -0
  8. package/jerk2.5.webp +0 -0
  9. package/lib/core/server.js +46 -36
  10. package/lib/middleware/session.js +11 -3
  11. package/package.json +2 -2
  12. package/@qaLoadModel/controllers/ProductController.js +0 -143
  13. package/@qaLoadModel/controllers/UserController.js +0 -143
  14. package/@qaLoadModel/models/ProductModel.js +0 -41
  15. package/@qaLoadModel/models/UserModel.js +0 -41
  16. package/@qaLoadModel/package.json +0 -22
  17. package/@qaLoadModel/qa_report.md +0 -71
  18. package/@qaLoadModel/results.md +0 -97
  19. package/@qaLoadModel/routes.json +0 -58
  20. package/@qaLoadModel/server.js +0 -43
  21. package/@qaLoadModel/simple-test.js +0 -96
  22. package/@qaLoadModel/test-models.js +0 -144
  23. package/@qaLoadModel/test_endpoints.sh +0 -35
  24. package/@qaLoadModel/test_final.js +0 -89
  25. package/@qaLoadModel/views/products/index.html +0 -45
  26. package/@qaLoadModel/views/products/show.html +0 -27
  27. package/@qaLoadModel/views/users/index.html +0 -44
  28. package/@qaLoadModel/views/users/show.html +0 -26
  29. package/qa/INFORME_QA_JERKJS_ROUTING.md +0 -108
  30. package/qa/informe_qa_fix_enrutamiento.md +0 -93
  31. package/qa-app/controllers/homeController.js +0 -9
  32. package/qa-app/controllers/userController.js +0 -76
  33. package/qa-app/hooks-config.js +0 -65
  34. package/qa-app/models/UserModel.js +0 -36
  35. package/qa-app/package-lock.json +0 -1683
  36. package/qa-app/package.json +0 -25
  37. package/qa-app/public/css/style.css +0 -15
  38. package/qa-app/public/images/logo.png +0 -3
  39. package/qa-app/public/index.html +0 -15
  40. package/qa-app/public/js/main.js +0 -7
  41. package/qa-app/routes/api-routes.json +0 -23
  42. package/qa-app/routes/page-routes.json +0 -16
  43. package/qa-app/routes/static-routes.json +0 -20
  44. package/qa-app/server.js +0 -68
  45. package/qa-app/views/footer.html +0 -3
  46. package/qa-app/views/index.html +0 -20
  47. package/qa-app/views/users.html +0 -20
  48. package/utils/find_file_path.sh +0 -36
  49. /package/{doc2.5.3 → doc-2.5}/manual-mvc-completo.md +0 -0
package/README.md CHANGED
@@ -1,217 +1,38 @@
1
- # JERK Framework v2.5.4
2
-
3
- ![JERK Framework Logo](jerk.webp)
4
-
5
- **¿Nuevo en JERK? Comienza tu proyecto rápidamente con nuestro Starter Kit**
6
-
7
- Nuestro Starter Kit en `standard/server.js` es la forma más rápida de comenzar con JERK. Viene con todas las funcionalidades del framework ya configuradas, permitiéndote concentrarte en desarrollar tu aplicación en lugar de configurar infraestructura.
8
-
9
- **Características del Starter Kit:**
10
- - Configuración lista para usar con todos los componentes principales
11
- - Carga de rutas desde archivo JSON (`routes.json`)
12
- - Sistema de controladores preconfigurado
13
- - Middlewares esenciales ya integrados (autenticación, CORS, compresión, firewall, etc.)
14
- - Sistema de logging y manejo de errores implementado
15
- - **NUEVO: Arquitectura completa MVC con modelos y soporte para bases de datos**
16
- - **NUEVO: Compatible con qbuilderjs para consultas SQL seguras y eficientes**
17
-
18
- **Cómo comenzar:**
19
- 1. Edita el archivo `routes.json` para definir tus rutas y asociarlas a tus controladores
20
-
21
- Ejemplo básico de `routes.json`:
22
- ```json
23
- [
24
- {
25
- "path": "/",
26
- "method": "GET",
27
- "controller": "HomeController",
28
- "handler": "index",
29
- "contentType": "text/html"
30
- },
31
- {
32
- "path": "/api/users",
33
- "method": "GET",
34
- "controller": "UserController",
35
- "handler": "getAllUsers",
36
- "contentType": "application/json"
37
- }
38
- ]
39
- ```
40
-
41
- 2. Crea tus controladores según las rutas definidas
42
-
43
- Por ejemplo, para la ruta principal "/", crea un archivo `HomeController.js`:
44
- ```javascript
45
- class HomeController {
46
- index(req, res) {
47
- res.render('index.html', { data: 'Hola' });
48
- }
49
- }
50
-
51
- module.exports = new HomeController();
52
- ```
53
-
54
- 3. ¡Tu aplicación estará listo para usar!
55
-
56
- El Starter Kit incluye controladores de ejemplo para que puedas ver cómo funciona el sistema.
57
-
58
- ## Ejemplo de Rutas Estáticas
59
-
60
- Desde la versión 2.1.8, JERK Framework soporta rutas estáticas para servir archivos desde directorios locales:
61
-
62
- ### En routes.json:
63
- ```json
64
- [
65
- {
66
- "path": "/static",
67
- "method": "GET",
68
- "static": {
69
- "dir": "./public",
70
- "index": ["index.html", "index.htm"],
71
- "cacheControl": "public, max-age=3600"
72
- }
73
- },
74
- {
75
- "path": "/assets",
76
- "method": "GET",
77
- "static": {
78
- "dir": "./public",
79
- "index": [],
80
- "cacheControl": "public, max-age=86400"
81
- }
82
- }
83
- ]
84
- ```
85
-
86
- ### Usando addRoute():
87
- ```javascript
88
- // Ruta estática para servir archivos desde ./public
89
- server.addRoute({
90
- method: 'GET',
91
- path: '/static',
92
- static: {
93
- dir: './public',
94
- index: ['index.html'],
95
- cacheControl: 'public, max-age=3600'
96
- }
97
- });
98
-
99
- // Ruta estática para servir archivos JS, CSS e imágenes
100
- server.addRoute('GET', '/assets', {
101
- static: {
102
- dir: './public/assets',
103
- index: [],
104
- cacheControl: 'public, max-age=86400'
105
- }
106
- });
107
- ```
108
-
109
- ## Novedades en v2.5.1
110
-
111
- ### Corrección de rutas estáticas
112
- - **Solución de error crítico con directorios**: Se corrigió un error donde el sistema de rutas estáticas intentaba leer directorios como si fueran archivos, causando el error `EISDIR: illegal operation on a directory, read`. Ahora el sistema verifica explícitamente si una ruta es un directorio y en tal caso busca el archivo índice correspondiente.
113
-
114
- ## Carga de Rutas desde Múltiples Archivos (v2.5.0)
115
-
116
- Desde la versión 2.5.0, JERK Framework incluye el componente `RouteDirectoryLoader` que permite cargar rutas desde múltiples archivos JSON ubicados en un directorio específico. Esta funcionalidad mejora la organización y mantenibilidad de aplicaciones grandes al permitir dividir las rutas en varios archivos en lugar de tener un único archivo `routes.json`.
117
-
118
- ### Ventajas del RouteDirectoryLoader:
119
- - Organización por funcionalidad (usuarios, autenticación, API, etc.)
120
- - Mayor mantenibilidad en proyectos grandes
121
- - Detección automática de rutas duplicadas
122
- - Mensajes de advertencia coloreados para rutas sobreescritas
123
- - Recarga automática de rutas en desarrollo
124
-
125
- ### Uso del RouteDirectoryLoader:
126
-
127
- ```javascript
128
- const { APIServer, RouteDirectoryLoader } = require('jerkjs');
129
-
130
- const server = new APIServer({ port: 3000 });
131
- const routeDirectoryLoader = new RouteDirectoryLoader();
132
-
133
- // Cargar rutas desde un directorio que contiene múltiples archivos JSON
134
- routeDirectoryLoader.loadRoutesFromDirectory(server, './routes')
135
- .then(routes => {
136
- console.log(`${routes.length} rutas cargadas exitosamente`);
137
- server.start();
138
- })
139
- .catch(error => {
140
- console.error('Error cargando rutas desde directorio:', error.message);
141
- });
142
- ```
143
-
144
- ### Estructura de directorio recomendada:
145
- ```
146
- routes/
147
- ├── api-routes.json
148
- ├── auth-routes.json
149
- ├── static-routes.json
150
- └── user-routes.json
151
- ```
152
-
153
- ### Ejemplo de archivo api-routes.json:
154
- ```json
155
- [
156
- {
157
- "path": "/api/users",
158
- "method": "GET",
159
- "controller": "./controllers/userController.js",
160
- "handler": "getAllUsers",
161
- "contentType": "application/json"
162
- },
163
- {
164
- "path": "/api/users/:id",
165
- "method": "GET",
166
- "controller": "./controllers/userController.js",
167
- "handler": "getUserById",
168
- "contentType": "application/json"
169
- }
170
- ]
171
- ```
172
-
173
- ### Detección de rutas duplicadas:
174
- Cuando el sistema detecta que una ruta ya ha sido definida previamente, muestra mensajes de advertencia:
175
-
176
- ```
177
- [RUTA SOBREESCRITA] Archivo: ./routes/api-routes.json, Ruta: GET /users
178
- [RUTA ACTUAL] Archivo: ./routes/other-routes.json, Ruta: GET /users
179
- ```
180
-
181
- - El mensaje en **rojo** indica la ruta que será sobreescrita
182
- - El mensaje en **amarillo** indica la ruta que prevalece
183
-
184
- ### Recarga automática de rutas:
185
- Durante el desarrollo, puedes habilitar la recarga automática cuando se modifican los archivos de rutas:
186
-
187
- ```javascript
188
- // Observar cambios en el directorio de rutas
189
- routeDirectoryLoader.watchRoutesDirectory(server, './routes', 1000); // 1000ms debounce
190
- ```
191
-
192
- Visita nuestra página web: https://jerk.page.gd/
193
- Repositorio oficial: https://gitlab.com/bytedogssyndicate1/jerk/
194
-
195
- ## Características
196
-
197
- - **Arquitectura Modular**: Componentes independientes para mayor flexibilidad
198
- - **Seguridad Avanzada**: Firewall integrado (WAF) con detección de ataques
199
- - **Sistema de Hooks**: Similar al sistema de WordPress para extensibility
200
- - **Autenticación Flexible**: Soporte para JWT, API Keys, Basic Auth, OAuth2, OpenID Connect
201
- - **Almacenamiento de Tokens**: Soporte para memoria, JSON, SQLite y MariaDB
202
- - **Enrutamiento Avanzado**: Soporte para rutas parametrizadas, anidadas y estáticas
203
- - **Soporte para Frontend**: Capacidad de servir contenido HTML y otros tipos de contenido
204
- - **Configuración de Content-Type**: Especificación de headers Content-Type en routes.json
205
- - **Middlewares Integrados**: CORS, rate limiting, compresión, firewall, etc.
206
- - **Gestión de Controladores**: Carga dinámica de controladores desde archivos
207
- - **Carga de Rutas**: Definición de rutas desde archivos JSON
208
- - **Sistema de Sesiones**: Gestión completa de sesiones con soporte para autenticación
209
- - **Motor de Plantillas MVC**: Sistema profesional de vistas con soporte para filtros, helpers y hooks
210
- - **Arquitectura de Modelos Completa (MVC)**: Capa de modelos para la lógica de negocio y acceso a datos
211
- - **Sistema de Adaptadores de Base de Datos**: Soporte para múltiples motores de base de datos (MariaDB, MySQL, etc.)
212
- - **Compatible con qbuilderjs**: Soporte para integrar el QueryBuilder externo qbuilderjs para construir consultas SQL complejas de manera segura y eficiente
213
- - **Servicio de Archivos Estáticos**: Soporte para servir archivos desde directorios locales con configuración flexible
214
- - **Extensibilidad**: Sistema de hooks y filters para personalización
1
+ ![JERK Framework](jerk2.5.webp)
2
+ ##### JERK Framework v2.5.6
3
+
4
+ **JERK Framework** es un framework de desarrollo web completo para Node.js que implementa una arquitectura MVC (Modelo-Vista-Controlador) con soporte para APIs REST, seguridad avanzada, y sistemas de plantillas.
5
+
6
+ ## Características Principales
7
+
8
+ ### 🚀 Rendimiento Optimizado
9
+ - Servidor HTTP/HTTPS de alto rendimiento
10
+ - Optimizaciones de rendimiento en el manejo de solicitudes
11
+ - Carga anticipada de módulos comunes para evitar operaciones redundantes
12
+ - Manejo eficiente de rutas estáticas y dinámicas
13
+
14
+ ### 🔐 Seguridad Avanzada
15
+ - Sistema de sesiones con cookies seguras personalizables
16
+ - Filtros para personalizar flags de seguridad de cookies (`Secure`, `SameSite`, etc.)
17
+ - Web Application Firewall (WAF) con detección de patrones de ataque
18
+ - Sistema de autenticación con múltiples estrategias (JWT, API Keys, Basic Auth, OAuth2, OpenID Connect)
19
+ - Protección contra SQL Injection, XSS y otros ataques comunes
20
+
21
+ ### 🏗️ Arquitectura Modular
22
+ - Componentes independientes para mayor flexibilidad
23
+ - Sistema de hooks y filtros similar al de WordPress
24
+ - Soporte para middlewares personalizados
25
+ - Arquitectura MVC completa con modelos, vistas y controladores
26
+
27
+ ### 📊 Soporte para Bases de Datos
28
+ - Adaptadores para diferentes motores de base de datos (Memory, MariaDB/MySQL, SQLite)
29
+ - Integración con QueryBuilder externo (qbuilderjs) para construir consultas SQL seguras
30
+ - Sistema de modelos con operaciones CRUD completas
31
+
32
+ ### 🎨 Motores de Plantillas
33
+ - Motor de plantillas con soporte para variables, condiciones, bucles e inclusiones
34
+ - Filtros y helpers personalizables
35
+ - Soporte para layouts y vistas dinámicas
215
36
 
216
37
  ## Instalación
217
38
 
@@ -222,80 +43,94 @@ npm install jerkjs
222
43
  ## Uso Básico
223
44
 
224
45
  ```javascript
225
- const { APIServer, Router, Logger } = require('jerkjs');
46
+ const { APIServer, RouteDirectoryLoader, ViewEngine, ModelManager, MemoryAdapter } = require('jerkjs');
226
47
 
227
48
  // Crear instancia del servidor
228
49
  const server = new APIServer({
229
- port: 3000,
230
- host: 'localhost'
50
+ port: 3000,
51
+ host: 'localhost'
231
52
  });
232
53
 
233
- // Crear instancia del logger
234
- const logger = new Logger({ level: 'info' });
235
-
236
- // Definir rutas
237
- server.addRoute('GET', '/', (req, res) => {
238
- res.writeHead(200, { 'Content-Type': 'application/json' });
239
- res.end(JSON.stringify({ message: '¡Hola Mundo!' }));
54
+ // Configurar motor de vistas
55
+ const viewEngine = new ViewEngine({
56
+ viewsDir: './views',
57
+ defaultLayout: 'layout.html'
240
58
  });
241
59
 
242
- // Iniciar el servidor
243
- server.start();
244
- ```
245
-
246
- ## Componentes Principales
247
-
248
- ### APIServer
249
- Servidor HTTP/HTTPS básico con soporte para rutas parametrizadas, middlewares y configuración avanzada.
250
-
251
- ### Router
252
- Sistema de enrutamiento avanzado con soporte para rutas anidadas y prefijos.
60
+ // Configurar sistema de modelos
61
+ const modelManager = new ModelManager();
62
+ const memoryAdapter = new MemoryAdapter();
63
+ modelManager.registerAdapter('memory', memoryAdapter);
253
64
 
254
- ### Authenticator
255
- Middleware de autenticación con soporte para múltiples métodos (JWT, API Keys, Basic Auth, OAuth2, OpenID Connect).
65
+ // Asociar componentes al servidor
66
+ server.viewEngine = viewEngine;
67
+ server.modelManager = modelManager;
256
68
 
257
- ### SecurityEnhancedServer
258
- Servidor con funcionalidades de seguridad avanzada (WAF) integradas.
69
+ // Cargar rutas desde directorio
70
+ const routeDirectoryLoader = new RouteDirectoryLoader();
71
+ routeDirectoryLoader.loadRoutesFromDirectory(server, './routes');
259
72
 
260
- ### RouteLoader
261
- Carga de rutas desde archivos JSON con soporte para autenticación, controladores y especificación de content-type.
73
+ // Iniciar el servidor
74
+ server.start();
75
+ ```
262
76
 
263
- ### TokenManager
264
- Gestión de tokens JWT con diferentes tipos de almacenamiento (memoria, JSON, SQLite, MariaDB).
77
+ ## Seguridad de Sesiones
265
78
 
266
- ### Firewall
267
- Middleware de firewall con detección de patrones de ataque y listas blancas/negras.
79
+ JERK Framework incluye un sistema de sesiones con soporte para personalización de flags de seguridad a través de filtros:
268
80
 
269
- ### Hooks System
270
- Sistema de hooks y filters similar al de WordPress para extensibilidad.
81
+ ```javascript
82
+ const { hooks } = require('jerkjs');
271
83
 
272
- ### SessionManager
273
- Sistema completo de gestión de sesiones con soporte para autenticación basada en sesiones.
84
+ // Personalizar flags de cookies de sesión
85
+ hooks.addFilter('session_cookie_flags', (defaultFlags, req, res, sessionId) => {
86
+ // Detectar si la solicitud es HTTPS
87
+ const isHttps = (req && req.connection && req.connection.encrypted) ||
88
+ (req && req.headers && req.headers['x-forwarded-proto'] === 'https');
89
+
90
+ let flags = defaultFlags;
91
+
92
+ // Agregar la flag Secure si es HTTPS
93
+ if (isHttps) {
94
+ flags += '; Secure';
95
+ }
96
+
97
+ // Agregar SameSite según el contexto
98
+ flags += '; SameSite=Lax';
99
+
100
+ return flags;
101
+ });
102
+ ```
274
103
 
275
- ### ViewEngine
276
- Motor de plantillas profesional con soporte para filtros, helpers, condiciones, bucles y hooks.
104
+ ## Componentes Principales
277
105
 
278
- ### ControllerBase
279
- Controlador base que facilita el desarrollo de controladores MVC con soporte para vistas.
106
+ ### Servidor (APIServer)
107
+ - Servidor HTTP/HTTPS básico con soporte para rutas parametrizadas
108
+ - Manejo de archivos estáticos con soporte para índices y control de caché
109
+ - Sistema de hooks para extensibilidad
110
+ - Soporte para middlewares y manejo de cuerpos de solicitud con límites de tamaño
280
111
 
281
- ## Seguridad
112
+ ### Sistema de Enrutamiento
113
+ - Router con soporte para rutas anidadas
114
+ - RouteMatcher para coincidencia de rutas parametrizadas con cacheo de expresiones regulares
115
+ - Soporte para rutas estáticas y dinámicas con prioridad adecuada
282
116
 
283
- El framework incluye múltiples capas de seguridad:
117
+ ### Middleware
118
+ - CORS, Autenticación, Sesiones, Validación, Rate Limiting
119
+ - Compresión (gzip/deflate) con sistema de hooks
120
+ - Firewall (WAF) con detección de patrones de ataque
121
+ - Audit Logger para eventos de seguridad
284
122
 
285
- - **Web Application Firewall (WAF)**: Detección de SQL injection, XSS, path traversal, etc.
286
- - **Rate Limiting**: Limitación de peticiones por IP o usuario
287
- - **Firewall**: Bloqueo automático por intentos fallidos
288
- - **Listas Blancas/Negras**: Control de acceso por IP
289
- - **Auditoría de Seguridad**: Registro de eventos de seguridad
290
- - **Autenticación Robusta**: Soporte para múltiples métodos de autenticación
123
+ ### Componentes MVC
124
+ - ControllerBase con soporte para vistas, layouts y variables
125
+ - ModelBase con operaciones CRUD
126
+ - ViewEngine con soporte para filtros, helpers, condiciones, bucles e inclusiones
127
+ - ModelManager con soporte para múltiples adaptadores
291
128
 
292
- ## Sistema de Hooks
129
+ ## Sistema de Hooks y Filtros
293
130
 
294
- El framework incluye un sistema de hooks y filters similar al de WordPress:
131
+ El framework incluye un sistema completo de hooks y filtros similar al de WordPress:
295
132
 
296
133
  ```javascript
297
- const { hooks } = require('jerkjs');
298
-
299
134
  // Registrar una acción
300
135
  hooks.addAction('firewall_request_blocked', (rule, clientIP, req, res) => {
301
136
  console.log(`Solicitud bloqueada: ${rule.name} para IP: ${clientIP}`);
@@ -311,203 +146,22 @@ hooks.addFilter('session_create_data', (userData, req) => {
311
146
  });
312
147
  ```
313
148
 
314
- ## Motor de Plantillas MVC
315
-
316
- El framework incluye un motor de plantillas profesional con soporte para:
317
-
318
- - Variables: `{{variable}}`
319
- - Condiciones: `{{if variable}}contenido{{endif}}`
320
- - Bucles: `{{foreach:array}}contenido{{endforeach}}`
321
- - Inclusiones: `{{include:header}}`
322
- - Filtros: `{{variable|upper}}`
323
- - Helpers personalizados
324
-
325
- ## Gestión de Sesiones
326
-
327
- El framework incluye un sistema completo de gestión de sesiones:
328
-
329
- ```javascript
330
- const { SessionManager } = require('jerkjs');
331
-
332
- const sessionManager = new SessionManager({
333
- secret: 'your-session-secret',
334
- timeout: 3600000 // 1 hora
335
- });
336
-
337
- // Usar como middleware
338
- server.use(sessionManager.middleware());
339
- ```
340
-
341
- ## Ejemplos
342
-
343
- El proyecto incluye varios ejemplos completos:
344
-
345
- - **v2_json_auth**: Autenticación JWT con tokens almacenados en JSON
346
- - **v2_mariadb_auth**: Autenticación JWT con tokens almacenados en MariaDB
347
- - **v2_sqlite_auth**: Autenticación JWT con tokens almacenados en SQLite
348
- - **public**: API pública de ejemplo con CORS y rate limiting
349
- - **frontend**: Ejemplo de servidor que combina API y frontend con diferentes content-types
350
- - **hooks**: Ejemplo avanzado de uso del sistema de hooks con logging y seguimiento de solicitudes
351
-
352
- Para ver los ejemplos completos, visita los directorios `v2examplle/` y `examples/`.
353
-
354
-
355
- ## Documentación
356
-
357
- Además de la documentación en el README, el proyecto incluye documentación adicional:
358
-
359
- - **Guía de inicio rápido**: `docs/guia_inicio_rapido_jerkjs.md` - Una guía completa para empezar rápidamente con JERKJS, incluyendo formatos de archivos, estructura de controladores, motor de plantillas y sistema de hooks.
360
-
361
149
  ## Contribuciones
362
150
 
363
- Las contribuciones son bienvenidas. Por favor, abre un issue o envía un pull request en GitLab.
151
+ Las contribuciones son bienvenidas. Por favor, abre un issue o envía un pull request para sugerir cambios o mejoras.
364
152
 
365
153
  ## Licencia
366
154
 
367
- Apache 2.0
368
-
369
- ## Arquitectura de Modelos (MVC)
370
-
371
- JERK Framework v2.2.0 introduce una arquitectura completa de modelos que completa el patrón MVC. Los modelos permiten encapsular la lógica de negocio y el acceso a datos en componentes reutilizables.
372
-
373
- ### Ejemplo de Modelo Simple con MariaDB
374
-
375
- ```javascript
376
- const { ModelBase, MariaDBAdapter } = require('jerkjs');
377
-
378
- // Definir un modelo para usuarios
379
- class UserModel extends ModelBase {
380
- constructor(options = {}) {
381
- super({
382
- ...options,
383
- tableName: options.tableName || 'users'
384
- });
385
-
386
- // Definir campos del modelo
387
- this.fields = {
388
- id: { type: 'integer', primaryKey: true, autoIncrement: true },
389
- username: { type: 'string', required: true },
390
- email: { type: 'string', required: true },
391
- password: { type: 'string', required: true },
392
- createdAt: { type: 'datetime', default: 'CURRENT_TIMESTAMP' }
393
- };
394
- }
395
-
396
- // Método personalizado para encontrar usuario por email
397
- async findByEmail(email) {
398
- return await this.findOne({ email });
399
- }
400
-
401
- // Método personalizado para crear usuario con validación
402
- async createUser(userData) {
403
- // Validar datos antes de crear
404
- const validation = this.validate('create', userData);
405
- if (!validation.isValid) {
406
- throw new Error(`Validación fallida: ${validation.errors.join(', ')}`);
407
- }
408
-
409
- return await this.create(userData);
410
- }
411
- }
412
-
413
- // Configurar el adaptador de MariaDB
414
- const dbConfig = {
415
- host: 'localhost',
416
- user: 'tu_usuario',
417
- password: 'tu_contraseña',
418
- database: 'tu_base_de_datos'
419
- };
155
+ Este proyecto está licenciado bajo la Apache License 2.0 - ver el archivo LICENSE para más detalles.
420
156
 
421
- const mariaDBAdapter = new MariaDBAdapter(dbConfig);
157
+ ## Autor
422
158
 
423
- // Crear instancia del modelo con el adaptador
424
- const userModel = new UserModel({
425
- adapter: mariaDBAdapter,
426
- tableName: 'users'
427
- });
428
-
429
- // Uso del modelo
430
- async function ejemploUsoModelo() {
431
- try {
432
- // Crear un nuevo usuario
433
- const nuevoUsuario = await userModel.createUser({
434
- username: 'juan.perez',
435
- email: 'juan@example.com',
436
- password: 'contraseña_segura'
437
- });
438
-
439
- console.log('Usuario creado:', nuevoUsuario);
440
-
441
- // Buscar usuario por email
442
- const usuario = await userModel.findByEmail('juan@example.com');
443
- console.log('Usuario encontrado:', usuario);
444
- } catch (error) {
445
- console.error('Error:', error.message);
446
- }
447
- }
448
- ```
159
+ JERK Framework Team / Benjamin Sanhez Cardenas
449
160
 
450
- ### Uso de Modelos en Controladores con loadModel
161
+ ## Repositorio
451
162
 
452
- JERK Framework proporciona un helper `loadModel` en el ControllerBase para facilitar la carga y uso de modelos en los controladores:
453
-
454
- ```javascript
455
- const ControllerBase = require('jerkjs').ControllerBase;
456
-
457
- class UserController extends ControllerBase {
458
- constructor() {
459
- super();
460
-
461
- // Cargar el modelo de usuario
462
- this.userModel = this.loadModel('UserModel', {
463
- // Opciones del modelo
464
- });
465
- }
466
-
467
- async getAllUsers(req, res) {
468
- try {
469
- // Usar el modelo para obtener usuarios
470
- const users = await this.userModel.find({});
471
-
472
- this.json(res, { success: true, data: users });
473
- } catch (error) {
474
- this.json(res, { success: false, error: error.message }, 500);
475
- }
476
- }
477
-
478
- async getUserById(req, res) {
479
- try {
480
- const userId = req.params.id;
481
-
482
- // Usar el modelo para encontrar un usuario específico
483
- const user = await this.userModel.findOne({ id: userId });
484
-
485
- if (!user) {
486
- this.json(res, { success: false, error: 'Usuario no encontrado' }, 404);
487
- return;
488
- }
489
-
490
- this.json(res, { success: true, data: user });
491
- } catch (error) {
492
- this.json(res, { success: false, error: error.message }, 500);
493
- }
494
- }
495
-
496
- async createUser(req, res) {
497
- try {
498
- // Usar el modelo para crear un nuevo usuario
499
- const newUser = await this.userModel.createUser(req.body);
500
-
501
- this.json(res, { success: true, data: newUser }, 201);
502
- } catch (error) {
503
- this.json(res, { success: false, error: error.message }, 400);
504
- }
505
- }
506
- }
507
-
508
- module.exports = new UserController();
509
- ```
163
+ GitLab: https://gitlab.com/bytedogssyndicate1/jerk
510
164
 
511
- ## Documentación del Framework
165
+ ## Soporte
512
166
 
513
- Para una descripción detallada de la arquitectura y componentes del framework, consulta el archivo [JERK_FRAMEWORK_DOCUMENTATION.md](JERK_FRAMEWORK_DOCUMENTATION.md).
167
+ Para soporte, por favor abre un issue en el repositorio o visita nuestra página web: https://jerk.page.gd/