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.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};