UNPKG

@incdevco/framework

Version:
142 lines (86 loc) 2.56 kB
var Promise = require('bluebird'); var Rule = require('./rule'); function Acl() { 'use strict'; this.rules = {}; /* this.allow('Administrator', '*', '*'); this.allow('User', 'account', [ 'view', 'view:balance', 'view:client_id', 'view:id', 'view:limit', 'view:name', 'view:status' ], assertions.isAccountUser); this.allow('User', 'account_transaction', [ 'view', 'view:account_id', 'view:amount', 'view:content', 'view:id', 'view:payment_id', 'view:user_id' ], assertions.isAccountUser); this.allow('User', 'account_user', [ 'view', 'view:account_id', 'view:permissions', 'view:user_id' ], assertions.isAccountUser); */ } Acl.prototype.allow = function (role, resources, privileges, assertion) { 'use strict'; var rule, self = this; if (!Array.isArray(resources)) { resources = [resources]; } if (!Array.isArray(privileges)) { privileges = [privileges]; } rule = new Rule(role, assertion); resources.forEach(function (resource) { privileges.forEach(function(privilege) { self.rules[resource] = self.rules[resource] || {}; self.rules[resource][privilege] = self.rules[resource][privilege] || []; self.rules[resource][privilege].push(rule); }); }); return this; }; Acl.prototype.isAllowed = function (event, resource, privilege, context) { 'use strict'; var promise = Promise.reject(false), promises = [], rules = []; if (this.rules['*']) { if (this.rules['*']['*']) { this.rules['*']['*'].forEach(function (rule) { rules.push(rule); }); } if (this.rules['*'][privilege]) { this.rules['*'][privilege].forEach(function (rule) { rules.push(rule); }); } } if (this.rules[resource]) { if (this.rules[resource][privilege]) { this.rules[resource][privilege].forEach(function (rule) { rules.push(rule); }); } } rules.forEach(function(rule) { //promises.push(rule.isAllowed(event, resource, privilege, context)); promise = promise.catch(function () { return rule.isAllowed(event, resource, privilege, context); }); }); return promise .catch(function () { throw new Error('Not Allowed'); }); }; module.exports = Acl;