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