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
 20function getRand(min, max) {
 21    min = Math.ceil(min);
 22    max = Math.floor(max);
 23    return Math.floor(Math.random() * (max - min + 1)) + min; //The maximum is inclusive and the minimum is inclusive
 24}
 25function getAvatar(n){
 26    switch (n) {
 27        case 1:
 28            avatar = "img/avatars/racoon.png";
 29            break;
 30        case 2:
 31            avatar = "img/avatars/duck.png";
 32            break;
 33        case 3:
 34            avatar = "img/avatars/clown-fish.png";
 35            break;
 36        case 4:
 37            avatar = "img/avatars/tiger.png";
 38            break;
 39        case 5:
 40            avatar = "img/avatars/sloth.png";
 41            break;
 42        case 6:
 43            avatar = "img/avatars/penguin.png";
 44            break;
 45        case 7:
 46            avatar = "img/avatars/owl.png";
 47            break;
 48        case 8:
 49            avatar = "img/avatars/chameleon.png";
 50            break;
 51        case 9:
 52            avatar = "img/avatars/siberian-husky.png";
 53            break;
 54        case 10:
 55            avatar = "img/avatars/toucan.png";
 56            break;
 57        default:
 58            avatar = "img/avatars/racoon.png";
 59    }
 60    return avatar;
 61}
 62
 63//POST - Insert a new User in the DB
 64exports.signup = function(req, res) {
 65    //get random avatar
 66    var r = getRand(1, 10);
 67    randAvatar = getAvatar(r);
 68
 69
 70    var user = new userModel({
 71        username: req.body.username,
 72        password: crypto.createHash('sha256').update(req.body.password).digest('base64'),
 73        description: req.body.description,
 74        avatar: randAvatar,
 75        email: req.body.email,
 76        phone: req.body.phone,
 77        telegram: req.body.telegram
 78    });
 79    if (user.username == undefined) {
 80        return res.status(500).jsonp("empty inputs");
 81    } else if (user.password == undefined) {
 82        return res.status(500).jsonp("empty inputs");
 83    } else if (user.email == undefined) {
 84        return res.status(500).jsonp("empty inputs");
 85    }
 86
 87    user.save(function(err, user) {
 88        if (err) return res.send(500, err.message);
 89
 90        exports.login(req, res);
 91    });
 92};
 93
 94
 95//POST - auth user
 96exports.login = function(req, res) {
 97    // find the user
 98    userModel.findOne({
 99            username: req.body.username
100        })
101        .select('+password')
102        .exec(function(err, user) {
103
104            if (err) throw err;
105
106            if (!user) {
107                res.json({
108                    success: false,
109                    message: 'Authentication failed. User not found.'
110                });
111            } else if (user) {
112
113                req.body.password = crypto.createHash('sha256').update(req.body.password).digest('base64');
114
115                // check if password matches
116                if (user.password != req.body.password) {
117                    res.json({
118                        success: false,
119                        message: 'Authentication failed. Wrong password.'
120                    });
121                } else {
122
123                    // if user is found and password is right
124                    // create a token
125                    var token = jwt.sign({
126                        foo: 'bar'
127                    }, app.get('superSecret'), {
128                        //expiresInMinutes: 1440 // expires in 24 hours
129                        //expiresIn: '60m'
130                    });
131                    user.token = token;
132                    user.save(function(err, user) {
133                        if (err) return res.send(500, err.message);
134                        //res.status(200).jsonp(travel);
135                        console.log(user);
136                        // return the information including token as JSON
137                        user.password = "";
138                        res.json({
139                            success: true,
140                            message: 'Enjoy your token!',
141                            token: token,
142                            user: user
143                        });
144                    });
145
146                }
147
148            }
149
150        });
151};
152
153//GET - Return all Users in the DB
154exports.getAllUsers = function(req, res) {
155    userModel.find()
156        .limit(Number(req.query.pageSize))
157        .skip(Number(req.query.pageSize) * Number(req.query.page))
158        .exec(function(err, users) {
159            if (err) return res.send(500, err.message);
160            res.status(200).jsonp(users);
161        });
162};
163
164exports.getUserById = function(req, res) {
165    userModel.findOne({
166            _id: req.params.userid
167        })
168        .lean()
169        .populate('travels', 'title from to date type')
170        .exec(function(err, user) {
171            if (err) return res.send(500, err.message);
172            if (!user) {
173                res.json({
174                    success: false,
175                    message: 'User not found.'
176                });
177            } else if (user) {
178                res.status(200).jsonp(user);
179            }
180        });
181};
182exports.getUserByToken = function(req, res) {
183    userModel.findOne({
184            'token': req.headers['x-access-token']
185        })
186        .lean()
187        .populate('travels', 'title from to date')
188        .exec(function(err, user) {
189            if (err) return res.send(500, err.message);
190            if (!user) {
191                res.json({
192                    success: false,
193                    message: 'User not found.'
194                });
195            } else if (user) {
196
197                res.status(200).jsonp(user);
198            }
199        });
200};
201
202exports.getTravelsByUserId = function(req, res) {
203    travelModel.find({
204            user: req.params.userid
205        })
206        .lean()
207        .exec(function(err, travels) {
208            if (err) return res.send(500, err.message);
209            travelModel.find({
210                    joins: req.params.userid
211                })
212                .lean()
213                .exec(function(err, joins) {
214                    if (err) return res.send(500, err.message);
215                    res.json({
216                        travels: travels,
217                        joins: joins
218                    });
219                });
220        });
221};
222exports.getUserLikes = function(req, res) {
223    userModel.findOne({
224            _id: req.params.userid
225        })
226        .lean()
227        .populate('likes', 'username avatar description')
228        .exec(function(err, user) {
229            if (err) return res.send(500, err.message);
230            if (!user) {
231                res.json({
232                    success: false,
233                    message: 'User not found.'
234                });
235            } else if (user) {
236                res.status(200).jsonp(user.likes);
237            }
238        });
239};
240exports.getNumNotificationsByToken = function(req, res) {
241    userModel.findOne({
242            'token': req.headers['x-access-token']
243        })
244        .lean()
245        .exec(function(err, user) {
246            if (err) return res.send(500, err.message);
247            if (!user) {
248                res.json({
249                    success: false,
250                    message: 'User not found.'
251                });
252            } else if (user) {
253
254                res.status(200).jsonp(user.notifications);
255            }
256        });
257};
258exports.getNotifications = function(req, res) {
259    userModel.findOne({
260            'token': req.headers['x-access-token']
261        })
262        .lean()
263        .populate('notifications')
264        .exec(function(err, user) {
265            if (err) return res.send(500, err.message);
266            if (!user) {
267                res.json({
268                    success: false,
269                    message: 'User not found.'
270                });
271            } else if (user) {
272
273                notificationModel.find({
274                        'user': user._id,
275                        'state': 'pendent'
276                    })
277                    .lean()
278                    .exec(function(err, notifications) {
279                        if (err) return res.send(500, err.message);
280                        if (!notifications) {
281                            res.json({
282                                success: false,
283                                message: 'No pendent notifications.'
284                            });
285                        } else if (notifications) {
286                            //here, maybe in the future is better delete the viewed notifications
287                            notificationModel.update({
288                                    state: "pendent"
289                                }, {
290                                    state: "viewed"
291                                }, {
292                                    multi: true
293                                },
294                                function(err) {
295                                    if (err) {
296                                        console.log(err);
297                                    }
298                                }
299                            );
300                            res.status(200).jsonp(notifications);
301                        }
302                    });
303
304                //now, clean notifications count from user
305                userModel.update({
306                        'token': req.headers['x-access-token']
307                    }, {
308                        notifications: []
309                    },
310                    function(err) {
311                        if (err) {
312                            console.log(err);
313                        }
314                    }
315                );
316            }
317        });
318};
319
320function getRandomInt(min, max) {
321    min = Math.ceil(min);
322    max = Math.floor(max);
323    return Math.floor(Math.random() * (max - min)) + min; //The maximum is exclusive and the minimum is inclusive
324}
325
326function postImage(req, res, filename, fileImg) {
327    url = "http://127.0.0.1:3050/image";
328    var importFile = function(fileImg) {
329        var decodedFile = new Buffer(fileImg, 'base64');
330        var r = request.post(url, function(err, httpResponse, body) {
331            if (err) {
332                console.log(err);
333            }
334            //console.log(body);
335            updateUserWithNewImages(req, res, body);
336        });
337        var form = r.form();
338        form.append('file', decodedFile, {
339            filename: filename + '.png'
340        });
341    }
342    importFile(fileImg);
343}
344
345function updateUserWithNewImages(req, res, imgUrl) {
346    //adding random number to the url, to force ionic reload the image
347    req.body.avatar = imgUrl + "?" + getRandomInt(1, 9999);
348    userModel.update({
349            'token': req.headers['x-access-token']
350        }, req.body,
351        function(err) {
352            if (err) return console.log(err);
353            exports.getUserByToken(req, res);
354        });
355}
356exports.updateUser = function(req, res) {
357    if (req.body.newAvatar) {
358        urlImg = postImage(req, res, "avatar_" + req.body.username, req.body.newAvatar);
359    }
360    /*if (req.body.newFaircoin) {
361        urlImg = postImage(req, res, "fairdir_"+req.body.username,req.body.newFaircoin);
362    }*/
363    if (!req.body.newAvatar) {
364        updateUserWithNewImages(req, res, req.body.avatar);
365    }
366    /*userModel.update({
367            'token': req.headers['x-access-token']
368        }, req.body,
369        function(err) {
370            if (err) return console.log(err);
371            exports.getUserByToken(req, res);
372        });*/
373};
374
375//DELETE - Delete a user with specified ID
376exports.deleteUser = function(req, res) {
377    userModel.findOne({
378            'token': req.headers['x-access-token']
379        })
380        .exec(function(err, user) {
381            user.remove(function(err) {
382                if (err) return res.send(500, err.message);
383                res.status(200).jsonp("deleted");
384            })
385        });
386};
387exports.likeUser = function(req, res) {
388    userModel.findOne({
389            'token': req.headers['x-access-token']
390        })
391        .exec(function(err, userL) {
392            if (err) return res.send(500, err.message);
393            if (!userL) {
394                res.json({
395                    success: false,
396                    message: 'no user with that token, login again'
397                });
398            } else if (userL) {
399
400                userModel.findOne({
401                        _id: req.params.userid,
402                        likes: {
403                            '$ne': userL._id
404                        }
405                    })
406                    .exec(function(err, user) {
407                        if (err) return res.send(500, err.message);
408                        if (!user) {
409                            res.json({
410                                success: false,
411                                message: 'Like not posible, user not exist, or like was already done'
412                            });
413                        } else if (user) {
414                            //res.status(200).jsonp(user);
415                            var notification = new notificationModel({
416                                concept: "like",
417                                message: "user " + userL.username + " adds a like to you",
418                                date: new Date(),
419                                icon: 'like.png',
420                                link: "users/" + user._id,
421                                user: user._id
422                            });
423                            notification.save(function(err, notification) {
424                                if (err) return res.send(500, err.message);
425
426                                user.likes.push(userL._id);
427                                user.notifications.push(notification._id);
428                                user.save(function(err, user) {
429                                    if (err) return res.send(500, err.message);
430
431                                    exports.getUserById(req, res);
432                                });
433                            });
434
435                        } //end of else if user
436                    });
437            } //end of else if userL
438        });
439};
440exports.unlikeUser = function(req, res) {
441    userModel.findOne({
442            'token': req.headers['x-access-token']
443        })
444        .exec(function(err, userL) {
445            if (err) return res.send(500, err.message);
446            if (!userL) {
447                res.json({
448                    success: false,
449                    message: 'no user with that token, login again'
450                });
451            } else if (userL) {
452
453                userModel.findOne({
454                        _id: req.params.userid,
455                        likes: userL._id
456                    })
457                    .exec(function(err, user) {
458                        if (err) return res.send(500, err.message);
459                        if (!user) {
460                            res.json({
461                                success: false,
462                                message: 'Unlike not posible'
463                            });
464                        } else if (user) {
465                            //res.status(200).jsonp(user);
466                            var notification = new notificationModel({
467                                concept: "like",
468                                message: "user " + userL.username + " removes like on you",
469                                date: new Date(),
470                                icon: 'like.png',
471                                link: "users/" + user._id,
472                                user: user._id
473                            });
474                            notification.save(function(err, notification) {
475                                if (err) return res.send(500, err.message);
476
477                                var indexOf = user.likes.indexOf(userL._id);
478                                user.likes.splice(indexOf, 1);
479                                user.notifications.push(notification._id);
480                                user.save(function(err, user) {
481                                    if (err) return res.send(500, err.message);
482
483                                    exports.getUserById(req, res);
484                                });
485                            });
486
487                        } //end of else if user
488                    });
489            } //end of else if userL
490        });
491};
492/* fav */
493exports.addFav = function(req, res) {
494    var tokenuser;
495    userModel.find({
496        token: req.headers['x-access-token']
497    }, function(err, users) {
498        tokenuser = users[0];
499    });
500    userModel.findById(req.params.userId, function(err, user) {
501
502        // first search if user have already said like
503        var favRepeated = false;
504        for (var i = 0; i < user.favs.length; i++) {
505            if (user.favs[i].username == tokenuser.username) {
506                favRepeated = true;
507            }
508        }
509        console.log("favRepeated: " + favRepeated);
510        if (favRepeated == false) {
511            //fav
512            var fav = {
513                userId: tokenuser._id,
514                username: tokenuser.username,
515                avatar: tokenuser.avatar
516            };
517            user.favs.push(fav);
518
519            //notification
520            var notification = {
521                concept: "like",
522                otherusername: tokenuser.username,
523                description: "user " + tokenuser.username + " favs you",
524                date: new Date(),
525                link: "",
526                user: user._id
527            };
528            user.notifications.push(notification);
529
530            user.save(function(err, user) {
531                if (err) return res.send(500, err.message);
532
533
534                //once saved, send the users json to client
535                userModel.find(function(err, users) {
536                    if (err) res.send(500, err.message);
537                    res.status(200).jsonp(users);
538                });
539            });
540        } else {
541            userModel.find(function(err, users) {
542                if (err) res.send(500, err.message);
543                res.status(200).jsonp(users);
544            });
545        }
546
547    });
548};
549exports.doUnfav = function(req, res) {
550    var tokenuser;
551    userModel.find({
552        token: req.headers['x-access-token']
553    }, function(err, users) {
554        tokenuser = users[0];
555    });
556
557    userModel.findById(req.params.userId, function(err, user) {
558        for (var i = 0; i < user.favs.length; i++) {
559            if (user.favs[i].username == tokenuser.username) {
560                user.favs.splice(i, 1);
561            }
562        }
563
564        user.save(function(err, travel) {
565            if (err) return res.send(500, err.message);
566            //res.status(200).jsonp(travel);
567            userModel.find(function(err, users) {
568                if (err) res.send(500, err.message);
569                res.status(200).jsonp(users);
570            });
571        });
572    });
573};