forked from codeismo/nodejs-telmexhub
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathservidor.js
425 lines (342 loc) · 11.6 KB
/
servidor.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
//IMPORTAMOS LA DEPENDENCIA EXPRESS QUE PREVIAMENTE INSTALAMOS
//USANDO NPM
var express = require("express");
var nunjucks = require("nunjucks");
var expressSession = require("express-session");
var sesion = expressSession({
//secret lo usa el servidor para genera un valor aleatoriao que asigna
//a la cookie de sesion
secret : "lkjsfffs",
// este parametro es el nombre de la cookie de session
key : "sesionServidor",
//son para que cree siempre una sesion nueva para el usuario
resave : true,
saveUninitialized : true,
//configuramos el tiempo de la cookie de sesion
cookie : {
//max Age es el tiempo que dura la sesion de un usuario (milisegundos)
//la cookie de sesion dura 30 dias!!!
maxAge : 1000 * 60 * 60 * 24 * 20
}
});
//en la version 3 EXPRESS el body-parser TIENE UN PROBLEMA DE SEGURIDAD
//NUNCA USEN EN LA VERSION 3 DE EXPRESS BODY PARSER
//TRABAJAMOS EN LA VERSION 4 DE EXPRESS
var bodyParser = require("body-parser");
//---- REQUERIMOS NUESTROS MODULOS
var modelos = require("./modelos/principal.js");
console.log("PRUEBA:" + modelos.PRUEBA);
//INVOCAMOS A LA FUNCION DE EXPRESS PARA CREAR UN SERVIDOR WEB
var app = express();
//asignamos la sesion al servidor de express
app.use(sesion);
//HABILITAMOS LOS PARAMETROS DEL TIPO POST para express
app.use(bodyParser.urlencoded({
//extended es para habilitar el parser para objetos JSON
extended : false
}));
//----------- CONFIGURAMOS NUNJUCKS -----------------
// (sistema de templates)
//__dirname = CONTIENE LA RUTA ACUTAL EN LA QUE SE ENCUENTRA ESTE
//ARCHIVO
nunjucks.configure(__dirname + "/vistas", {
//le asignamos el servidor de express
express : app
});
//LEVANTAMOS AL SERVIDOR EN EL PUERTO 8080
app.listen(8080);
//----------- AGREGREGAR LA LOGICA PARA LOS MIDDLEWARES DE EXPRESS --------
//este middleware valida que un usuario sea dueno de un articulo en particular
function validarPertenenciaArticulo(req, res, siguienteFuncion) {
//accedemos al id del articulo que quieren editar
//yo espero que el id venga como un parametro de la ruta dinamica
var articuloId = req.params.articuloId;
//si dentro de la ruta NO VIENE EL PARAMETRO ID DEL ARTICULO
//SIGNIFICA QUE ESTE MIDDLEWARE LO ESTA USANDO UN METODO POST
if ( typeof articuloId === "undefined") {
//el metodo post que usamos para guardar un articulo,
//envia el id del articulo en una peticion post
//(viene req.body)
articuloId = req.body.id;
console.log("tomamos el id del post:" + articuloId);
}
//buscamos el articulo que quieren editar
modelos.Articulo.find({
where : {
id : articuloId
},
//del articulo obtenemos tambien el usuario dueno
include : [{
model : modelos.Usuario,
as : "usuario"
}]
}).success(function(articulo) {
//checamos si este articulo su usuario es el mismo que el usuario
//que esta logeado
if (articulo.usuario.id === req.session.usuarioLogeado.id) {
//si el usuario tiene permisos lo dejamos pasar
siguienteFuncion();
} else {
//SI EL USUARIO NO TIENE PERMISOS, NO LO DEJAMOS PASAR
res.send("NO TIENES PERMISOS PARA EDITAR EL ARTICULO:" + articulo.id);
}
});
}
//req = request
//res == response
//el tercer argumento es la siguiente funcio en el stack de middlewares
function validarSesion(req, res, siguienteFuncion) {
//keyword es de javascript y de hecho les sirve para javascript
//del lado web como del lado de node.js
//SIRVE PARA MARCAR BREAKPOINTS
debugger;
console.log("validando sesion del usuario");
//protegemos rutas checando si existe en la sesion el objeto
//usuarioLogeado
//tenemos que usar un keyword de javscript que se llama typeof
if ( typeof req.session.usuarioLogeado === "undefined") {
//SI EL USUARIO NO SE A LOGEADO NO LO DEJAMOS PASAR
//Y LO REENVIAMOS A /login
res.redirect("/login");
} else {
//SI YA ESTA LOGEADO
siguienteFuncion();
}
}
//DEFINIR RUTAS PARA MI PROYECTO WEB
// localhost:8080/articulo/NUMERO
// [0-9]+ = ES UN EXPR REGULAR QUE HACE MATCH DE NUMEROS ENTEROS
// CACHA RUTAS DE LA FORMA localhost:8080/articulo/1
app.get("/articulo/:articuloId([0-9]+)", function(req, res) {
// req = REQUEST DE LA PETICION WEB
// res = RESPONSE DE LA PETCION WEB
//req.params = ME DA ACCESO A LAS EXPRESIONES QUE VENGAN EN UNA RUTA
//DINAMICA (expresiones regulares)
var articuloId = req.params.articuloId;
//EN ESTA FUNCION SE EJECUTA TODO EL CODIGO
//PARA LA RUTA localhost:8080/inicio
//res.send("hola!");
//HACEMOS LA CONSULTA PARA BUSCAR EL PRIMER RENGLON
//buscamos el renglon cuyo id sea 1
modelos.Articulo.find({
where : {
id : articuloId
},
include : [{
model : modelos.Comentario,
as : "comentarios"
}, {
model : modelos.Categoria,
as : "categorias"
}, {
model : modelos.Usuario,
as : "usuario"
}]
}).success(function(articulo) {
//SI NO ENCUENTRA NADA articulo == null
//este metodo se ejecuta cuando encuentra algo
//console.log("se encontro articulo:" + articulo.titulo);
res.render("articulo.html", {
//asigno el objeto articulo a la propiedad:
articuloPrincipal : articulo
});
});
});
//-------- SOLUCIOON EJERCCIO MAPEOS
app.get("/usuario", function(req, res) {
modelos.Usuario.find({
where : {
id : 2
},
//
include : [{
model : modelos.Articulo,
//el parametro as debe de ser igual al del parametro
//as que usaron en principal.js
as : "articulos"
}, {
model : modelos.DatosUsuario,
as : "datosUsuario"
}]
}).success(function(usuario) {
//la variable usuario ya tiene los articulos de ese USUARIO
//por medio de usuario.articulos
res.render("usuario.html", {
usuario : usuario
});
});
});
//ESCUCHA LA PETICION A LA RUTA
//localhost:8080/informes
app.get("/informes", function(req, res) {
res.send("informes aqui!");
});
//--- SOLUCION EJERCCIIO FIND Y FINDALL ----
// localhost:8080/blog?offset=3
app.get("/blog", function(req, res) {
//req.query == LES DA ACCESO A TODOS LOS PARAMETROS
//QUE VIENEN EN EL QUERY STRING
//si no se pone el query string de offset
//toma el valor de 0
var offset = req.query.offset;
//COMO IMPLEMENTAR UN PAGINADOR jquery
modelos.Articulo.findAll({
limit : 3,
offset : offset
}).success(function(articulos) {
//articulos == son los renglones que encontro el metodo
//findAll
modelos.Categoria.findAll().success(function(categorias) {
//aqui ya tengo todas las categorias
//tambien ya tengo todos articulos
//HACER CONSULTA A TODAS LAS CATEGORIAS, Y EN CALLBACK
//HACER EL RENDER
res.render("blog.html", {
//articulos encontrados se los pasamos a la vista
articulos : articulos,
categorias : categorias
});
});
});
});
//ARMANDO NUESTRO EDITOR DE ARTICULOS
app.get("/articulo/:articuloId([0-9]+)/editar", validarSesion, validarPertenenciaArticulo, function(req, res) {
console.log("entrando a ruta editar articulo");
//recibimos el parametro para editar el articulo
var articuloId = req.params.articuloId;
//note que la bandera actualizado del query string
//solo viene si guardaron previamente un dato
var actualizado = req.query.actualizado;
modelos.Articulo.find(articuloId).success(function(articulo) {
res.render("articulo_editar.html", {
articulo : articulo,
actualizado : actualizado
});
});
});
//en el formulario enviamos los datos como una peticion http-post
//VALIDAMOS QUE LA SESION EXISTA TAMBIEN PARA ESTA PETICION POST
//QUE ES PARA GUARDAR UN ARTICULO
app.post("/guardar-articulo", validarSesion, validarPertenenciaArticulo, function(req, res) {
//req.params = parametros en las rutas
//req.query = parametros en forma de query string
var id = req.body.id;
var titulo = req.body.titulo;
var contenido = req.body.contenido;
var usuario_id = req.body.usuario_id;
var manejadorErrores = function() {
//este codigo se ejecuta cuando hay un error al guardar este articulo
//puede ocurrir un error al romper un constraint de la base o cuando
//hay un error de validacion
//JSON.stringify nos muestra una represetnacion en forma de cadena
//de un objeto de javascripts
console.log(JSON.stringify(errores));
res.render("articulo_editar.html", {
//le pasamos los parametro que queriamos guardar
//originalmente
articulo : {
id : id,
titulo : titulo,
contenido : contenido,
},
//le pasamos la lista de errores
errores : errores
});
};
console.log("id articulo a guardar:" + id);
//QUE TENDRIAN QUE CAMBIAR EN ESTE CODIGO
//SABIENDO QUE YA FUCNION crearOActualizar
//PARA SUSTITUIR EL SIGUIENTE BLOQUE IF
if (id === "") {
console.log("se va crear un nuevo articulo");
//aqui va la logica para crear un nuevo articulo
//create es para crear un nuevo renglon en la base
//save lo usan para actualizar un renglo que YA EXISTE
modelos.Articulo.create({
//id:20,
titulo : titulo,
contenido : contenido,
fecha_creacion : new Date(),
usuario_id : 1
}).success(function(articuloNuevo) {
//articuloNuevo tiene el nuevo renglon que crearon
//VOLVEMOS A UTILIZAR EL PATRON POST-REDIRECT-RESPONSE
var url = "/articulo/" + articuloNuevo.id + "/editar?actualizado=true";
res.redirect(url);
}).error(manejadorErrores);
} else {
//id no viene vacio (es decir trae un numero)
//aqui va la logica para actualizar
modelos.Articulo.find(id).success(function(articulo) {
//encontramos el articulo que vamos actualizar
//sobreescribimos el titulo del articulo en la base
//por el nuevo titulo que me paso el usuario
articulo.titulo = titulo;
articulo.contenido = contenido;
//save actualiza los cambios para este renglon de la tabla
//que encontramos
articulo.save().success(function() {
//aqui ya se guardaron los cambios en la base
//res.send("cambios guardadoss");
//PATRON POST/REDIRECT/GET
//le decimos al nav del usuaario que haga un http-redirect
//a la ruta http://localhost:8080/articulo/ID_ESTE_ARTICULO/editar
var url = "/articulo/" + articulo.id + "/editar?actualizado=true";
//HTTP-REDIRECT EN EXPRESS SE HACE con:
res.redirect(url);
}).error(manejadorErrores);
});
}
});
//ESTA RUTA ES PARA CREAR NUEVOS ARTICULOS
app.get("/articulo/crear", validarSesion, function(req, res) {
res.render("articulo_editar.html");
});
//localhost:8080/articulo/NUMERO/destruir destruye ese articulo
app.get("/articulo/:articuloId([0-9]+)/destruir", function(req, res) {
var articuloId = req.params.articuloId;
//buscamos el articulo a destruir
modelos.Articulo.find(articuloId).success(function(articulo) {
//obtener todos los comentarios del articulo
//y aplicar el metodo destroy en esos comentarios
// ahora si destruimos el articulo
//ubicado el articulo lo destruimos
articulo.destroy().success(function() {
//una vea que destruyo el renglon se ejecuta
//esta funcion
res.send("articulo " + articuloId + " fue destruido");
});
});
});
//=-------------- INICIA LOGICA PARA EL LOGIN ---------------
app.get("/login", function(req, res) {
res.render("login.html");
});
app.post("/autentificar", function(req, res) {
//recuerden que los parametros del post los toman del body
var email = req.body.email;
var password = req.body.password;
modelos.Usuario.find({
where : {
//LO SIGUIENTE ES EQUIVALENTE HACER UNA OPERACION SQL CON UN WHERE Y UN AND
email : email,
password : password
}
}).success(function(usuarioEncontrado) {
//el usuario con ese password y ese email NO EXISTEN!!
if (usuarioEncontrado === null) {
//si no existe el usuario le mostramos otra la vista de login.html
res.render("login.html", {
error : true
});
} else {
//ese usuario si existe
//CREAMOS UNA SESION EN EL SERVIDOR
req.session.usuarioLogeado = {
id : usuarioEncontrado.id,
email : usuarioEncontrado.email
};
res.send("usuario logeado correctamente!!");
}
});
});