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('travels', 'title from to date type')
173 .exec(function(err, user) {
174 if (err) return res.send(500, err.message);
175 if (!user) {
176 res.json({
177 success: false,
178 message: 'User not found.'
179 });
180 } else if (user) {
181 res.status(200).jsonp(user);
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
257 res.status(200).jsonp(user.notifications);
258 }
259 });
260};
261exports.getNotifications = function(req, res) {
262 userModel.findOne({
263 'token': req.headers['x-access-token']
264 })
265 .lean()
266 .populate('notifications')
267 .exec(function(err, user) {
268 if (err) return res.send(500, err.message);
269 if (!user) {
270 res.json({
271 success: false,
272 message: 'User not found.'
273 });
274 } else if (user) {
275
276 notificationModel.find({
277 'user': user._id,
278 'state': 'pendent'
279 })
280 .lean()
281 .exec(function(err, notifications) {
282 if (err) return res.send(500, err.message);
283 if (!notifications) {
284 res.json({
285 success: false,
286 message: 'No pendent notifications.'
287 });
288 } else if (notifications) {
289 //here, maybe in the future is better delete the viewed notifications
290 notificationModel.update({
291 state: "pendent"
292 }, {
293 state: "viewed"
294 }, {
295 multi: true
296 },
297 function(err) {
298 if (err) {
299 console.log(err);
300 }
301 }
302 );
303 res.status(200).jsonp(notifications);
304 }
305 });
306
307 //now, clean notifications count from user
308 userModel.update({
309 'token': req.headers['x-access-token']
310 }, {
311 notifications: []
312 },
313 function(err) {
314 if (err) {
315 console.log(err);
316 }
317 }
318 );
319 }
320 });
321};
322
323function getRandomInt(min, max) {
324 min = Math.ceil(min);
325 max = Math.floor(max);
326 return Math.floor(Math.random() * (max - min)) + min; //The maximum is exclusive and the minimum is inclusive
327}
328
329function postImage(req, res, filename, fileImg) {
330 url = "http://127.0.0.1:3050/image";
331 var importFile = function(fileImg) {
332 var decodedFile = new Buffer(fileImg, 'base64');
333 var r = request.post(url, function(err, httpResponse, body) {
334 if (err) {
335 console.log(err);
336 }
337 //console.log(body);
338 updateUserWithNewImages(req, res, body);
339 });
340 var form = r.form();
341 form.append('file', decodedFile, {
342 filename: filename + '.png'
343 });
344 }
345 importFile(fileImg);
346}
347
348function updateUserWithNewImages(req, res, imgUrl) {
349 //adding random number to the url, to force ionic reload the image
350 req.body.avatar = imgUrl + "?" + getRandomInt(1, 9999);
351 userModel.update({
352 'token': req.headers['x-access-token']
353 }, req.body,
354 function(err) {
355 if (err) return console.log(err);
356 exports.getUserByToken(req, res);
357 });
358}
359exports.updateUser = function(req, res) {
360 if (req.body.newAvatar) {
361 urlImg = postImage(req, res, "avatar_" + req.body.username, req.body.newAvatar);
362 }
363 /*if (req.body.newFaircoin) {
364 urlImg = postImage(req, res, "fairdir_"+req.body.username,req.body.newFaircoin);
365 }*/
366 if (!req.body.newAvatar) {
367 updateUserWithNewImages(req, res, req.body.avatar);
368 }
369 /*userModel.update({
370 'token': req.headers['x-access-token']
371 }, req.body,
372 function(err) {
373 if (err) return console.log(err);
374 exports.getUserByToken(req, res);
375 });*/
376};
377
378//DELETE - Delete a user with specified ID
379exports.deleteUser = function(req, res) {
380 userModel.findOne({
381 'token': req.headers['x-access-token']
382 })
383 .exec(function(err, user) {
384 user.remove(function(err) {
385 if (err) return res.send(500, err.message);
386 res.status(200).jsonp("deleted");
387 })
388 });
389};
390exports.likeUser = function(req, res) {
391 userModel.findOne({
392 'token': req.headers['x-access-token']
393 })
394 .exec(function(err, userL) {
395 if (err) return res.send(500, err.message);
396 if (!userL) {
397 res.json({
398 success: false,
399 message: 'no user with that token, login again'
400 });
401 } else if (userL) {
402
403 userModel.findOne({
404 _id: req.params.userid,
405 likes: {
406 '$ne': userL._id
407 }
408 })
409 .exec(function(err, user) {
410 if (err) return res.send(500, err.message);
411 if (!user) {
412 res.json({
413 success: false,
414 message: 'Like not posible, user not exist, or like was already done'
415 });
416 } else if (user) {
417 //res.status(200).jsonp(user);
418 var notification = new notificationModel({
419 concept: "like",
420 message: "user " + userL.username + " adds a like to you",
421 date: new Date(),
422 icon: 'ion-heart',
423 link: "users/" + user._id,
424 user: user._id
425 });
426 notification.save(function(err, notification) {
427 if (err) return res.send(500, err.message);
428
429 user.likes.push(userL._id);
430 user.notifications.push(notification._id);
431 user.save(function(err, user) {
432 if (err) return res.send(500, err.message);
433
434 exports.getUserById(req, res);
435 });
436 });
437
438 } //end of else if user
439 });
440 } //end of else if userL
441 });
442};
443exports.unlikeUser = function(req, res) {
444 userModel.findOne({
445 'token': req.headers['x-access-token']
446 })
447 .exec(function(err, userL) {
448 if (err) return res.send(500, err.message);
449 if (!userL) {
450 res.json({
451 success: false,
452 message: 'no user with that token, login again'
453 });
454 } else if (userL) {
455
456 userModel.findOne({
457 _id: req.params.userid,
458 likes: userL._id
459 })
460 .exec(function(err, user) {
461 if (err) return res.send(500, err.message);
462 if (!user) {
463 res.json({
464 success: false,
465 message: 'Unlike not posible'
466 });
467 } else if (user) {
468 //res.status(200).jsonp(user);
469 var notification = new notificationModel({
470 concept: "like",
471 message: "user " + userL.username + " removes like on you",
472 date: new Date(),
473 icon: 'ion-heart-broken',
474 link: "users/" + user._id,
475 user: user._id
476 });
477 notification.save(function(err, notification) {
478 if (err) return res.send(500, err.message);
479
480 var indexOf = user.likes.indexOf(userL._id);
481 user.likes.splice(indexOf, 1);
482 user.notifications.push(notification._id);
483 user.save(function(err, user) {
484 if (err) return res.send(500, err.message);
485
486 exports.getUserById(req, res);
487 });
488 });
489
490 } //end of else if user
491 });
492 } //end of else if userL
493 });
494};
495/* fav */
496exports.addFav = function(req, res) {
497 var tokenuser;
498 userModel.find({
499 token: req.headers['x-access-token']
500 }, function(err, users) {
501 tokenuser = users[0];
502 });
503 userModel.findById(req.params.userId, function(err, user) {
504
505 // first search if user have already said like
506 var favRepeated = false;
507 for (var i = 0; i < user.favs.length; i++) {
508 if (user.favs[i].username == tokenuser.username) {
509 favRepeated = true;
510 }
511 }
512 console.log("favRepeated: " + favRepeated);
513 if (favRepeated == false) {
514 //fav
515 var fav = {
516 userId: tokenuser._id,
517 username: tokenuser.username,
518 avatar: tokenuser.avatar
519 };
520 user.favs.push(fav);
521
522 //notification
523 var notification = {
524 concept: "like",
525 otherusername: tokenuser.username,
526 description: "user " + tokenuser.username + " favs you",
527 date: new Date(),
528 link: "",
529 user: user._id
530 };
531 user.notifications.push(notification);
532
533 user.save(function(err, user) {
534 if (err) return res.send(500, err.message);
535
536
537 //once saved, send the users json to client
538 userModel.find(function(err, users) {
539 if (err) res.send(500, err.message);
540 res.status(200).jsonp(users);
541 });
542 });
543 } else {
544 userModel.find(function(err, users) {
545 if (err) res.send(500, err.message);
546 res.status(200).jsonp(users);
547 });
548 }
549
550 });
551};
552exports.doUnfav = function(req, res) {
553 var tokenuser;
554 userModel.find({
555 token: req.headers['x-access-token']
556 }, function(err, users) {
557 tokenuser = users[0];
558 });
559
560 userModel.findById(req.params.userId, function(err, user) {
561 for (var i = 0; i < user.favs.length; i++) {
562 if (user.favs[i].username == tokenuser.username) {
563 user.favs.splice(i, 1);
564 }
565 }
566
567 user.save(function(err, travel) {
568 if (err) return res.send(500, err.message);
569 //res.status(200).jsonp(travel);
570 userModel.find(function(err, users) {
571 if (err) res.send(500, err.message);
572 res.status(200).jsonp(users);
573 });
574 });
575 });
576};
577exports.changePassword = function(req, res) {
578 //if(req.body.)
579 userModel.update({
580 'token': req.headers['x-access-token']
581 }, req.body,
582 function(err) {
583 if (err) return console.log(err);
584 exports.getUserByToken(req, res);
585 });
586};