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
 18//POST - Insert a new User in the DB
 19exports.signup = function(req, res) {
 20
 21    var user = new userModel({
 22        username: req.body.username,
 23        password: crypto.createHash('sha256').update(req.body.password).digest('base64'),
 24        description: req.body.description,
 25        avatar: req.body.avatar,
 26        email: req.body.email,
 27        phone: req.body.phone,
 28        telegram: req.body.telegram
 29    });
 30    if (user.username == undefined) {
 31        return res.status(500).jsonp("empty inputs");
 32    } else if (user.password == undefined) {
 33        return res.status(500).jsonp("empty inputs");
 34    } else if (user.email == undefined) {
 35        return res.status(500).jsonp("empty inputs");
 36    }
 37
 38    user.save(function(err, user) {
 39        if (err) return res.send(500, err.message);
 40
 41		exports.login(req, res);
 42    });
 43};
 44
 45
 46//POST - auth user
 47exports.login = function(req, res) {
 48    // find the user
 49    userModel.findOne({
 50        username: req.body.username
 51    })
 52    .select('+password')
 53    .exec(function(err, user) {
 54
 55        if (err) throw err;
 56
 57        if (!user) {
 58            res.json({
 59                success: false,
 60                message: 'Authentication failed. User not found.'
 61            });
 62        } else if (user) {
 63
 64            req.body.password = crypto.createHash('sha256').update(req.body.password).digest('base64');
 65
 66            // check if password matches
 67            if (user.password != req.body.password) {
 68                res.json({
 69                    success: false,
 70                    message: 'Authentication failed. Wrong password.'
 71                });
 72            } else {
 73
 74                // if user is found and password is right
 75                // create a token
 76                var token = jwt.sign({foo: 'bar'}, app.get('superSecret'), {
 77                    //expiresInMinutes: 1440 // expires in 24 hours
 78                    //expiresIn: '60m'
 79                });
 80                user.token = token;
 81                user.save(function(err, user) {
 82                    if (err) return res.send(500, err.message);
 83                    //res.status(200).jsonp(travel);
 84                    console.log(user);
 85                    // return the information including token as JSON
 86                    user.password = "";
 87                    res.json({
 88                        success: true,
 89                        message: 'Enjoy your token!',
 90                        token: token,
 91                        user: user
 92                    });
 93                });
 94
 95            }
 96
 97        }
 98
 99    });
100};
101
102//GET - Return all Users in the DB
103exports.getAllUsers = function(req, res) {
104    userModel.find()
105        .limit(Number(req.query.pageSize))
106        .skip(Number(req.query.pageSize) * Number(req.query.page))
107        .exec(function (err, users) {
108            if (err) return res.send(500, err.message);
109            res.status(200).jsonp(users);
110        });
111};
112
113
114exports.getUserById = function (req, res) {
115    userModel.findOne({_id: req.params.userid})
116    .lean()
117    .populate('travels', 'title from to date type')
118    .exec(function (err, user) {
119        if (err) return res.send(500, err.message);
120        if (!user) {
121            res.json({success: false, message: 'User not found.'});
122        } else if (user) {
123
124            res.status(200).jsonp(user);
125        }
126    });
127};
128exports.getUserByToken = function (req, res) {
129    userModel.findOne({'token': req.headers['x-access-token']})
130    .lean()
131    .populate('travels', 'title from to date')
132    .exec(function (err, user) {
133        if (err) return res.send(500, err.message);
134        if (!user) {
135            res.json({success: false, message: 'User not found.'});
136        } else if (user) {
137
138            res.status(200).jsonp(user);
139        }
140    });
141};
142
143exports.getTravelsByUserId = function (req, res) {
144    travelModel.find(
145        {
146            user: req.params.userid
147        }
148    )
149    .lean()
150    .exec(function (err, travels) {
151        if (err) return res.send(500, err.message);
152        travelModel.find(
153            {
154                joins: req.params.userid
155            }
156        )
157        .lean()
158        .exec(function (err, joins) {
159            if (err) return res.send(500, err.message);
160            res.json({
161                travels: travels,
162                joins: joins
163            });
164        });
165    });
166};
167exports.getUserLikes = function (req, res) {
168    userModel.findOne({_id: req.params.userid})
169    .lean()
170    .populate('likes', 'username avatar description')
171    .exec(function (err, user) {
172        if (err) return res.send(500, err.message);
173        if (!user) {
174            res.json({success: false, message: 'User not found.'});
175        } else if (user) {
176            res.status(200).jsonp(user.likes);
177        }
178    });
179};
180exports.getNotifications = function (req, res) {
181    userModel.findOne({'token': req.headers['x-access-token']})
182    .lean()
183    .populate('notifications')
184    .exec(function (err, user) {
185        if (err) return res.send(500, err.message);
186        if (!user) {
187            res.json({success: false, message: 'User not found.'});
188        } else if (user) {
189
190            //res.status(200).jsonp(user.notifications);
191            notificationModel.find({'user': user._id})
192            .lean()
193            .exec(function (err, notifications) {
194                if (err) return res.send(500, err.message);
195                if (!notifications) {
196                    res.json({success: false, message: 'No pendent notifications.'});
197                } else if (notifications) {
198
199                    res.status(200).jsonp(notifications);
200                }
201            });
202        }
203    });
204};
205
206exports.updateUser = function (req, res) {
207    userModel.update({'token': req.headers['x-access-token']}, req.body,
208        function (err) {
209            if (err) return console.log(err);
210            exports.getUserByToken(req, res);
211        });
212};
213
214//DELETE - Delete a user with specified ID
215exports.deleteUser = function(req, res) {
216    userModel.findOne({'token': req.headers['x-access-token']})
217    .exec(function(err, user) {
218        user.remove(function(err) {
219            if (err) return res.send(500, err.message);
220            res.status(200).jsonp("deleted");
221        })
222    });
223};
224exports.likeUser = function(req, res) {
225    userModel.findOne({'token': req.headers['x-access-token']})
226    .exec(function (err, userL) {
227        if (err) return res.send(500, err.message);
228        if (!userL) {
229            res.json({success: false, message: 'no user with that token, login again'});
230        } else if (userL) {
231
232            userModel.findOne({
233                _id: req.params.userid,
234                likes: {'$ne': userL._id}
235            })
236            .exec(function (err, user) {
237                if (err) return res.send(500, err.message);
238                if (!user) {
239                    res.json({success: false, message: 'Like not posible, user not exist, or like was already done'});
240                } else if (user) {
241                    //res.status(200).jsonp(user);
242                    var notification = new notificationModel({
243                        concept: "like",
244                        message: "user "+userL.username+" adds a like to you",
245                        date: new Date(),
246                        icon: 'like.png',
247                        link: "users/" + user._id,
248                        user: user._id
249                    });
250                    notification.save(function(err, notification) {
251                        if (err) return res.send(500, err.message);
252
253                        user.likes.push(userL._id);
254                        user.notifications.push(notification._id);
255                        user.save(function(err, user) {
256                            if (err) return res.send(500, err.message);
257
258                            exports.getUserById(req, res);
259                        });
260                    });
261
262                }//end of else if user
263            });
264        }//end of else if userL
265    });
266};
267exports.unlikeUser = function(req, res) {
268    userModel.findOne({'token': req.headers['x-access-token']})
269    .exec(function (err, userL) {
270        if (err) return res.send(500, err.message);
271        if (!userL) {
272            res.json({success: false, message: 'no user with that token, login again'});
273        } else if (userL) {
274
275            userModel.findOne({
276                _id: req.params.userid,
277                likes: userL._id
278            })
279            .exec(function (err, user) {
280                if (err) return res.send(500, err.message);
281                if (!user) {
282                    res.json({success: false, message: 'Unlike not posible'});
283                } else if (user) {
284                    //res.status(200).jsonp(user);
285                    var notification = new notificationModel({
286                        concept: "like",
287                        message: "user "+userL.username+" removes like on you",
288                        date: new Date(),
289                        icon: 'like.png',
290                        link: "users/" + user._id,
291                        user: user._id
292                    });
293                    notification.save(function(err, notification) {
294                        if (err) return res.send(500, err.message);
295
296                        var indexOf= user.likes.indexOf(userL._id);
297                        user.likes.splice(indexOf, 1);
298                        user.notifications.push(notification._id);
299                        user.save(function(err, user) {
300                            if (err) return res.send(500, err.message);
301
302                            exports.getUserById(req, res);
303                        });
304                    });
305
306                }//end of else if user
307            });
308        }//end of else if userL
309    });
310};
311/* fav */
312exports.addFav = function(req, res) {
313    var tokenuser;
314    userModel.find({
315        token: req.headers['x-access-token']
316    }, function(err, users) {
317        tokenuser = users[0];
318    });
319    userModel.findById(req.params.userId, function(err, user) {
320
321        // first search if user have already said like
322        var favRepeated = false;
323        for (var i = 0; i < user.favs.length; i++) {
324            if (user.favs[i].username == tokenuser.username) {
325                favRepeated = true;
326            }
327        }
328        console.log("favRepeated: " + favRepeated);
329        if (favRepeated == false) {
330            //fav
331            var fav = {
332                userId: tokenuser._id,
333                username: tokenuser.username,
334                avatar: tokenuser.avatar
335            };
336            user.favs.push(fav);
337
338            //notification
339            var notification = {
340                concept: "like",
341                otherusername: tokenuser.username,
342                description: "user " + tokenuser.username + " favs you",
343                date: new Date(),
344                link: "",
345                user: user._id
346            };
347            user.notifications.push(notification);
348
349            user.save(function(err, user) {
350                if (err) return res.send(500, err.message);
351
352
353                //once saved, send the users json to client
354                userModel.find(function(err, users) {
355                    if (err) res.send(500, err.message);
356                    res.status(200).jsonp(users);
357                });
358            });
359        } else {
360            userModel.find(function(err, users) {
361                if (err) res.send(500, err.message);
362                res.status(200).jsonp(users);
363            });
364        }
365
366    });
367};
368exports.doUnfav = function(req, res) {
369    var tokenuser;
370    userModel.find({
371        token: req.headers['x-access-token']
372    }, function(err, users) {
373        tokenuser = users[0];
374    });
375
376    userModel.findById(req.params.userId, function(err, user) {
377        for (var i = 0; i < user.favs.length; i++) {
378            if (user.favs[i].username == tokenuser.username) {
379                user.favs.splice(i, 1);
380            }
381        }
382
383        user.save(function(err, travel) {
384            if (err) return res.send(500, err.message);
385            //res.status(200).jsonp(travel);
386            userModel.find(function(err, users) {
387                if (err) res.send(500, err.message);
388                res.status(200).jsonp(users);
389            });
390        });
391    });
392};