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