arnaucube
arnaucube/commonroutesServerPublic Self-hosted repository
commonroutesServer/controllers/adminController.js
controllers/adminController.jsRaw
  1//File: controllers/userController.js
  2var mongoose = require('mongoose');
  3var adminModel = mongoose.model('adminModel');
  4var userModel = mongoose.model('userModel');
  5var notificationModel = mongoose.model('notificationModel');
  6var travelModel = mongoose.model('travelModel');
  7var travelCtrl = require('../controllers/travelController');
  8
  9var config = require('../config');
 10var pageSize = config.pageSize;
 11
 12/* */
 13var jwt = require('jsonwebtoken'); // used to create, sign, and verify tokens
 14var express = require("express");
 15var app = express();
 16var config = require('../config'); // get our config file
 17app.set('superSecret', config.secret); // secret variable
 18
 19var crypto = require('crypto');
 20/* */
 21
 22var request = require('request');
 23
 24
 25//POST - Insert a new User in the DB
 26exports.signup = function(req, res) {
 27    //get random avatar
 28    var r = getRand(1, 10);
 29    randAvatar = getAvatar(r);
 30
 31
 32    var user = new userModel({
 33        username: req.body.username,
 34        password: crypto.createHash('sha256').update(req.body.password).digest('base64'),
 35        description: req.body.description,
 36        avatar: randAvatar,
 37        email: req.body.email,
 38        phone: req.body.phone,
 39        telegram: req.body.telegram
 40    });
 41    if (user.username == undefined) {
 42        return res.status(500).jsonp("empty inputs");
 43    } else if (user.password == undefined) {
 44        return res.status(500).jsonp("empty inputs");
 45    } else if (user.email == undefined) {
 46        return res.status(500).jsonp("empty inputs");
 47    }
 48
 49    user.save(function(err, user) {
 50        if (err) return res.send(500, err.message);
 51
 52        exports.login(req, res);
 53    });
 54};
 55
 56
 57//POST - auth user
 58exports.login = function(req, res) {
 59    // find the user
 60    adminModel.findOne({
 61            username: req.body.username
 62        })
 63        .select('+password')
 64        .exec(function(err, user) {
 65
 66            if (err) throw err;
 67
 68            if (!user) {
 69                res.json({
 70                    success: false,
 71                    message: 'Authentication failed. User not found.'
 72                });
 73            } else if (user) {
 74
 75                req.body.password = crypto.createHash('sha256').update(req.body.password).digest('base64');
 76
 77                // check if password matches
 78                if (user.password != req.body.password) {
 79                    res.json({
 80                        success: false,
 81                        message: 'Authentication failed. Wrong password.'
 82                    });
 83                } else {
 84
 85                    // if user is found and password is right
 86                    // create a token
 87                    var token = jwt.sign({
 88                        foo: 'bar'
 89                    }, app.get('superSecret'), {
 90                        //expiresInMinutes: 1440 // expires in 24 hours
 91                        //expiresIn: '60m'
 92                    });
 93                    user.token = token;
 94                    user.save(function(err, user) {
 95                        if (err) return res.send(500, err.message);
 96                        //res.status(200).jsonp(travel);
 97                        console.log(user);
 98                        // return the information including token as JSON
 99                        user.password = "";
100                        res.json({
101                            success: true,
102                            message: 'Enjoy your token!',
103                            token: token,
104                            user: user
105                        });
106                    });
107
108                }
109
110            }
111
112        });
113};
114exports.changePassword = function(req, res) {
115    //if(req.body.)
116    userModel.update({
117            'token': req.headers['x-access-token']
118        }, req.body,
119        function(err) {
120            if (err) return console.log(err);
121            exports.getUserByToken(req, res);
122        });
123};
124
125
126exports.deleteTravel = function(req, res) {
127    adminModel.findOne({
128            'token': req.headers['x-access-token']
129        })
130        .exec(function(err, admin) {
131            if (!admin) {
132                res.json({
133                    success: false,
134                    message: 'Admin not found'
135                });
136            } else if (admin) {
137                if (err) return res.send(500, err.message);
138                travelModel.findById(req.params.travelid, function(err, travel) {
139                    if (err) return res.send(500, err.message);
140
141                    //add notification to the user who has created the travel
142                    userModel.findOne({
143                            _id: travel.user
144                        })
145                        .exec(function(err, user) {
146                            if (err) return res.send(500, err.message);
147                            if (!user) {
148                                //console.log("Notification not posible, user owner of the travel not exist");
149                            } else if (user) {
150                                var notification = new notificationModel({
151                                    concept: "admin",
152                                    message: "an admin has deleted your travel: " + travel.title,
153                                    date: new Date(),
154                                    icon: 'admin',
155                                    link: "users/" + user._id,
156                                    user: user._id
157                                });
158                                notification.save(function(err, notification) {
159                                    if (err) return res.send(500, err.message);
160
161                                    user.notifications.push(notification._id);
162                                    user.save(function(err, user) {
163                                        if (err) return res.send(500, err.message);
164
165                                        //notification added to user
166                                    });
167                                });
168                            }
169                        });
170                    travel.remove(function(err) {
171                        if (err) return res.send(500, err.message);
172
173                        travelCtrl.getAllTravels(req, res);
174                    });
175                });
176            }
177        });
178};
179
180exports.deleteUser = function(req, res) {
181    adminModel.findOne({
182            'token': req.headers['x-access-token']
183        })
184        .exec(function(err, admin) {
185            if (!admin) {
186                res.json({
187                    success: false,
188                    message: 'Admin not found'
189                });
190            } else if (admin) {
191                if (err) return res.send(500, err.message);
192                userModel.findOne({
193                        _id: req.params.userid
194                    })
195                    .exec(function(err, user) {
196                        if (err) return res.send(500, err.message);
197                        if (!user) {
198                            res.json({
199                                success: false,
200                                message: 'Delete user not posible, user not exist'
201                            });
202                        } else if (user) {
203                            //delete all the travels of this user
204                            travelModel.find({
205                                user: user._id
206                            }).remove().exec(function(err, data) {});
207
208                            //delete all the comments of this user
209
210                            //now delete user
211                            user.remove(function(err) {
212                                if (err) return res.send(500, err.message);
213
214                                res.status(200).jsonp("deleted");
215                            });
216                        }
217                    });
218            }
219        });
220};
221
222function isNodeInNodes(node, nodes) {
223    for (var i = 0; i < nodes.length; i++) {
224        if (node.title == nodes[i].title) {
225            return (i);
226        }
227    }
228    return (-1);
229}
230exports.network = function(req, res) {
231    adminModel.findOne({
232            'token': req.headers['x-access-token']
233        })
234        .exec(function(err, admin) {
235            if (!admin) {
236                res.json({
237                    success: false,
238                    message: 'Admin not found'
239                });
240            } else if (admin) {
241                if (err) return res.send(500, err.message);
242                userModel.find()
243                    .limit(pageSize)
244                    .skip(pageSize * Number(req.query.page))
245                    .lean()
246                    //.populate({path: 'travels', populate: {path: 'joins', populate: {path: 'username'}}})
247                    .populate('travels', 'title type joins')
248                    .populate('likes', 'username avatar')
249                    .exec(function(err, users) {
250                        if (err) return res.send(500, err.message);
251
252                        /*res.status(200).jsonp(users);*/
253                        var nodes = [];
254                        var edges = [];
255                        for (var i = 0; i < users.length; i++) {
256                            var node = {
257                                title: users[i].username,
258                                label: users[i].username,
259                                image: users[i].avatar,
260                                shape: "image",
261                                id: users[i]._id,
262                                group: users[i]._id
263                            };
264                            var lNode = isNodeInNodes(node, nodes);
265                            if (lNode < 0) {
266                                nodes.push(node);
267                                var uNode = nodes.length - 1;
268                            }
269                            for (var j = 0; j < users[i].likes.length; j++) {
270                                /*console.log(i + ", " + j);
271                                console.log(nodes);*/
272                                var node = {
273                                    title: users[i].likes[j].username,
274                                    label: users[i].likes[j].username,
275                                    image: users[i].likes[j].avatar,
276                                    shape: "image",
277                                    id: users[i].likes[j]._id
278                                };
279                                var lNode = isNodeInNodes(node, nodes);
280                                if (lNode < 0) {
281                                    //node no exist
282                                    nodes.push(node);
283                                    lNode = nodes.length - 1;
284                                } else {
285                                    //node already exist
286
287                                }
288                                var edge = {
289                                    from: users[i]._id,
290                                    to: users[i].likes[j]._id,
291                                    label: "like",
292                                    arrows: "to",
293                                    color: {
294                                        color: "#E57373" //red300
295                                    }
296                                };
297                                edges.push(edge);
298                            }
299                            for (var j = 0; j < users[i].travels.length; j++) {
300                                /*console.log(i + ", " + j);
301                                console.log(nodes);*/
302                                var node = {
303                                    title: users[i].travels[j].title,
304                                    label: users[i].travels[j].title,
305                                    image: "img/" + users[i].travels[j].type + ".png",
306                                    shape: "image",
307                                    id: users[i].travels[j]._id,
308                                    value: "0.5",
309                                    group: users[i]._id
310                                };
311                                var lNode = isNodeInNodes(node, nodes);
312                                if (lNode < 0) {
313                                    //node no exist
314                                    nodes.push(node);
315                                    lNode = nodes.length - 1;
316                                } else {
317                                    //node already exist
318
319                                }
320                                var edge = {
321                                    from: users[i]._id,
322                                    to: users[i].travels[j]._id,
323                                    color: {
324                                        color: "#616161" //grey
325                                    }
326                                };
327                                edges.push(edge);
328
329                                //users joining travels
330                                /*for(var k=0; k<users[i].travels[j].joins.length; k++){
331                                    var node = {
332                                        title: users[i].travels[j].joins[k].username,
333                                        label: users[i].travels[j].joins[k].username,
334                                        image: users[i].travels[j].joins[k].avatar,
335                                        shape: "image",
336                                        id: users[i].travels[j].joins[k]._id
337                                    };
338                                    var lNode = isNodeInNodes(node, nodes);
339                                    if (lNode<0){
340                                        //node no exist
341                                        nodes.push(node);
342                                        lNode = nodes.length -1;
343                                    }
344                                    var edge={
345                                        from: users[i].travels[j].joins[k]._id,
346                                        to: users[i].travels[j]._id,
347                                        color: {
348                                            color: "#4DD0E1"//cyan300
349                                        }
350                                    };
351                                    edges.push(edge);
352                                }*/
353                            }
354
355                        }
356                        var resp = {
357                            nodes: nodes,
358                            edges: edges
359                        };
360                        res.status(200).jsonp(resp);
361                    });
362            }
363        });
364};
365exports.getUserNetwork = function(req, res) {
366    adminModel.findOne({
367            'token': req.headers['x-access-token']
368        })
369        .exec(function(err, admin) {
370            if (!admin) {
371                res.json({
372                    success: false,
373                    message: 'Admin not found'
374                });
375            } else if (admin) {
376                if (err) return res.send(500, err.message);
377                userModel.findOne({
378                        _id: req.params.userid
379                    })
380                    .lean()
381                    .populate('travels', 'title type joins')
382                    .populate('likes', 'username avatar')
383                    .exec(function(err, user) {
384                        if (err) return res.send(500, err.message);
385
386                        /*res.status(200).jsonp(users);*/
387                        var nodes = [];
388                        var edges = [];
389                        //for (var i = 0; i < users.length; i++) {
390                            var node = {
391                                title: user.username,
392                                label: user.username,
393                                image: user.avatar,
394                                shape: "image",
395                                id: user._id,
396                                group: user._id
397                            };
398                            var lNode = isNodeInNodes(node, nodes);
399                            if (lNode < 0) {
400                                nodes.push(node);
401                                var uNode = nodes.length - 1;
402                            }
403                            for (var j = 0; j < user.likes.length; j++) {
404                                /*console.log(i + ", " + j);
405                                console.log(nodes);*/
406                                var node = {
407                                    title: user.likes[j].username,
408                                    label: user.likes[j].username,
409                                    image: user.likes[j].avatar,
410                                    shape: "image",
411                                    id: user.likes[j]._id
412                                };
413                                var lNode = isNodeInNodes(node, nodes);
414                                if (lNode < 0) {
415                                    //node no exist
416                                    nodes.push(node);
417                                    lNode = nodes.length - 1;
418                                } else {
419                                    //node already exist
420
421                                }
422                                var edge = {
423                                    from: user._id,
424                                    to: user.likes[j]._id,
425                                    label: "like",
426                                    arrows: "to",
427                                    color: {
428                                        color: "#E57373" //red300
429                                    }
430                                };
431                                edges.push(edge);
432                            }
433                            for (var j = 0; j < user.travels.length; j++) {
434                                /*console.log(i + ", " + j);
435                                console.log(nodes);*/
436                                var node = {
437                                    title: user.travels[j].title,
438                                    label: user.travels[j].title,
439                                    image: "img/" + user.travels[j].type + ".png",
440                                    shape: "image",
441                                    id: user.travels[j]._id,
442                                    value: "0.5",
443                                    group: user._id
444                                };
445                                var lNode = isNodeInNodes(node, nodes);
446                                if (lNode < 0) {
447                                    //node no exist
448                                    nodes.push(node);
449                                    lNode = nodes.length - 1;
450                                } else {
451                                    //node already exist
452
453                                }
454                                var edge = {
455                                    from: user._id,
456                                    to: user.travels[j]._id,
457                                    color: {
458                                        color: "#616161" //grey
459                                    }
460                                };
461                                edges.push(edge);
462                            }
463                            //add users that has add like to the user
464                            userModel.find({
465                                    likes: req.params.userid
466                                })
467                                .exec(function(err, users) {
468                                    for (var i = 0; i < users.length; i++) {
469                                        /*console.log(i + ", " + j);
470                                        console.log(nodes);*/
471                                        var node = {
472                                            title: users[i].username,
473                                            label: users[i].username,
474                                            image: users[i].avatar,
475                                            shape: "image",
476                                            id: users[i]._id
477                                        };
478                                        var lNode = isNodeInNodes(node, nodes);
479                                        if (lNode < 0) {
480                                            //node no exist
481                                            nodes.push(node);
482                                            lNode = nodes.length - 1;
483                                        } else {
484                                            //node already exist
485
486                                        }
487                                        var edge = {
488                                            from: users[i]._id,
489                                            to: req.params.userid,
490                                            label: "like",
491                                            arrows: "to",
492                                            color: {
493                                                color: "#E57373" //red300
494                                            }
495                                        };
496                                        edges.push(edge);
497                                    }
498
499                                    var resp = {
500                                        nodes: nodes,
501                                        edges: edges
502                                    };
503                                    res.status(200).jsonp(resp);
504                                });
505
506                        //}
507
508                    });
509            }
510        });
511};