commonroutesServer/controllers/userController.js
controllers/userController.jsRaw
1var config = require('../config');
2var jwt = require('jsonwebtoken'); // used to create, sign, and verify tokens
3var crypto = require('crypto');
4var request = require('request');
5var express = require("express");
6var app = express();
7app.set('superSecret', config.secret); // secret variable
8
9var pageSize = config.pageSize;
10
11//import data models
12var mongoose = require('mongoose');
13var userModel = mongoose.model('userModel');
14var notificationModel = mongoose.model('notificationModel');
15var travelModel = mongoose.model('travelModel');
16
17function getRand(min, max) {//inclusive
18 min = Math.ceil(min);
19 max = Math.floor(max);
20 return Math.floor(Math.random() * (max - min + 1)) + min;
21}
22function getRandomInt(min, max) {//the maximum is exclusive and the minimum is inclusive
23 min = Math.ceil(min);
24 max = Math.floor(max);
25 return Math.floor(Math.random() * (max - min)) + min;
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 console.log(req.body);
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 localNode: req.body.localNode
82 });
83 if (user.username == undefined) {
84 return res.status(500).jsonp("empty inputs");
85 } else if (user.password == undefined) {
86 return res.status(500).jsonp("empty inputs");
87 } else if (user.email == undefined) {
88 return res.status(500).jsonp("empty inputs");
89 }
90
91 user.save(function(err, user) {
92 if (err) return res.send(500, err.message);
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 // return the information including token as JSON
138 user.password = "";
139 res.json({
140 success: true,
141 message: 'Enjoy your token!',
142 token: token,
143 user: user
144 });
145 });
146
147 }
148
149 }
150
151 });
152};
153
154//GET - Return all Users in the DB
155exports.getAllUsers = function(req, res) {
156 userModel.find()
157 .limit(pageSize)
158 .skip(pageSize * Number(req.query.page))
159 .exec(function(err, users) {
160 if (err) return res.send(500, err.message);
161 res.status(200).jsonp(users);
162 });
163};
164
165exports.getUserById = function(req, res) {
166 userModel.findOne({
167 _id: req.params.userid
168 })
169 .lean()
170 .populate('validatedBy', 'username')
171 .populate('travels', 'title from to date type')
172 .exec(function(err, user) {
173 if (err) return res.send(500, err.message);
174 if (!user) {
175 res.json({
176 success: false,
177 message: 'User not found.'
178 });
179 } else if (user) {
180 res.status(200).jsonp(user);
181 }
182 });
183};
184
185exports.getUserByToken = function(req, res) {
186 userModel.findOne({
187 'token': req.headers['x-access-token']
188 })
189 .lean()
190 .populate('travels', 'title from to date')
191 .exec(function(err, user) {
192 if (err) return res.send(500, err.message);
193 if (!user) {
194 res.json({
195 success: false,
196 message: 'User not found.'
197 });
198 } else if (user) {
199
200 res.status(200).jsonp(user);
201 }
202 });
203};
204
205exports.getTravelsByUserId = function(req, res) {
206 travelModel.find({
207 user: req.params.userid
208 })
209 .lean()
210 .exec(function(err, travels) {
211 if (err) return res.send(500, err.message);
212 travelModel.find({
213 joins: req.params.userid
214 })
215 .lean()
216 .exec(function(err, joins) {
217 if (err) return res.send(500, err.message);
218 res.json({
219 travels: travels,
220 joins: joins
221 });
222 });
223 });
224};
225exports.getUserLikes = function(req, res) {
226 userModel.findOne({
227 _id: req.params.userid
228 })
229 .lean()
230 .populate('likes', 'username avatar description')
231 .exec(function(err, user) {
232 if (err) return res.send(500, err.message);
233 if (!user) {
234 res.json({
235 success: false,
236 message: 'User not found.'
237 });
238 } else if (user) {
239 res.status(200).jsonp(user.likes);
240 }
241 });
242};
243exports.getNumNotificationsByToken = function(req, res) {
244 userModel.findOne({
245 'token': req.headers['x-access-token']
246 })
247 .lean()
248 .exec(function(err, user) {
249 if (err) return res.send(500, err.message);
250 if (!user) {
251 res.json({
252 success: false,
253 message: 'User not found.'
254 });
255 } else if (user) {
256 res.status(200).jsonp(user.notifications);
257 }
258 });
259};
260exports.getNotifications = function(req, res) {
261 userModel.findOne({
262 'token': req.headers['x-access-token']
263 })
264 .lean()
265 .populate('notifications')
266 .exec(function(err, user) {
267 if (err) return res.send(500, err.message);
268 if (!user) {
269 res.json({
270 success: false,
271 message: 'User not found.'
272 });
273 } else if (user) {
274 notificationModel.find({
275 'user': user._id,
276 'state': 'pendent'
277 })
278 .lean()
279 .exec(function(err, notifications) {
280 if (err) return res.send(500, err.message);
281 if (!notifications) {
282 res.json({
283 success: false,
284 message: 'No pendent notifications.'
285 });
286 } else if (notifications) {
287 //here, maybe in the future is better delete the viewed notifications, for the moment let's keep in the database
288 notificationModel.update({
289 state: "pendent"
290 }, {
291 state: "viewed"
292 }, {
293 multi: true
294 },
295 function(err) {
296 if (err) {
297 console.log(err);
298 }
299 }
300 );
301 res.status(200).jsonp(notifications);
302 }
303 });
304
305 //now, clean notifications count from user
306 userModel.update({
307 'token': req.headers['x-access-token']
308 }, {
309 notifications: []
310 },
311 function(err) {
312 if (err) {
313 console.log(err);
314 }
315 }
316 );
317 }
318 });
319};
320
321function postImage(req, res, filename, fileImg) {
322 url = "http://127.0.0.1:3001/image";
323 var importFile = function(fileImg) {
324 var decodedFile = new Buffer(fileImg, 'base64');
325 var r = request.post(url, function(err, httpResponse, body) {
326 if (err) {
327 console.log(err);
328 }
329 //console.log(body);
330 updateUserWithNewImages(req, res, body);
331 });
332 var form = r.form();
333 form.append('file', decodedFile, {
334 filename: filename + '.png'
335 });
336 }
337 importFile(fileImg);
338}
339
340function updateUserWithNewImages(req, res, imgUrl) {
341 //adding random number to the url, to force ionic reload the image
342 req.body.avatar = imgUrl + "?" + getRandomInt(1, 9999);
343 userModel.update({
344 'token': req.headers['x-access-token']
345 }, req.body,
346 function(err) {
347 if (err) return console.log(err);
348 exports.getUserByToken(req, res);
349 });
350}
351exports.updateUser = function(req, res) {
352 if (req.body.newAvatar) {
353 urlImg = postImage(req, res, "avatar_" + req.body.username, req.body.newAvatar);
354 }
355 if (!req.body.newAvatar) {
356 updateUserWithNewImages(req, res, req.body.avatar);
357 }
358};
359
360//DELETE - Delete a user with specified ID
361exports.deleteUser = function(req, res) {
362 userModel.findOne({
363 'token': req.headers['x-access-token']
364 })
365 .exec(function(err, user) {
366 user.remove(function(err) {
367 if (err) return res.send(500, err.message);
368 res.status(200).jsonp("deleted");
369 })
370 });
371};
372exports.likeUser = function(req, res) {
373 userModel.findOne({
374 'token': req.headers['x-access-token']
375 })
376 .exec(function(err, userL) {//userL is the user that is performing the like
377 if (err) return res.send(500, err.message);
378 if (!userL) {
379 res.json({
380 success: false,
381 message: 'no user with that token, login again'
382 });
383 } else if (userL) {
384 userModel.findOne({
385 _id: req.params.userid,
386 likes: {
387 '$ne': userL._id
388 }
389 })
390 .exec(function(err, user) {
391 if (err) return res.send(500, err.message);
392 if (!user) {
393 res.json({
394 success: false,
395 message: 'Like not posible, user not exist, or like was already done'
396 });
397 } else if (user) {
398 var notification = new notificationModel({
399 concept: "like",
400 message: "user " + userL.username + " adds a like to you",
401 date: new Date(),
402 icon: 'ion-heart',
403 link: "users/" + user._id,
404 user: user._id
405 });
406 notification.save(function(err, notification) {
407 if (err) return res.send(500, err.message);
408
409 user.likes.push(userL._id);
410 user.notifications.push(notification._id);
411 user.save(function(err, user) {
412 if (err) return res.send(500, err.message);
413
414 exports.getUserById(req, res);
415 });
416 });
417
418 } //end of else if user
419 });
420 } //end of else if userL
421 });
422};
423exports.unlikeUser = function(req, res) {
424 userModel.findOne({
425 'token': req.headers['x-access-token']
426 })
427 .exec(function(err, userL) {//userL is the user that is performing the unlike
428 if (err) return res.send(500, err.message);
429 if (!userL) {
430 res.json({
431 success: false,
432 message: 'no user with that token, login again'
433 });
434 } else if (userL) {
435 userModel.findOne({
436 _id: req.params.userid,
437 likes: userL._id
438 })
439 .exec(function(err, user) {
440 if (err) return res.send(500, err.message);
441 if (!user) {
442 res.json({
443 success: false,
444 message: 'Unlike not posible'
445 });
446 } else if (user) {
447 var notification = new notificationModel({
448 concept: "like",
449 message: "user " + userL.username + " removes like on you",
450 date: new Date(),
451 icon: 'ion-heart-broken',
452 link: "users/" + user._id,
453 user: user._id
454 });
455 notification.save(function(err, notification) {
456 if (err) return res.send(500, err.message);
457
458 var indexOf = user.likes.indexOf(userL._id);
459 user.likes.splice(indexOf, 1);
460 user.notifications.push(notification._id);
461 user.save(function(err, user) {
462 if (err) return res.send(500, err.message);
463
464 exports.getUserById(req, res);
465 });
466 });
467
468 } //end of else if user
469 });
470 } //end of else if userL
471 });
472};
473
474//currently not used
475exports.addFav = function(req, res) {
476 var tokenuser;
477 userModel.find({
478 token: req.headers['x-access-token']
479 }, function(err, users) {
480 tokenuser = users[0];
481 });
482 userModel.findById(req.params.userId, function(err, user) {
483
484 // first search if user have already said like
485 var favRepeated = false;
486 for (var i = 0; i < user.favs.length; i++) {
487 if (user.favs[i].username == tokenuser.username) {
488 favRepeated = true;
489 }
490 }
491 console.log("favRepeated: " + favRepeated);
492 if (favRepeated == false) {
493 //fav
494 var fav = {
495 userId: tokenuser._id,
496 username: tokenuser.username,
497 avatar: tokenuser.avatar
498 };
499 user.favs.push(fav);
500
501 //notification
502 var notification = {
503 concept: "like",
504 otherusername: tokenuser.username,
505 description: "user " + tokenuser.username + " favs you",
506 date: new Date(),
507 link: "",
508 user: user._id
509 };
510 user.notifications.push(notification);
511
512 user.save(function(err, user) {
513 if (err) return res.send(500, err.message);
514
515
516 //once saved, send the users json to client
517 userModel.find(function(err, users) {
518 if (err) res.send(500, err.message);
519 res.status(200).jsonp(users);
520 });
521 });
522 } else {
523 userModel.find(function(err, users) {
524 if (err) res.send(500, err.message);
525 res.status(200).jsonp(users);
526 });
527 }
528
529 });
530};
531//currently not used
532exports.doUnfav = function(req, res) {
533 var tokenuser;
534 userModel.find({
535 token: req.headers['x-access-token']
536 }, function(err, users) {
537 tokenuser = users[0];
538 });
539
540 userModel.findById(req.params.userId, function(err, user) {
541 for (var i = 0; i < user.favs.length; i++) {
542 if (user.favs[i].username == tokenuser.username) {
543 user.favs.splice(i, 1);
544 }
545 }
546
547 user.save(function(err, travel) {
548 if (err) return res.send(500, err.message);
549 //res.status(200).jsonp(travel);
550 userModel.find(function(err, users) {
551 if (err) res.send(500, err.message);
552 res.status(200).jsonp(users);
553 });
554 });
555 });
556};
557
558exports.changePassword = function(req, res) {
559 userModel.findOne({
560 'token': req.headers['x-access-token'],
561 'password': crypto.createHash('sha256').update(req.body.old).digest('base64')
562 })
563 .exec(function(err, user) {
564 if (err) return res.send(500, err.message);
565 if (!user) {
566 res.json({
567 success: false,
568 message: 'User not found.'
569 });
570 } else if (user) {
571 if (req.body.new1 != req.body.new2) {
572 res.json({
573 success: false,
574 message: 'New passwords not match'
575 });
576 }else{
577 user.password = crypto.createHash('sha256').update(req.body.new1).digest('base64');
578 user.save(function(err, user) {
579 if (err) return res.send(500, err.message);
580
581 exports.getUserByToken(req, res);
582 });
583 }
584 }
585 });
586};