arnaucube
arnaucube/MEANseedPublic Self-hosted repository
MEANseed/server/controllers/userController.js
server/controllers/userController.jsRaw
  1//File: controllers/userController.js
  2var mongoose = require('mongoose');
  3var userModel = mongoose.model('userModel');
  4
  5var config = require('../config');
  6var pageSize = config.pageSize;
  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}
 25
 26function getAvatar(n) {
 27    switch (n) {
 28        case 1:
 29            avatar = "img/avatars/racoon.png";
 30            break;
 31        case 2:
 32            avatar = "img/avatars/duck.png";
 33            break;
 34        case 3:
 35            avatar = "img/avatars/clown-fish.png";
 36            break;
 37        case 4:
 38            avatar = "img/avatars/tiger.png";
 39            break;
 40        case 5:
 41            avatar = "img/avatars/sloth.png";
 42            break;
 43        case 6:
 44            avatar = "img/avatars/penguin.png";
 45            break;
 46        case 7:
 47            avatar = "img/avatars/owl.png";
 48            break;
 49        case 8:
 50            avatar = "img/avatars/chameleon.png";
 51            break;
 52        case 9:
 53            avatar = "img/avatars/siberian-husky.png";
 54            break;
 55        case 10:
 56            avatar = "img/avatars/toucan.png";
 57            break;
 58        default:
 59            avatar = "img/avatars/racoon.png";
 60    }
 61    return avatar;
 62}
 63
 64//POST - Insert a new User in the DB
 65exports.signup = function(req, res) {
 66    //get random avatar
 67    var r = getRand(1, 10);
 68    randAvatar = getAvatar(r);
 69
 70
 71    var user = new userModel({
 72        username: req.body.username,
 73        password: crypto.createHash('sha256').update(req.body.password).digest('base64'),
 74        description: req.body.description,
 75        avatar: randAvatar,
 76        email: req.body.email,
 77        phone: req.body.phone
 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(pageSize)
157        .skip(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('validatedBy', 'username')
170        .populate('travels', 'title from to date type')
171        .exec(function(err, user) {
172            if (err) return res.send(500, err.message);
173            if (!user) {
174                res.json({
175                    success: false,
176                    message: 'User not found.'
177                });
178            } else if (user) {
179                res.status(200).jsonp(user);
180            }
181        });
182};
183exports.getUserByToken = function(req, res) {
184    userModel.findOne({
185            'token': req.headers['x-access-token']
186        })
187        .lean()
188        .populate('travels', 'title from to date')
189        .exec(function(err, user) {
190            if (err) return res.send(500, err.message);
191            if (!user) {
192                res.json({
193                    success: false,
194                    message: 'User not found.'
195                });
196            } else if (user) {
197
198                res.status(200).jsonp(user);
199            }
200        });
201};
202
203
204function getRandomInt(min, max) {
205    min = Math.ceil(min);
206    max = Math.floor(max);
207    return Math.floor(Math.random() * (max - min)) + min; //The maximum is exclusive and the minimum is inclusive
208}
209
210
211function updateUserWithNewImages(req, res, imgUrl) {
212    //adding random number to the url, to force ionic reload the image
213    req.body.avatar = imgUrl + "?" + getRandomInt(1, 9999);
214    userModel.update({
215            'token': req.headers['x-access-token']
216        }, req.body,
217        function(err) {
218            if (err) return console.log(err);
219            exports.getUserByToken(req, res);
220        });
221}
222exports.updateUser = function(req, res) {
223    updateUserWithNewImages(req, res, req.body.avatar);
224};
225
226//DELETE - Delete a user with specified ID
227exports.deleteUser = function(req, res) {
228    userModel.findOne({
229            'token': req.headers['x-access-token']
230        })
231        .exec(function(err, user) {
232            user.remove(function(err) {
233                if (err) return res.send(500, err.message);
234                res.status(200).jsonp("deleted");
235            })
236        });
237};