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