RouteInjector/route-injector

View on GitHub
lib/app/internals/auth/PermissionsLoader.js

Summary

Maintainability
D
2 days
Test Coverage
"use strict";
///<reference path='../../../../typings/index.d.ts'/>
var Logger = require("./../Logger");
var ExpressManager = require("./../ExpressManager");
var _ = require("lodash");
/**
 * Permissions Loader loads permissions from config/permissions.js and then it merges with defined permissions per model
 */
var PermissionsLoader = /** @class */ (function () {
    function PermissionsLoader(config, modelsLoader) {
        this.roles = [];
        this.holder = {
            routes: {}
        };
        ExpressManager.logger.trace("Creating PermissionsLoader instance");
        this.config = config;
        this.modelsLoader = modelsLoader;
        this.generatePermissions();
    }
    PermissionsLoader.create = function (config, modelsLoader) {
        return new PermissionsLoader(config, modelsLoader);
    };
    PermissionsLoader.prototype.getRoles = function () {
        return this.roles;
    };
    PermissionsLoader.prototype.getPermisisons = function () {
        return this.holder;
    };
    PermissionsLoader.prototype.getPermissionsByRole = function () {
        return this.processAllPermissionsByRole();
    };
    PermissionsLoader.prototype.generatePermissions = function () {
        ExpressManager.logger.trace("Process Models");
        this.processModels();
        ExpressManager.logger.trace("Assign");
        _.assign(this.holder, this.config.permissions);
        ExpressManager.logger.trace("CProcess Routes");
        this.processRoutes();
    };
    PermissionsLoader.prototype.processModels = function () {
        var _this = this;
        this.modelsLoader.forEachModel(function (Model) {
            PermissionsLoader.logger.trace("Model: %s", Model.modelName);
            var m = Model.injector();
            _this.holder.routes[Model.modelName] = {
                get: _this.addRoles(m.get),
                put: _this.addRoles(m.put),
                post: _this.addRoles(m.post),
                delete: _this.addRoles(m.delete),
                search: _this.addRoles(m.search),
                import: _this.addRoles(m.import),
                export: _this.addRoles(m.export),
                menu: _this.addRoles(m.menu)
            };
        });
    };
    PermissionsLoader.prototype.processRoutes = function () {
        var _this = this;
        var verbs = ['get', 'put', 'post', 'delete', 'search', 'import', 'export', 'menu'];
        PermissionsLoader.logger.trace("Process Routes:");
        Object.keys(this.holder.routes).forEach(function (route) {
            PermissionsLoader.logger.trace("\t Route: %s", route);
            verbs.forEach(function (verb) {
                PermissionsLoader.logger.trace("\t\t Verb: %s", verb);
                _this.holder.routes[route][verb] = _.union(_this.holder.routes[route][verb], _this.holder.routes[route]["all"]);
                _this.roles = _.union(_this.roles, _this.holder.routes[route][verb]);
            });
        });
    };
    PermissionsLoader.prototype.addRoles = function (r) {
        if (r && r.roles) {
            this.roles = _.union(this.roles, r.roles);
            return r.roles;
        }
        else {
            return undefined;
        }
    };
    PermissionsLoader.prototype.processAllPermissionsByRole = function () {
        var result = {};
        var allModels = Object.keys(this.holder.routes);
        var verbs = ["get", "post", "delete", "search", "put", "export", "import", "menu"];
        for (var modelName in this.holder.routes) {
            var model = this.holder.routes[modelName];
            for (var verb in model) {
                if (model.hasOwnProperty(verb)) {
                    var route = model[verb];
                    for (var role in route) {
                        if (route.hasOwnProperty(role)) {
                            var userRole = route[role];
                            if (!result[userRole])
                                result[userRole] = {};
                            if (!result[userRole][modelName])
                                result[userRole][modelName] = {};
                            result[userRole][modelName][verb] = true;
                        }
                    }
                }
            }
        }
        for (var r in this.roles) {
            if (this.roles.hasOwnProperty(r)) {
                var role = this.roles[r];
                for (var m in allModels) {
                    if (allModels.hasOwnProperty(m)) {
                        var model = allModels[m];
                        for (var v in verbs) {
                            var verb = verbs[v];
                            if (this.holder.routes[model][verb].indexOf(role) == -1) {
                                if (!result[role][model]) {
                                    result[role][model] = {};
                                }
                                result[role][model][verb] = false;
                            }
                        }
                    }
                }
            }
        }
        return result;
    };
    PermissionsLoader.logger = Logger.getLogger();
    return PermissionsLoader;
}());
module.exports = PermissionsLoader;
//# sourceMappingURL=PermissionsLoader.js.map