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        }
192    });
193};
194
195exports.updateUser = function (req, res) {
196    userModel.update({'token': req.headers['x-access-token']}, req.body,
197        function (err) {
198            if (err) return console.log(err);
199            exports.getUserByToken(req, res);
200        });
201};
202
203//DELETE - Delete a user with specified ID
204exports.deleteUser = function(req, res) {
205    userModel.findOne({'token': req.headers['x-access-token']})
206    .exec(function(err, user) {
207        user.remove(function(err) {
208            if (err) return res.send(500, err.message);
209            res.status(200).jsonp("deleted");
210        })
211    });
212};
213exports.likeUser = function(req, res) {
214    userModel.findOne({'token': req.headers['x-access-token']})
215    .exec(function (err, userL) {
216        if (err) return res.send(500, err.message);
217        if (!userL) {
218            res.json({success: false, message: 'no user with that token, login again'});
219        } else if (userL) {
220
221            userModel.findOne({
222                _id: req.params.userid,
223                likes: {'$ne': userL._id}
224            })
225            .exec(function (err, user) {
226                if (err) return res.send(500, err.message);
227                if (!user) {
228                    res.json({success: false, message: 'Like not posible, user not exist, or like was already done'});
229                } else if (user) {
230                    //res.status(200).jsonp(user);
231                    var notification = new notificationModel({
232                        concept: "like",
233                        message: "user "+userL.username+" adds a like to you",
234                        date: new Date(),
235                        icon: 'like.png',
236                        link: "users/" + user._id
237                    });
238                    notification.save(function(err, notification) {
239                        if (err) return res.send(500, err.message);
240
241                        user.likes.push(userL._id);
242                        user.notifications.push(notification._id);
243                        user.save(function(err, user) {
244                            if (err) return res.send(500, err.message);
245
246                            exports.getUserById(req, res);
247                        });
248                    });
249
250                }//end of else if user
251            });
252        }//end of else if userL
253    });
254};
255exports.unlikeUser = function(req, res) {
256    userModel.findOne({'token': req.headers['x-access-token']})
257    .exec(function (err, userL) {
258        if (err) return res.send(500, err.message);
259        if (!userL) {
260            res.json({success: false, message: 'no user with that token, login again'});
261        } else if (userL) {
262
263            userModel.findOne({
264                _id: req.params.userid,
265                likes: userL._id
266            })
267            .exec(function (err, user) {
268                if (err) return res.send(500, err.message);
269                if (!user) {
270                    res.json({success: false, message: 'Unlike not posible'});
271                } else if (user) {
272                    //res.status(200).jsonp(user);
273                    var notification = new notificationModel({
274                        concept: "like",
275                        message: "user "+userL.username+" removes like on you",
276                        date: new Date(),
277                        icon: 'like.png',
278                        link: "users/" + user._id
279                    });
280                    notification.save(function(err, notification) {
281                        if (err) return res.send(500, err.message);
282
283                        var indexOf= user.likes.indexOf(userL._id);
284                        user.likes.splice(indexOf, 1);
285                        user.notifications.push(notification._id);
286                        user.save(function(err, user) {
287                            if (err) return res.send(500, err.message);
288
289                            exports.getUserById(req, res);
290                        });
291                    });
292
293                }//end of else if user
294            });
295        }//end of else if userL
296    });
297};
298/* fav */
299exports.addFav = function(req, res) {
300    var tokenuser;
301    userModel.find({
302        token: req.headers['x-access-token']
303    }, function(err, users) {
304        tokenuser = users[0];
305    });
306    userModel.findById(req.params.userId, function(err, user) {
307
308        // first search if user have already said like
309        var favRepeated = false;
310        for (var i = 0; i < user.favs.length; i++) {
311            if (user.favs[i].username == tokenuser.username) {
312                favRepeated = true;
313            }
314        }
315        console.log("favRepeated: " + favRepeated);
316        if (favRepeated == false) {
317            //fav
318            var fav = {
319                userId: tokenuser._id,
320                username: tokenuser.username,
321                avatar: tokenuser.avatar
322            };
323            user.favs.push(fav);
324
325            //notification
326            var notification = {
327                concept: "like",
328                otherusername: tokenuser.username,
329                description: "user " + tokenuser.username + " favs you",
330                date: new Date(),
331                link: ""
332            };
333            user.notifications.push(notification);
334
335            user.save(function(err, user) {
336                if (err) return res.send(500, err.message);
337
338
339                //once saved, send the users json to client
340                userModel.find(function(err, users) {
341                    if (err) res.send(500, err.message);
342                    res.status(200).jsonp(users);
343                });
344            });
345        } else {
346            userModel.find(function(err, users) {
347                if (err) res.send(500, err.message);
348                res.status(200).jsonp(users);
349            });
350        }
351
352    });
353};
354exports.doUnfav = function(req, res) {
355    var tokenuser;
356    userModel.find({
357        token: req.headers['x-access-token']
358    }, function(err, users) {
359        tokenuser = users[0];
360    });
361
362    userModel.findById(req.params.userId, function(err, user) {
363        for (var i = 0; i < user.favs.length; i++) {
364            if (user.favs[i].username == tokenuser.username) {
365                user.favs.splice(i, 1);
366            }
367        }
368
369        user.save(function(err, travel) {
370            if (err) return res.send(500, err.message);
371            //res.status(200).jsonp(travel);
372            userModel.find(function(err, users) {
373                if (err) res.send(500, err.message);
374                res.status(200).jsonp(users);
375            });
376        });
377    });
378};