usersController.js 5.2 KB
var crypto = require('crypto');
var mongoObjectID = require('mongodb').ObjectID;

var Controller = require('./controller.js');

var UsersController = function(config, cbMongoDbReady) {
    Controller.call(this, config, cbMongoDbReady);

    function uniq(a) {
        return a.sort().filter(function(item, pos, ary) {
            return !pos || item != ary[pos - 1];
        })
    }

    function index(req, res, next) {
        this.mongodb.collection('users').find({}).toArray(function(err, docs) {
            if (err) {
                res.end('Gagal ambil list user');
                return;
            }

            res.render('users.index.html', {
                title: 'Users',
                config: this.config,
                session: req.session,
                qs: req.query,
                url: req.url,
                path: req.path,
                users: docs,
            });
        });
    }

    function view(req, res, next) {
        this.mongodb.collection('users').find({_id: new mongoObjectID(req.params.id)}).limit(1).next(function(err, doc) {
            if (err) {
                res.send("Error retrieving data");
                return;
            }

            res.render(
                'users.view.html',
                {
                    title: doc.email,
                    session: req.session,
                    user: doc
                }
            );

        });
    }

    function addForm(req, res, next) {
        res.render(
            'users.add.html',
            {
                title: 'Add a new user',
                session: req.session
            }
        );
    }

    function addSave(req, res, next) {
        if (req.body.password1 != req.body.password2) {
            res.redirect("/users/add");
            return;
        }

        var passwordHash = crypto.createHash('sha256').update(req.body.password1).digest().toString('hex');
        var roles = req.body.roles.trim().split(/[\s,;]+/);
        var suppliers = req.body.suppliers.trim().toUpperCase().split(/[\s,;]+/);

        var user = {
            email: req.body.email,
            password: passwordHash,
            roles: roles,
            suppliers: suppliers
        }

        this.mongodb.collection('users').insertOne(user, function(err, r) {
            res.redirect('/users');
        });
    }

    function deleteCapabilityConfirmation(req, res, next) {
        if (!req.params.value_to_delete) {
            req.params.value_to_delete = '';
        }

        res.render(
            'users.capability.delete-confirmation.html',
            {
                title: 'Delete confirmation',
                session: req.session,
                user_id: req.params.user_id,
                user_email: req.params.user_email,
                capability: req.params.capability,
                value_to_delete: req.params.value_to_delete,
            }
        );
    }

    function deleteCapability(req, res, next) {
        if (!req.params.value_to_delete) {
            req.params.value_to_delete = '';
        }

        var pullValue = {};
        pullValue[req.params.capability] = req.params.value_to_delete;

        this.mongodb.collection('users').update(
            { _id: new mongoObjectID(req.params.user_id) },
            { $pull: pullValue },
            function(err, r) {

                if (err) {
                    res.send(err); return;
                }

                res.redirect('/users/view/' + req.params.user_id);
        });
    }

    function addCapabilityForm(req, res, next) {
        res.render(
            'users.capability.add.html',
            {
                title: 'Add a capability',
                session: req.session,
                user_id: req.params.user_id,
                user_email: req.params.user_email,
                capability: req.params.capability
            }
        );
    }

    function addCapability(req, res, next) {

        var values = uniq(req.body.new_capability.trim().split(/[\s,;]+/));

        var capabilityToPullBefore = {};
        capabilityToPullBefore[req.params.capability] = {
            $in: values
        }

        var capabilityToPush = {};
        capabilityToPush[req.params.capability] = {
            $each: values,
            $sort: 1
        };

        this.mongodb.collection('users').update(
            { _id: new mongoObjectID(req.body.user_id) },
            { $pull: capabilityToPullBefore },

            function(err, r) {

                if (err) { res.send(err); return; }

                this.mongodb.collection('users').update(
                    { _id: new mongoObjectID(req.body.user_id) },
                    { $push: capabilityToPush },

                    function(err, r) {

                        if (err) { res.send(err); return; }

                        res.redirect('/users/view/' + req.params.user_id);
                    }

                );
            }
        );
    }

    return {
        index: index,
        view: view,
        addForm: addForm,
        addSave: addSave,
        deleteCapability: deleteCapability,
        deleteCapabilityConfirmation: deleteCapabilityConfirmation,
        addCapabilityForm: addCapabilityForm,
        addCapability: addCapability,
    }
}

module.exports = UsersController;