commonroutesServer/controllers/userController.js
controllers/userController.jsRaw
1//File: controllers/userController.js
2var mongoose = require('mongoose');
3var userModel = mongoose.model('userModel');
4var notificationModel = mongoose.model('notificationModel');
5var travelModel = mongoose.model('travelModel');
6
7var config = require('../config');
8var pageSize = config.pageSize;
9
10/* */
11var jwt = require('jsonwebtoken'); // used to create, sign, and verify tokens
12var express = require("express");
13var app = express();
14var config = require('../config'); // get our config file
15app.set('superSecret', config.secret); // secret variable
16
17var crypto = require('crypto');
18/* */
19
20var request = require('request');
21
22function getRand(min, max) {
23 min = Math.ceil(min);
24 max = Math.floor(max);
25 return Math.floor(Math.random() * (max - min + 1)) + min; //The maximum is inclusive and the minimum is inclusive
26}
27
28function getAvatar(n) {
29 switch (n) {
30 case 1:
31 avatar = "img/avatars/racoon.png";
32 break;
33 case 2:
34 avatar = "img/avatars/duck.png";
35 break;
36 case 3:
37 avatar = "img/avatars/clown-fish.png";
38 break;
39 case 4:
40 avatar = "img/avatars/tiger.png";
41 break;
42 case 5:
43 avatar = "img/avatars/sloth.png";
44 break;
45 case 6:
46 avatar = "img/avatars/penguin.png";
47 break;
48 case 7:
49 avatar = "img/avatars/owl.png";
50 break;
51 case 8:
52 avatar = "img/avatars/chameleon.png";
53 break;
54 case 9:
55 avatar = "img/avatars/siberian-husky.png";
56 break;
57 case 10:
58 avatar = "img/avatars/toucan.png";
59 break;
60 default:
61 avatar = "img/avatars/racoon.png";
62 }
63 return avatar;
64}
65
66//POST - Insert a new User in the DB
67exports.signup = function(req, res) {
68 //get random avatar
69 var r = getRand(1, 10);
70 randAvatar = getAvatar(r);
71
72
73 var user = new userModel({
74 username: req.body.username,
75 password: crypto.createHash('sha256').update(req.body.password).digest('base64'),
76 description: req.body.description,
77 avatar: randAvatar,
78 email: req.body.email,
79 phone: req.body.phone,
80 telegram: req.body.telegram
81 });
82 if (user.username == undefined) {
83 return res.status(500).jsonp("empty inputs");
84 } else if (user.password == undefined) {
85 return res.status(500).jsonp("empty inputs");
86 } else if (user.email == undefined) {
87 return res.status(500).jsonp("empty inputs");
88 }
89
90 user.save(function(err, user) {
91 if (err) return res.send(500, err.message);
92
93 exports.login(req, res);
94 });
95};
96
97
98//POST - auth user
99exports.login = function(req, res) {
100 // find the user
101 userModel.findOne({
102 username: req.body.username
103 })
104 .select('+password')
105 .exec(function(err, user) {
106
107 if (err) throw err;
108
109 if (!user) {
110 res.json({
111 success: false,
112 message: 'Authentication failed. User not found.'
113 });
114 } else if (user) {
115
116 req.body.password = crypto.createHash('sha256').update(req.body.password).digest('base64');
117
118 // check if password matches
119 if (user.password != req.body.password) {
120 res.json({
121 success: false,
122 message: 'Authentication failed. Wrong password.'
123 });
124 } else {
125
126 // if user is found and password is right
127 // create a token
128 var token = jwt.sign({
129 foo: 'bar'
130 }, app.get('superSecret'), {
131 //expiresInMinutes: 1440 // expires in 24 hours
132 //expiresIn: '60m'
133 });
134 user.token = token;
135 user.save(function(err, user) {
136 if (err) return res.send(500, err.message);
137 //res.status(200).jsonp(travel);
138 console.log(user);
139 // return the information including token as JSON
140 user.password = "";
141 res.json({
142 success: true,
143 message: 'Enjoy your token!',
144 token: token,
145 user: user
146 });
147 });
148
149 }
150
151 }
152
153 });
154};
155
156//GET - Return all Users in the DB
157exports.getAllUsers = function(req, res) {
158 userModel.find()
159 .limit(pageSize)
160 .skip(pageSize * Number(req.query.page))
161 .exec(function(err, users) {
162 if (err) return res.send(500, err.message);
163 res.status(200).jsonp(users);
164 });
165};
166
167exports.getUserById = function(req, res) {
168 userModel.findOne({
169 _id: req.params.userid
170 })
171 .lean()
172 .populate('validatedBy', 'username')
173 .populate('travels', 'title from to date type')
174 .exec(function(err, user) {
175 if (err) return res.send(500, err.message);
176 if (!user) {
177 res.json({
178 success: false,
179 message: 'User not found.'
180 });
181 } else if (user) {
182 res.status(200).jsonp(user);
183 }
184 });
185};
186exports.getUserByToken = function(req, res) {
187 userModel.findOne({
188 'token': req.headers['x-access-token']
189 })
190 .lean()
191 .populate('travels', 'title from to date')
192 .exec(function(err, user) {
193 if (err) return res.send(500, err.message);
194 if (!user) {
195 res.json({
196 success: false,
197 message: 'User not found.'
198 });
199 } else if (user) {
200
201 res.status(200).jsonp(user);
202 }
203 });
204};
205
206exports.getTravelsByUserId = function(req, res) {
207 travelModel.find({
208 user: req.params.userid
209 })
210 .lean()
211 .exec(function(err, travels) {
212 if (err) return res.send(500, err.message);
213 travelModel.find({
214 joins: req.params.userid
215 })
216 .lean()
217 .exec(function(err, joins) {
218 if (err) return res.send(500, err.message);
219 res.json({
220 travels: travels,
221 joins: joins
222 });
223 });
224 });
225};
226exports.getUserLikes = function(req, res) {
227 userModel.findOne({
228 _id: req.params.userid
229 })
230 .lean()
231 .populate('likes', 'username avatar description')
232 .exec(function(err, user) {
233 if (err) return res.send(500, err.message);
234 if (!user) {
235 res.json({
236 success: false,
237 message: 'User not found.'
238 });
239 } else if (user) {
240 res.status(200).jsonp(user.likes);
241 }
242 });
243};
244exports.getNumNotificationsByToken = function(req, res) {
245 userModel.findOne({
246 'token': req.headers['x-access-token']
247 })
248 .lean()
249 .exec(function(err, user) {
250 if (err) return res.send(500, err.message);
251 if (!user) {
252 res.json({
253 success: false,
254 message: 'User not found.'
255 });
256 } else if (user) {
257
258 res.status(200).jsonp(user.notifications);
259 }
260 });
261};
262exports.getNotifications = function(req, res) {
263 userModel.findOne({
264 'token': req.headers['x-access-token']
265 })
266 .lean()
267 .populate('notifications')
268 .exec(function(err, user) {
269 if (err) return res.send(500, err.message);
270 if (!user) {
271 res.json({
272 success: false,
273 message: 'User not found.'
274 });
275 } else if (user) {
276
277 notificationModel.find({
278 'user': user._id,
279 'state': 'pendent'
280 })
281 .lean()
282 .exec(function(err, notifications) {
283 if (err) return res.send(500, err.message);
284 if (!notifications) {
285 res.json({
286 success: false,
287 message: 'No pendent notifications.'
288 });
289 } else if (notifications) {
290 //here, maybe in the future is better delete the viewed notifications
291 notificationModel.update({
292 state: "pendent"
293 }, {
294 state: "viewed"
295 }, {
296 multi: true
297 },
298 function(err) {
299 if (err) {
300 console.log(err);
301 }
302 }
303 );
304 res.status(200).jsonp(notifications);
305 }
306 });
307
308 //now, clean notifications count from user
309 userModel.update({
310 'token': req.headers['x-access-token']
311 }, {
312 notifications: []
313 },
314 function(err) {
315 if (err) {
316 console.log(err);
317 }
318 }
319 );
320 }
321 });
322};
323
324function getRandomInt(min, max) {
325 min = Math.ceil(min);
326 max = Math.floor(max);
327 return Math.floor(Math.random() * (max - min)) + min; //The maximum is exclusive and the minimum is inclusive
328}
329
330function postImage(req, res, filename, fileImg) {
331 url = "http://127.0.0.1:3050/image";
332 var importFile = function(fileImg) {
333 var decodedFile = new Buffer(fileImg, 'base64');
334 var r = request.post(url, function(err, httpResponse, body) {
335 if (err) {
336 console.log(err);
337 }
338 //console.log(body);
339 updateUserWithNewImages(req, res, body);
340 });
341 var form = r.form();
342 form.append('file', decodedFile, {
343 filename: filename + '.png'
344 });
345 }
346 importFile(fileImg);
347}
348
349function updateUserWithNewImages(req, res, imgUrl) {
350 //adding random number to the url, to force ionic reload the image
351 req.body.avatar = imgUrl + "?" + getRandomInt(1, 9999);
352 userModel.update({
353 'token': req.headers['x-access-token']
354 }, req.body,
355 function(err) {
356 if (err) return console.log(err);
357 exports.getUserByToken(req, res);
358 });
359}
360exports.updateUser = function(req, res) {
361 if (req.body.newAvatar) {
362 urlImg = postImage(req, res, "avatar_" + req.body.username, req.body.newAvatar);
363 }
364 /*if (req.body.newFaircoin) {
365 urlImg = postImage(req, res, "fairdir_"+req.body.username,req.body.newFaircoin);
366 }*/
367 if (!req.body.newAvatar) {
368 updateUserWithNewImages(req, res, req.body.avatar);
369 }
370 /*userModel.update({
371 'token': req.headers['x-access-token']
372 }, req.body,
373 function(err) {
374 if (err) return console.log(err);
375 exports.getUserByToken(req, res);
376 });*/
377};
378
379//DELETE - Delete a user with specified ID
380exports.deleteUser = function(req, res) {
381 userModel.findOne({
382 'token': req.headers['x-access-token']
383 })
384 .exec(function(err, user) {
385 user.remove(function(err) {
386 if (err) return res.send(500, err.message);
387 res.status(200).jsonp("deleted");
388 })
389 });
390};
391exports.likeUser = function(req, res) {
392 userModel.findOne({
393 'token': req.headers['x-access-token']
394 })
395 .exec(function(err, userL) {
396 if (err) return res.send(500, err.message);
397 if (!userL) {
398 res.json({
399 success: false,
400 message: 'no user with that token, login again'
401 });
402 } else if (userL) {
403
404 userModel.findOne({
405 _id: req.params.userid,
406 likes: {
407 '$ne': userL._id
408 }
409 })
410 .exec(function(err, user) {
411 if (err) return res.send(500, err.message);
412 if (!user) {
413 res.json({
414 success: false,
415 message: 'Like not posible, user not exist, or like was already done'
416 });
417 } else if (user) {
418 //res.status(200).jsonp(user);
419 var notification = new notificationModel({
420 concept: "like",
421 message: "user " + userL.username + " adds a like to you",
422 date: new Date(),
423 icon: 'ion-heart',
424 link: "users/" + user._id,
425 user: user._id
426 });
427 notification.save(function(err, notification) {
428 if (err) return res.send(500, err.message);
429
430 user.likes.push(userL._id);
431 user.notifications.push(notification._id);
432 user.save(function(err, user) {
433 if (err) return res.send(500, err.message);
434
435 exports.getUserById(req, res);
436 });
437 });
438
439 } //end of else if user
440 });
441 } //end of else if userL
442 });
443};
444exports.unlikeUser = function(req, res) {
445 userModel.findOne({
446 'token': req.headers['x-access-token']
447 })
448 .exec(function(err, userL) {
449 if (err) return res.send(500, err.message);
450 if (!userL) {
451 res.json({
452 success: false,
453 message: 'no user with that token, login again'
454 });
455 } else if (userL) {
456
457 userModel.findOne({
458 _id: req.params.userid,
459 likes: userL._id
460 })
461 .exec(function(err, user) {
462 if (err) return res.send(500, err.message);
463 if (!user) {
464 res.json({
465 success: false,
466 message: 'Unlike not posible'
467 });
468 } else if (user) {
469 //res.status(200).jsonp(user);
470 var notification = new notificationModel({
471 concept: "like",
472 message: "user " + userL.username + " removes like on you",
473 date: new Date(),
474 icon: 'ion-heart-broken',
475 link: "users/" + user._id,
476 user: user._id
477 });
478 notification.save(function(err, notification) {
479 if (err) return res.send(500, err.message);
480
481 var indexOf = user.likes.indexOf(userL._id);
482 user.likes.splice(indexOf, 1);
483 user.notifications.push(notification._id);
484 user.save(function(err, user) {
485 if (err) return res.send(500, err.message);
486
487 exports.getUserById(req, res);
488 });
489 });
490
491 } //end of else if user
492 });
493 } //end of else if userL
494 });
495};
496/* fav */
497exports.addFav = function(req, res) {
498 var tokenuser;
499 userModel.find({
500 token: req.headers['x-access-token']
501 }, function(err, users) {
502 tokenuser = users[0];
503 });
504 userModel.findById(req.params.userId, function(err, user) {
505
506 // first search if user have already said like
507 var favRepeated = false;
508 for (var i = 0; i < user.favs.length; i++) {
509 if (user.favs[i].username == tokenuser.username) {
510 favRepeated = true;
511 }
512 }
513 console.log("favRepeated: " + favRepeated);
514 if (favRepeated == false) {
515 //fav
516 var fav = {
517 userId: tokenuser._id,
518 username: tokenuser.username,
519 avatar: tokenuser.avatar
520 };
521 user.favs.push(fav);
522
523 //notification
524 var notification = {
525 concept: "like",
526 otherusername: tokenuser.username,
527 description: "user " + tokenuser.username + " favs you",
528 date: new Date(),
529 link: "",
530 user: user._id
531 };
532 user.notifications.push(notification);
533
534 user.save(function(err, user) {
535 if (err) return res.send(500, err.message);
536
537
538 //once saved, send the users json to client
539 userModel.find(function(err, users) {
540 if (err) res.send(500, err.message);
541 res.status(200).jsonp(users);
542 });
543 });
544 } else {
545 userModel.find(function(err, users) {
546 if (err) res.send(500, err.message);
547 res.status(200).jsonp(users);
548 });
549 }
550
551 });
552};
553exports.doUnfav = function(req, res) {
554 var tokenuser;
555 userModel.find({
556 token: req.headers['x-access-token']
557 }, function(err, users) {
558 tokenuser = users[0];
559 });
560
561 userModel.findById(req.params.userId, function(err, user) {
562 for (var i = 0; i < user.favs.length; i++) {
563 if (user.favs[i].username == tokenuser.username) {
564 user.favs.splice(i, 1);
565 }
566 }
567
568 user.save(function(err, travel) {
569 if (err) return res.send(500, err.message);
570 //res.status(200).jsonp(travel);
571 userModel.find(function(err, users) {
572 if (err) res.send(500, err.message);
573 res.status(200).jsonp(users);
574 });
575 });
576 });
577};
578exports.changePassword = function(req, res) {
579 console.log(req.body);
580 userModel.findOne({
581 'token': req.headers['x-access-token'],
582 'password': crypto.createHash('sha256').update(req.body.old).digest('base64')
583 })
584 .exec(function(err, user) {
585 if (err) return res.send(500, err.message);
586 if (!user) {
587 res.json({
588 success: false,
589 message: 'User not found.'
590 });
591 } else if (user) {
592 if (req.body.new1 != req.body.new2) {
593 res.json({
594 success: false,
595 message: 'New passwords not match'
596 });
597 }else{
598 user.password = crypto.createHash('sha256').update(req.body.new1).digest('base64');
599 user.save(function(err, user) {
600 if (err) return res.send(500, err.message);
601
602 exports.getUserByToken(req, res);
603 });
604 }
605 }
606 });
607};