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