arnaucube
arnaucube/commonroutesServerPublic Self-hosted repository
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};