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