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.
- package/CHANGELOG.md +3 -2
- package/README.md +1 -1
- package/examples.arj +0 -0
- package/index.js +1 -1
- package/lib/middleware/compressor.js +34 -18
- package/package.json +1 -1
- package/standard/CompressionTestController.js +38 -0
- package/standard/HealthController.js +16 -0
- package/standard/HomeController.js +12 -0
- package/standard/ProductController.js +18 -0
- package/standard/README.md +47 -0
- package/standard/UserController.js +23 -0
- package/standard/package.json +22 -0
- package/standard/routes.json +58 -0
- package/standard/server.js +140 -0
- package/cookies.txt +0 -5
- package/examples/advanced/controllers/productController.js +0 -64
- package/examples/advanced/controllers/userController.js +0 -85
- package/examples/advanced/routes.json +0 -51
- package/examples/advanced_example.js +0 -93
- package/examples/basic/controllers/userController.js +0 -85
- package/examples/basic_example.js +0 -72
- package/examples/frontend/README.md +0 -71
- package/examples/frontend/app.js +0 -71
- package/examples/frontend/controllers/apiController.js +0 -39
- package/examples/frontend/controllers/authController.js +0 -220
- package/examples/frontend/controllers/formController.js +0 -47
- package/examples/frontend/controllers/messageController.js +0 -96
- package/examples/frontend/controllers/pageController.js +0 -178
- package/examples/frontend/controllers/staticController.js +0 -167
- package/examples/frontend/routes.json +0 -90
- package/examples/hooks/app.js +0 -136
- package/examples/hooks/controllers/authController.js +0 -54
- package/examples/hooks/controllers/mainController.js +0 -41
- package/examples/hooks/controllers/productController.js +0 -39
- package/examples/hooks/controllers/userController.js +0 -69
- package/examples/hooks/routes.json +0 -51
- package/examples/hooks/views/home.html +0 -50
- package/examples/mvc_example/app.js +0 -138
- package/examples/mvc_example/views/home/index.html +0 -26
- package/examples/mvc_example/views/home/simple.html +0 -3
- package/examples/mvc_example/views/layout.html +0 -23
- package/examples/mvc_example/views/test.html +0 -3
- package/examples/mvc_example/views/user/invalid.html +0 -6
- package/examples/mvc_example/views/user/list.html +0 -36
- package/examples/mvc_example/views/user/notfound.html +0 -6
- package/examples/mvc_example/views/user/profile.html +0 -11
- package/examples/mvc_routes_example/app.js +0 -34
- package/examples/mvc_routes_example/controllers/mainController.js +0 -27
- package/examples/mvc_routes_example/controllers/productController.js +0 -47
- package/examples/mvc_routes_example/controllers/userController.js +0 -76
- package/examples/mvc_routes_example/routes.json +0 -30
- package/examples/mvc_routes_example/views/layout.html +0 -31
- package/examples/mvc_routes_example/views/main/index.html +0 -11
- package/examples/mvc_routes_example/views/product/catalog.html +0 -24
- package/examples/mvc_routes_example/views/user/invalid.html +0 -6
- package/examples/mvc_routes_example/views/user/list.html +0 -40
- package/examples/mvc_routes_example/views/user/notfound.html +0 -6
- package/examples/mvc_routes_example/views/user/profile.html +0 -18
- package/examples/mvc_welcome/README.md +0 -34
- package/examples/mvc_welcome/app.js +0 -50
- package/examples/mvc_welcome/controllers/welcomeController.js +0 -41
- package/examples/mvc_welcome/package.json +0 -26
- package/examples/mvc_welcome/views/home/welcome.html +0 -82
- package/examples/public/README.md +0 -92
- package/examples/public/app.js +0 -72
- package/examples/public/controllers/healthController.js +0 -20
- package/examples/public/controllers/mainController.js +0 -22
- package/examples/public/controllers/userController.js +0 -139
- package/examples/public/routes.json +0 -51
- package/examples/v2/README.md +0 -72
- package/examples/v2/app.js +0 -74
- package/examples/v2/app_fixed.js +0 -74
- package/examples/v2/controllers/authController.js +0 -64
- package/examples/v2/controllers/mainController.js +0 -24
- package/examples/v2/controllers/protectedController.js +0 -12
- package/examples/v2/controllers/userController.js +0 -16
- package/examples/v2/package.json +0 -27
- package/examples/v2/routes.json +0 -30
- package/examples/v2/test_api.sh +0 -47
- package/examples/v2/tokens_example.sqlite +0 -0
- package/examples/v2.1_firewall_demo/README.md +0 -113
- package/examples/v2.1_firewall_demo/app.js +0 -182
- package/examples/v2.1_firewall_demo/package.json +0 -27
- package/examples/v2.1_hooks_demo/README.md +0 -85
- package/examples/v2.1_hooks_demo/app.js +0 -101
- package/examples/v2.1_hooks_demo/controllers/hooksController.js +0 -29
- package/examples/v2.1_hooks_demo/controllers/mainController.js +0 -18
- package/examples/v2.1_hooks_demo/package.json +0 -27
- package/examples/v2.1_hooks_demo/routes.json +0 -16
- package/examples/v2.1_openapi_demo/README.md +0 -82
- package/examples/v2.1_openapi_demo/app.js +0 -296
- package/examples/v2.1_openapi_demo/package.json +0 -26
- package/examples/v2_cors/README.md +0 -82
- package/examples/v2_cors/app.js +0 -108
- package/examples/v2_cors/package.json +0 -23
- package/examples/v2_json_auth/README.md +0 -83
- package/examples/v2_json_auth/app.js +0 -72
- package/examples/v2_json_auth/controllers/authController.js +0 -67
- package/examples/v2_json_auth/controllers/mainController.js +0 -16
- package/examples/v2_json_auth/controllers/protectedController.js +0 -12
- package/examples/v2_json_auth/controllers/tokenController.js +0 -28
- package/examples/v2_json_auth/controllers/userController.js +0 -15
- package/examples/v2_json_auth/package.json +0 -26
- package/examples/v2_json_auth/routes.json +0 -37
- package/examples/v2_json_auth/tokens.json +0 -20
- package/examples/v2_mariadb_auth/README.md +0 -94
- package/examples/v2_mariadb_auth/app.js +0 -81
- package/examples/v2_mariadb_auth/controllers/authController.js +0 -95
- package/examples/v2_mariadb_auth/controllers/mainController.js +0 -31
- package/examples/v2_mariadb_auth/controllers/protectedController.js +0 -12
- package/examples/v2_mariadb_auth/controllers/userController.js +0 -17
- package/examples/v2_mariadb_auth/package.json +0 -27
- package/examples/v2_mariadb_auth/routes.json +0 -37
- package/examples/v2_no_auth/README.md +0 -75
- package/examples/v2_no_auth/app.js +0 -72
- package/examples/v2_no_auth/controllers/healthController.js +0 -14
- package/examples/v2_no_auth/controllers/mainController.js +0 -19
- package/examples/v2_no_auth/controllers/productController.js +0 -31
- package/examples/v2_no_auth/controllers/publicController.js +0 -16
- package/examples/v2_no_auth/package.json +0 -22
- package/examples/v2_no_auth/routes.json +0 -37
- package/examples/v2_oauth/README.md +0 -70
- package/examples/v2_oauth/app.js +0 -90
- package/examples/v2_oauth/controllers/mainController.js +0 -45
- package/examples/v2_oauth/controllers/oauthController.js +0 -247
- package/examples/v2_oauth/controllers/protectedController.js +0 -13
- package/examples/v2_oauth/controllers/userController.js +0 -17
- package/examples/v2_oauth/package.json +0 -26
- package/examples/v2_oauth/routes.json +0 -44
- package/examples/v2_openapi/README.md +0 -77
- package/examples/v2_openapi/app.js +0 -222
- package/examples/v2_openapi/controllers/authController.js +0 -52
- package/examples/v2_openapi/controllers/mainController.js +0 -26
- package/examples/v2_openapi/controllers/productController.js +0 -17
- package/examples/v2_openapi/controllers/userController.js +0 -27
- package/examples/v2_openapi/package.json +0 -26
- package/examples/v2_openapi/routes.json +0 -37
- package/v2examplle/v2_json_auth/README.md +0 -83
- package/v2examplle/v2_json_auth/app.js +0 -72
- package/v2examplle/v2_json_auth/controllers/authController.js +0 -67
- package/v2examplle/v2_json_auth/controllers/mainController.js +0 -16
- package/v2examplle/v2_json_auth/controllers/protectedController.js +0 -12
- package/v2examplle/v2_json_auth/controllers/tokenController.js +0 -28
- package/v2examplle/v2_json_auth/controllers/userController.js +0 -15
- package/v2examplle/v2_json_auth/package.json +0 -26
- package/v2examplle/v2_json_auth/routes.json +0 -37
- package/v2examplle/v2_json_auth/tokens.json +0 -20
- package/v2examplle/v2_mariadb_auth/README.md +0 -94
- package/v2examplle/v2_mariadb_auth/app.js +0 -81
- package/v2examplle/v2_mariadb_auth/controllers/authController.js +0 -95
- package/v2examplle/v2_mariadb_auth/controllers/mainController.js +0 -31
- package/v2examplle/v2_mariadb_auth/controllers/protectedController.js +0 -12
- package/v2examplle/v2_mariadb_auth/controllers/userController.js +0 -17
- package/v2examplle/v2_mariadb_auth/package.json +0 -27
- package/v2examplle/v2_mariadb_auth/routes.json +0 -37
- package/v2examplle/v2_sqlite_auth/README.md +0 -72
- package/v2examplle/v2_sqlite_auth/app.js +0 -74
- package/v2examplle/v2_sqlite_auth/app_fixed.js +0 -74
- package/v2examplle/v2_sqlite_auth/controllers/authController.js +0 -64
- package/v2examplle/v2_sqlite_auth/controllers/mainController.js +0 -24
- package/v2examplle/v2_sqlite_auth/controllers/protectedController.js +0 -12
- package/v2examplle/v2_sqlite_auth/controllers/userController.js +0 -16
- package/v2examplle/v2_sqlite_auth/package.json +0 -27
- package/v2examplle/v2_sqlite_auth/routes.json +0 -30
- package/v2examplle/v2_sqlite_auth/test_api.sh +0 -47
- package/v2examplle/v2_sqlite_auth/tokens_example.sqlite +0 -0
|
@@ -1,220 +0,0 @@
|
|
|
1
|
-
const messageController = require('./messageController');
|
|
2
|
-
|
|
3
|
-
const authController = {
|
|
4
|
-
// Mostrar formulario de login
|
|
5
|
-
showLoginPage: (req, res) => {
|
|
6
|
-
const html = `
|
|
7
|
-
<!DOCTYPE html>
|
|
8
|
-
<html lang="es">
|
|
9
|
-
<head>
|
|
10
|
-
<meta charset="UTF-8">
|
|
11
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
12
|
-
<title>Login - API Frontend Demo</title>
|
|
13
|
-
<link rel="stylesheet" href="/styles.css">
|
|
14
|
-
</head>
|
|
15
|
-
<body>
|
|
16
|
-
<div class="container">
|
|
17
|
-
<header>
|
|
18
|
-
<h1>Área de Administración</h1>
|
|
19
|
-
<nav>
|
|
20
|
-
<ul>
|
|
21
|
-
<li><a href="/">Inicio</a></li>
|
|
22
|
-
<li><a href="/about">Acerca de</a></li>
|
|
23
|
-
<li><a href="/contact">Contacto</a></li>
|
|
24
|
-
<li><a href="/login">Login</a></li>
|
|
25
|
-
<li><a href="/api/users">Usuarios (API)</a></li>
|
|
26
|
-
</ul>
|
|
27
|
-
</nav>
|
|
28
|
-
</header>
|
|
29
|
-
|
|
30
|
-
<main>
|
|
31
|
-
<section class="login-section">
|
|
32
|
-
<h2>Iniciar Sesión</h2>
|
|
33
|
-
<form id="loginForm">
|
|
34
|
-
<div class="form-group">
|
|
35
|
-
<label for="username">Usuario:</label>
|
|
36
|
-
<input type="text" id="username" name="username" required>
|
|
37
|
-
</div>
|
|
38
|
-
|
|
39
|
-
<div class="form-group">
|
|
40
|
-
<label for="password">Contraseña:</label>
|
|
41
|
-
<input type="password" id="password" name="password" required>
|
|
42
|
-
</div>
|
|
43
|
-
|
|
44
|
-
<button type="submit">Ingresar</button>
|
|
45
|
-
</form>
|
|
46
|
-
|
|
47
|
-
<div id="login-response"></div>
|
|
48
|
-
|
|
49
|
-
<p><em>Usuario: admin | Contraseña: password123</em></p>
|
|
50
|
-
</section>
|
|
51
|
-
</main>
|
|
52
|
-
|
|
53
|
-
<footer>
|
|
54
|
-
<p>© 2026 JERK JS Framework</p>
|
|
55
|
-
</footer>
|
|
56
|
-
</div>
|
|
57
|
-
<script src="/script.js"></script>
|
|
58
|
-
<script>
|
|
59
|
-
document.addEventListener('DOMContentLoaded', function() {
|
|
60
|
-
const loginForm = document.getElementById('loginForm');
|
|
61
|
-
|
|
62
|
-
if (loginForm) {
|
|
63
|
-
loginForm.addEventListener('submit', function(e) {
|
|
64
|
-
e.preventDefault();
|
|
65
|
-
|
|
66
|
-
const formData = new FormData(loginForm);
|
|
67
|
-
const data = Object.fromEntries(formData);
|
|
68
|
-
|
|
69
|
-
fetch('/api/login', {
|
|
70
|
-
method: 'POST',
|
|
71
|
-
headers: {
|
|
72
|
-
'Content-Type': 'application/json'
|
|
73
|
-
},
|
|
74
|
-
body: JSON.stringify(data)
|
|
75
|
-
})
|
|
76
|
-
.then(response => response.json())
|
|
77
|
-
.then(result => {
|
|
78
|
-
const responseDiv = document.getElementById('login-response');
|
|
79
|
-
|
|
80
|
-
if (result.success) {
|
|
81
|
-
responseDiv.innerHTML = '<p style="color: green;">Inicio de sesión exitoso. Redirigiendo...</p>';
|
|
82
|
-
|
|
83
|
-
// Redirigir después de un breve delay
|
|
84
|
-
setTimeout(() => {
|
|
85
|
-
window.location.href = '/messages';
|
|
86
|
-
}, 1500);
|
|
87
|
-
} else {
|
|
88
|
-
responseDiv.innerHTML = '<p style="color: red;">' + result.message + '</p>';
|
|
89
|
-
}
|
|
90
|
-
})
|
|
91
|
-
.catch(error => {
|
|
92
|
-
console.error('Error:', error);
|
|
93
|
-
const responseDiv = document.getElementById('login-response');
|
|
94
|
-
responseDiv.innerHTML = '<p style="color: red;">Error de conexión</p>';
|
|
95
|
-
});
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
});
|
|
99
|
-
</script>
|
|
100
|
-
</body>
|
|
101
|
-
</html>`;
|
|
102
|
-
|
|
103
|
-
res.writeHead(200);
|
|
104
|
-
res.end(html);
|
|
105
|
-
},
|
|
106
|
-
|
|
107
|
-
// Procesar login
|
|
108
|
-
processLogin: async (req, res) => {
|
|
109
|
-
try {
|
|
110
|
-
// req.body puede ser un string o un objeto, dependiendo de cómo se haya procesado
|
|
111
|
-
let body;
|
|
112
|
-
if (typeof req.body === 'string') {
|
|
113
|
-
body = JSON.parse(req.body);
|
|
114
|
-
} else {
|
|
115
|
-
body = req.body;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
const { username, password } = body;
|
|
119
|
-
|
|
120
|
-
// Validar credenciales
|
|
121
|
-
const user = await messageController.validateUser(username, password);
|
|
122
|
-
|
|
123
|
-
if (user) {
|
|
124
|
-
// Crear sesión de usuario autenticado
|
|
125
|
-
if (req.session) {
|
|
126
|
-
req.session.create({
|
|
127
|
-
authenticated: true,
|
|
128
|
-
userId: user.id,
|
|
129
|
-
username: user.username
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
134
|
-
res.end(JSON.stringify({
|
|
135
|
-
success: true,
|
|
136
|
-
message: 'Inicio de sesión exitoso',
|
|
137
|
-
userId: user.id
|
|
138
|
-
}));
|
|
139
|
-
} else {
|
|
140
|
-
res.writeHead(401, { 'Content-Type': 'application/json' });
|
|
141
|
-
res.end(JSON.stringify({
|
|
142
|
-
success: false,
|
|
143
|
-
message: 'Credenciales inválidas'
|
|
144
|
-
}));
|
|
145
|
-
}
|
|
146
|
-
} catch (error) {
|
|
147
|
-
console.error('Error en login:', error);
|
|
148
|
-
res.writeHead(500, { 'Content-Type': 'application/json' });
|
|
149
|
-
res.end(JSON.stringify({
|
|
150
|
-
success: false,
|
|
151
|
-
message: 'Error interno del servidor'
|
|
152
|
-
}));
|
|
153
|
-
}
|
|
154
|
-
},
|
|
155
|
-
|
|
156
|
-
// Mostrar mensajes (requiere estar logueado - en este ejemplo simplificado no verificamos sesión)
|
|
157
|
-
showMessages: async (req, res) => {
|
|
158
|
-
try {
|
|
159
|
-
// Obtener mensajes de la base de datos
|
|
160
|
-
const messages = await messageController.getMessages();
|
|
161
|
-
|
|
162
|
-
const messagesHtml = messages.length > 0
|
|
163
|
-
? messages.map(msg => `
|
|
164
|
-
<div class="message-item">
|
|
165
|
-
<h4>${msg.name} (${msg.email})</h4>
|
|
166
|
-
<p>${msg.message}</p>
|
|
167
|
-
<small>Fecha: ${msg.created_at}</small>
|
|
168
|
-
</div>
|
|
169
|
-
`).join('')
|
|
170
|
-
: '<p>No hay mensajes aún.</p>';
|
|
171
|
-
|
|
172
|
-
const html = `
|
|
173
|
-
<!DOCTYPE html>
|
|
174
|
-
<html lang="es">
|
|
175
|
-
<head>
|
|
176
|
-
<meta charset="UTF-8">
|
|
177
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
178
|
-
<title>Mensajes - API Frontend Demo</title>
|
|
179
|
-
<link rel="stylesheet" href="/styles.css">
|
|
180
|
-
</head>
|
|
181
|
-
<body>
|
|
182
|
-
<div class="container">
|
|
183
|
-
<header>
|
|
184
|
-
<h1>Mensajes Recibidos</h1>
|
|
185
|
-
<nav>
|
|
186
|
-
<ul>
|
|
187
|
-
<li><a href="/">Inicio</a></li>
|
|
188
|
-
<li><a href="/about">Acerca de</a></li>
|
|
189
|
-
<li><a href="/contact">Contacto</a></li>
|
|
190
|
-
<li><a href="/login">Login</a></li>
|
|
191
|
-
<li><a href="/api/users">Usuarios (API)</a></li>
|
|
192
|
-
</ul>
|
|
193
|
-
</nav>
|
|
194
|
-
</header>
|
|
195
|
-
|
|
196
|
-
<main>
|
|
197
|
-
<section class="messages-section">
|
|
198
|
-
${messagesHtml}
|
|
199
|
-
</section>
|
|
200
|
-
</main>
|
|
201
|
-
|
|
202
|
-
<footer>
|
|
203
|
-
<p>© 2026 JERK JS Framework</p>
|
|
204
|
-
</footer>
|
|
205
|
-
</div>
|
|
206
|
-
<script src="/script.js"></script>
|
|
207
|
-
</body>
|
|
208
|
-
</html>`;
|
|
209
|
-
|
|
210
|
-
res.writeHead(200);
|
|
211
|
-
res.end(html);
|
|
212
|
-
} catch (error) {
|
|
213
|
-
console.error('Error obteniendo mensajes:', error);
|
|
214
|
-
res.writeHead(500);
|
|
215
|
-
res.end('<h1>Error obteniendo mensajes</h1>');
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
};
|
|
219
|
-
|
|
220
|
-
module.exports = authController;
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
const messageController = require('./messageController');
|
|
2
|
-
|
|
3
|
-
const formController = {
|
|
4
|
-
// Procesar el envío del formulario de contacto
|
|
5
|
-
processContactForm: async (req, res) => {
|
|
6
|
-
try {
|
|
7
|
-
// req.body puede ser un string o un objeto, dependiendo de cómo se haya procesado
|
|
8
|
-
let body;
|
|
9
|
-
if (typeof req.body === 'string') {
|
|
10
|
-
body = JSON.parse(req.body);
|
|
11
|
-
} else {
|
|
12
|
-
body = req.body;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
const { name, email, message } = body;
|
|
16
|
-
|
|
17
|
-
// Validar campos
|
|
18
|
-
if (!name || !email || !message) {
|
|
19
|
-
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
20
|
-
res.end(JSON.stringify({
|
|
21
|
-
success: false,
|
|
22
|
-
message: 'Todos los campos son obligatorios'
|
|
23
|
-
}));
|
|
24
|
-
return;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
// Guardar el mensaje en la base de datos
|
|
28
|
-
await messageController.saveMessage(name, email, message);
|
|
29
|
-
|
|
30
|
-
// Responder con éxito
|
|
31
|
-
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
32
|
-
res.end(JSON.stringify({
|
|
33
|
-
success: true,
|
|
34
|
-
message: 'Mensaje enviado exitosamente'
|
|
35
|
-
}));
|
|
36
|
-
} catch (error) {
|
|
37
|
-
console.error('Error procesando formulario:', error);
|
|
38
|
-
res.writeHead(500, { 'Content-Type': 'application/json' });
|
|
39
|
-
res.end(JSON.stringify({
|
|
40
|
-
success: false,
|
|
41
|
-
message: 'Error interno del servidor'
|
|
42
|
-
}));
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
module.exports = formController;
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
const sqlite3 = require('sqlite3').verbose();
|
|
2
|
-
const path = require('path');
|
|
3
|
-
|
|
4
|
-
class MessageController {
|
|
5
|
-
constructor() {
|
|
6
|
-
// Usar una base de datos SQLite en memoria para este ejemplo
|
|
7
|
-
// En una aplicación real, usarías una ruta a un archivo
|
|
8
|
-
this.db = new sqlite3.Database(':memory:');
|
|
9
|
-
this.initDatabase();
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
initDatabase() {
|
|
13
|
-
// Crear tabla de mensajes
|
|
14
|
-
this.db.serialize(() => {
|
|
15
|
-
this.db.run(`
|
|
16
|
-
CREATE TABLE messages (
|
|
17
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
18
|
-
name TEXT NOT NULL,
|
|
19
|
-
email TEXT NOT NULL,
|
|
20
|
-
message TEXT NOT NULL,
|
|
21
|
-
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
22
|
-
)
|
|
23
|
-
`);
|
|
24
|
-
|
|
25
|
-
// Crear tabla de usuarios para login
|
|
26
|
-
this.db.run(`
|
|
27
|
-
CREATE TABLE users (
|
|
28
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
29
|
-
username TEXT UNIQUE NOT NULL,
|
|
30
|
-
password TEXT NOT NULL,
|
|
31
|
-
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
32
|
-
)
|
|
33
|
-
`);
|
|
34
|
-
|
|
35
|
-
// Insertar un usuario de ejemplo para pruebas
|
|
36
|
-
this.db.run("INSERT OR IGNORE INTO users (username, password) VALUES (?, ?)", ['admin', 'password123']);
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
// Guardar un mensaje en la base de datos
|
|
41
|
-
saveMessage(name, email, message) {
|
|
42
|
-
return new Promise((resolve, reject) => {
|
|
43
|
-
const stmt = this.db.prepare("INSERT INTO messages (name, email, message) VALUES (?, ?, ?)");
|
|
44
|
-
stmt.run([name, email, message], function(err) {
|
|
45
|
-
if (err) {
|
|
46
|
-
console.error('Error guardando mensaje:', err);
|
|
47
|
-
reject(err);
|
|
48
|
-
} else {
|
|
49
|
-
console.log(`Mensaje guardado con ID: ${this.lastID}`);
|
|
50
|
-
resolve(this.lastID);
|
|
51
|
-
}
|
|
52
|
-
});
|
|
53
|
-
stmt.finalize();
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
// Obtener todos los mensajes
|
|
58
|
-
getMessages() {
|
|
59
|
-
return new Promise((resolve, reject) => {
|
|
60
|
-
this.db.all("SELECT * FROM messages ORDER BY created_at DESC", [], (err, rows) => {
|
|
61
|
-
if (err) {
|
|
62
|
-
console.error('Error obteniendo mensajes:', err);
|
|
63
|
-
reject(err);
|
|
64
|
-
} else {
|
|
65
|
-
resolve(rows);
|
|
66
|
-
}
|
|
67
|
-
});
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
// Validar credenciales de usuario
|
|
72
|
-
validateUser(username, password) {
|
|
73
|
-
return new Promise((resolve, reject) => {
|
|
74
|
-
this.db.get("SELECT * FROM users WHERE username = ?", [username], (err, row) => {
|
|
75
|
-
if (err) {
|
|
76
|
-
console.error('Error validando usuario:', err);
|
|
77
|
-
reject(err);
|
|
78
|
-
} else if (row && row.password === password) {
|
|
79
|
-
resolve(row);
|
|
80
|
-
} else {
|
|
81
|
-
resolve(null);
|
|
82
|
-
}
|
|
83
|
-
});
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
// Cerrar la base de datos
|
|
88
|
-
close() {
|
|
89
|
-
this.db.close();
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
// Instancia global para compartir la base de datos
|
|
94
|
-
const messageController = new MessageController();
|
|
95
|
-
|
|
96
|
-
module.exports = messageController;
|
|
@@ -1,178 +0,0 @@
|
|
|
1
|
-
const messageController = require('./messageController');
|
|
2
|
-
|
|
3
|
-
const pageController = {
|
|
4
|
-
homePage: (req, res) => {
|
|
5
|
-
const html = `
|
|
6
|
-
<!DOCTYPE html>
|
|
7
|
-
<html lang="es">
|
|
8
|
-
<head>
|
|
9
|
-
<meta charset="UTF-8">
|
|
10
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
11
|
-
<title>Inicio - API Frontend Demo</title>
|
|
12
|
-
<link rel="stylesheet" href="/styles.css">
|
|
13
|
-
</head>
|
|
14
|
-
<body>
|
|
15
|
-
<div class="container">
|
|
16
|
-
<header>
|
|
17
|
-
<h1>Bienvenido a la API Frontend Demo</h1>
|
|
18
|
-
<nav>
|
|
19
|
-
<ul>
|
|
20
|
-
<li><a href="/">Inicio</a></li>
|
|
21
|
-
<li><a href="/about">Acerca de</a></li>
|
|
22
|
-
<li><a href="/contact">Contacto</a></li>
|
|
23
|
-
<li><a href="/login">Login</a></li>
|
|
24
|
-
<li><a href="/api/users">Usuarios (API)</a></li>
|
|
25
|
-
</ul>
|
|
26
|
-
</nav>
|
|
27
|
-
</header>
|
|
28
|
-
|
|
29
|
-
<main>
|
|
30
|
-
<section class="hero">
|
|
31
|
-
<h2>Framework JERK JS</h2>
|
|
32
|
-
<p>Esta es una demostración de cómo el framework puede servir tanto APIs como contenido HTML para frontends.</p>
|
|
33
|
-
<p>El content-type de esta página se establece desde el archivo routes.json.</p>
|
|
34
|
-
</section>
|
|
35
|
-
|
|
36
|
-
<section class="features">
|
|
37
|
-
<h3>Características</h3>
|
|
38
|
-
<ul>
|
|
39
|
-
<li>Soporte para múltiples content-types</li>
|
|
40
|
-
<li>Rutas parametrizadas</li>
|
|
41
|
-
<li>Middleware de seguridad</li>
|
|
42
|
-
<li>CORS configurado</li>
|
|
43
|
-
</ul>
|
|
44
|
-
</section>
|
|
45
|
-
</main>
|
|
46
|
-
|
|
47
|
-
<footer>
|
|
48
|
-
<p>© 2026 JERK JS Framework</p>
|
|
49
|
-
</footer>
|
|
50
|
-
</div>
|
|
51
|
-
<script src="/script.js"></script>
|
|
52
|
-
</body>
|
|
53
|
-
</html>`;
|
|
54
|
-
|
|
55
|
-
res.writeHead(200);
|
|
56
|
-
res.end(html);
|
|
57
|
-
},
|
|
58
|
-
|
|
59
|
-
aboutPage: (req, res) => {
|
|
60
|
-
const html = `
|
|
61
|
-
<!DOCTYPE html>
|
|
62
|
-
<html lang="es">
|
|
63
|
-
<head>
|
|
64
|
-
<meta charset="UTF-8">
|
|
65
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
66
|
-
<title>Acerca de - API Frontend Demo</title>
|
|
67
|
-
<link rel="stylesheet" href="/styles.css">
|
|
68
|
-
</head>
|
|
69
|
-
<body>
|
|
70
|
-
<div class="container">
|
|
71
|
-
<header>
|
|
72
|
-
<h1>Acerca de API Frontend Demo</h1>
|
|
73
|
-
<nav>
|
|
74
|
-
<ul>
|
|
75
|
-
<li><a href="/">Inicio</a></li>
|
|
76
|
-
<li><a href="/about">Acerca de</a></li>
|
|
77
|
-
<li><a href="/contact">Contacto</a></li>
|
|
78
|
-
<li><a href="/login">Login</a></li>
|
|
79
|
-
<li><a href="/api/users">Usuarios (API)</a></li>
|
|
80
|
-
</ul>
|
|
81
|
-
</nav>
|
|
82
|
-
</header>
|
|
83
|
-
|
|
84
|
-
<main>
|
|
85
|
-
<section>
|
|
86
|
-
<h2>Nuestro Framework</h2>
|
|
87
|
-
<p>El Framework JERK JS es una solución completa para construir APIs seguras y escalables.</p>
|
|
88
|
-
|
|
89
|
-
<h3>Capacidades Extendidas</h3>
|
|
90
|
-
<p>Ahora también puede servir contenido HTML y otros tipos de contenido gracias a la nueva funcionalidad de especificación de content-type en routes.json.</p>
|
|
91
|
-
|
|
92
|
-
<h3>Características Técnicas</h3>
|
|
93
|
-
<ul>
|
|
94
|
-
<li>Arquitectura modular</li>
|
|
95
|
-
<li>Sistema de hooks y filtros</li>
|
|
96
|
-
<li>Seguridad avanzada (WAF)</li>
|
|
97
|
-
<li>Soporte para múltiples métodos de autenticación</li>
|
|
98
|
-
<li>Almacenamiento de tokens flexible</li>
|
|
99
|
-
</ul>
|
|
100
|
-
</section>
|
|
101
|
-
</main>
|
|
102
|
-
|
|
103
|
-
<footer>
|
|
104
|
-
<p>© 2026 JERK JS Framework</p>
|
|
105
|
-
</footer>
|
|
106
|
-
</div>
|
|
107
|
-
<script src="/script.js"></script>
|
|
108
|
-
</body>
|
|
109
|
-
</html>`;
|
|
110
|
-
|
|
111
|
-
res.writeHead(200);
|
|
112
|
-
res.end(html);
|
|
113
|
-
},
|
|
114
|
-
|
|
115
|
-
contactPage: (req, res) => {
|
|
116
|
-
const html = `
|
|
117
|
-
<!DOCTYPE html>
|
|
118
|
-
<html lang="es">
|
|
119
|
-
<head>
|
|
120
|
-
<meta charset="UTF-8">
|
|
121
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
122
|
-
<title>Contacto - API Frontend Demo</title>
|
|
123
|
-
<link rel="stylesheet" href="/styles.css">
|
|
124
|
-
</head>
|
|
125
|
-
<body>
|
|
126
|
-
<div class="container">
|
|
127
|
-
<header>
|
|
128
|
-
<h1>Formulario de Contacto</h1>
|
|
129
|
-
<nav>
|
|
130
|
-
<ul>
|
|
131
|
-
<li><a href="/">Inicio</a></li>
|
|
132
|
-
<li><a href="/about">Acerca de</a></li>
|
|
133
|
-
<li><a href="/contact">Contacto</a></li>
|
|
134
|
-
<li><a href="/login">Login</a></li>
|
|
135
|
-
<li><a href="/api/users">Usuarios (API)</a></li>
|
|
136
|
-
</ul>
|
|
137
|
-
</nav>
|
|
138
|
-
</header>
|
|
139
|
-
|
|
140
|
-
<main>
|
|
141
|
-
<section>
|
|
142
|
-
<form id="contactForm">
|
|
143
|
-
<div class="form-group">
|
|
144
|
-
<label for="name">Nombre:</label>
|
|
145
|
-
<input type="text" id="name" name="name" required>
|
|
146
|
-
</div>
|
|
147
|
-
|
|
148
|
-
<div class="form-group">
|
|
149
|
-
<label for="email">Email:</label>
|
|
150
|
-
<input type="email" id="email" name="email" required>
|
|
151
|
-
</div>
|
|
152
|
-
|
|
153
|
-
<div class="form-group">
|
|
154
|
-
<label for="message">Mensaje:</label>
|
|
155
|
-
<textarea id="message" name="message" rows="5" required></textarea>
|
|
156
|
-
</div>
|
|
157
|
-
|
|
158
|
-
<button type="submit">Enviar</button>
|
|
159
|
-
</form>
|
|
160
|
-
|
|
161
|
-
<div id="response"></div>
|
|
162
|
-
</section>
|
|
163
|
-
</main>
|
|
164
|
-
|
|
165
|
-
<footer>
|
|
166
|
-
<p>© 2026 JERK JS Framework</p>
|
|
167
|
-
</footer>
|
|
168
|
-
</div>
|
|
169
|
-
<script src="/script.js"></script>
|
|
170
|
-
</body>
|
|
171
|
-
</html>`;
|
|
172
|
-
|
|
173
|
-
res.writeHead(200);
|
|
174
|
-
res.end(html);
|
|
175
|
-
}
|
|
176
|
-
};
|
|
177
|
-
|
|
178
|
-
module.exports = pageController;
|