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