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