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.getNotifications = function(req, res) {
194 userModel.findOne({
195 'token': req.headers['x-access-token']
196 })
197 .lean()
198 .populate('notifications')
199 .exec(function(err, user) {
200 if (err) return res.send(500, err.message);
201 if (!user) {
202 res.json({
203 success: false,
204 message: 'User not found.'
205 });
206 } else if (user) {
207
208 //res.status(200).jsonp(user.notifications);
209 notificationModel.find({
210 'user': user._id
211 })
212 .lean()
213 .exec(function(err, notifications) {
214 if (err) return res.send(500, err.message);
215 if (!notifications) {
216 res.json({
217 success: false,
218 message: 'No pendent notifications.'
219 });
220 } else if (notifications) {
221
222 res.status(200).jsonp(notifications);
223 }
224 });
225 }
226 });
227};
228
229function getRandomInt(min, max) {
230 min = Math.ceil(min);
231 max = Math.floor(max);
232 return Math.floor(Math.random() * (max - min)) + min; //The maximum is exclusive and the minimum is inclusive
233}
234function postImage(req, res, filename, fileImg) {
235 url = "http://127.0.0.1:3050/image";
236 var importFile = function(fileImg) {
237 var decodedFile = new Buffer(fileImg, 'base64');
238 var r = request.post(url, function(err, httpResponse, body) {
239 if (err) {
240 console.log(err);
241 }
242 //console.log(body);
243 updateUserWithNewImages(req, res, body);
244 });
245 var form = r.form();
246 form.append('file', decodedFile, {
247 filename: filename + '.png'
248 });
249 }
250 importFile(fileImg);
251}
252function updateUserWithNewImages(req, res, imgUrl){
253 //adding random number to the url, to force ionic reload the image
254 req.body.avatar = imgUrl+ "?" + getRandomInt(1, 9999);
255 userModel.update({
256 'token': req.headers['x-access-token']
257 }, req.body,
258 function(err) {
259 if (err) return console.log(err);
260 exports.getUserByToken(req, res);
261 });
262}
263exports.updateUser = function(req, res) {
264 if (req.body.newAvatar) {
265 urlImg = postImage(req, res, "avatar_"+req.body.username, req.body.newAvatar);
266 }
267 /*if (req.body.newFaircoin) {
268 urlImg = postImage(req, res, "fairdir_"+req.body.username,req.body.newFaircoin);
269 }*/
270 if (!req.body.newAvatar){
271 updateUserWithNewImages(req, res, req.body.avatar);
272 }
273 /*userModel.update({
274 'token': req.headers['x-access-token']
275 }, req.body,
276 function(err) {
277 if (err) return console.log(err);
278 exports.getUserByToken(req, res);
279 });*/
280};
281
282//DELETE - Delete a user with specified ID
283exports.deleteUser = function(req, res) {
284 userModel.findOne({
285 'token': req.headers['x-access-token']
286 })
287 .exec(function(err, user) {
288 user.remove(function(err) {
289 if (err) return res.send(500, err.message);
290 res.status(200).jsonp("deleted");
291 })
292 });
293};
294exports.likeUser = function(req, res) {
295 userModel.findOne({
296 'token': req.headers['x-access-token']
297 })
298 .exec(function(err, userL) {
299 if (err) return res.send(500, err.message);
300 if (!userL) {
301 res.json({
302 success: false,
303 message: 'no user with that token, login again'
304 });
305 } else if (userL) {
306
307 userModel.findOne({
308 _id: req.params.userid,
309 likes: {
310 '$ne': userL._id
311 }
312 })
313 .exec(function(err, user) {
314 if (err) return res.send(500, err.message);
315 if (!user) {
316 res.json({
317 success: false,
318 message: 'Like not posible, user not exist, or like was already done'
319 });
320 } else if (user) {
321 //res.status(200).jsonp(user);
322 var notification = new notificationModel({
323 concept: "like",
324 message: "user " + userL.username + " adds a like to you",
325 date: new Date(),
326 icon: 'like.png',
327 link: "users/" + user._id,
328 user: user._id
329 });
330 notification.save(function(err, notification) {
331 if (err) return res.send(500, err.message);
332
333 user.likes.push(userL._id);
334 user.notifications.push(notification._id);
335 user.save(function(err, user) {
336 if (err) return res.send(500, err.message);
337
338 exports.getUserById(req, res);
339 });
340 });
341
342 } //end of else if user
343 });
344 } //end of else if userL
345 });
346};
347exports.unlikeUser = function(req, res) {
348 userModel.findOne({
349 'token': req.headers['x-access-token']
350 })
351 .exec(function(err, userL) {
352 if (err) return res.send(500, err.message);
353 if (!userL) {
354 res.json({
355 success: false,
356 message: 'no user with that token, login again'
357 });
358 } else if (userL) {
359
360 userModel.findOne({
361 _id: req.params.userid,
362 likes: userL._id
363 })
364 .exec(function(err, user) {
365 if (err) return res.send(500, err.message);
366 if (!user) {
367 res.json({
368 success: false,
369 message: 'Unlike not posible'
370 });
371 } else if (user) {
372 //res.status(200).jsonp(user);
373 var notification = new notificationModel({
374 concept: "like",
375 message: "user " + userL.username + " removes like on you",
376 date: new Date(),
377 icon: 'like.png',
378 link: "users/" + user._id,
379 user: user._id
380 });
381 notification.save(function(err, notification) {
382 if (err) return res.send(500, err.message);
383
384 var indexOf = user.likes.indexOf(userL._id);
385 user.likes.splice(indexOf, 1);
386 user.notifications.push(notification._id);
387 user.save(function(err, user) {
388 if (err) return res.send(500, err.message);
389
390 exports.getUserById(req, res);
391 });
392 });
393
394 } //end of else if user
395 });
396 } //end of else if userL
397 });
398};
399/* fav */
400exports.addFav = function(req, res) {
401 var tokenuser;
402 userModel.find({
403 token: req.headers['x-access-token']
404 }, function(err, users) {
405 tokenuser = users[0];
406 });
407 userModel.findById(req.params.userId, function(err, user) {
408
409 // first search if user have already said like
410 var favRepeated = false;
411 for (var i = 0; i < user.favs.length; i++) {
412 if (user.favs[i].username == tokenuser.username) {
413 favRepeated = true;
414 }
415 }
416 console.log("favRepeated: " + favRepeated);
417 if (favRepeated == false) {
418 //fav
419 var fav = {
420 userId: tokenuser._id,
421 username: tokenuser.username,
422 avatar: tokenuser.avatar
423 };
424 user.favs.push(fav);
425
426 //notification
427 var notification = {
428 concept: "like",
429 otherusername: tokenuser.username,
430 description: "user " + tokenuser.username + " favs you",
431 date: new Date(),
432 link: "",
433 user: user._id
434 };
435 user.notifications.push(notification);
436
437 user.save(function(err, user) {
438 if (err) return res.send(500, err.message);
439
440
441 //once saved, send the users json to client
442 userModel.find(function(err, users) {
443 if (err) res.send(500, err.message);
444 res.status(200).jsonp(users);
445 });
446 });
447 } else {
448 userModel.find(function(err, users) {
449 if (err) res.send(500, err.message);
450 res.status(200).jsonp(users);
451 });
452 }
453
454 });
455};
456exports.doUnfav = function(req, res) {
457 var tokenuser;
458 userModel.find({
459 token: req.headers['x-access-token']
460 }, function(err, users) {
461 tokenuser = users[0];
462 });
463
464 userModel.findById(req.params.userId, function(err, user) {
465 for (var i = 0; i < user.favs.length; i++) {
466 if (user.favs[i].username == tokenuser.username) {
467 user.favs.splice(i, 1);
468 }
469 }
470
471 user.save(function(err, travel) {
472 if (err) return res.send(500, err.message);
473 //res.status(200).jsonp(travel);
474 userModel.find(function(err, users) {
475 if (err) res.send(500, err.message);
476 res.status(200).jsonp(users);
477 });
478 });
479 });
480};