From ab06c16e5a7ceadb4840ad37ce9574c627048f4c Mon Sep 17 00:00:00 2001 From: lykmapipo Date: Mon, 30 Sep 2019 16:39:54 +0300 Subject: [PATCH] feat: add permissionsFor helper --- src/index.js | 54 +++++++++++++++++++++++++++++++++++++++++++--- test/index.spec.js | 27 +++++++++++++++++++++++ 2 files changed, 78 insertions(+), 3 deletions(-) diff --git a/src/index.js b/src/index.js index 01d6130..9bd67e7 100644 --- a/src/index.js +++ b/src/index.js @@ -39,6 +39,7 @@ import { orderBy, reduce, some, + startCase, toLower, toString, toUpper, @@ -437,9 +438,9 @@ export const pkg = (path, ...field) => { /** * @function scopesFor * @name scopesFor - * @description Generate resource scopes(permissions) - * @param {...string} resources resources - * @returns {Array} resources scopes + * @description Generate resource scopes + * @param {...string} resources valid resources + * @returns {string[]} resources scopes * @author lally elias * @license MIT * @since 0.6.0 @@ -481,6 +482,53 @@ export const scopesFor = (...resources) => { return scopes; }; +/** + * @function permissionsFor + * @name permissionsFor + * @description Generate resource permissions + * @param {...string} resources valid resources + * @returns {object[]} resources permissions + * @author lally elias + * @license MIT + * @since 0.28.0 + * @version 0.1.0 + * @static + * @public + * @example + * + * const permissions = permissionsFor('User') + * // => [{resource: 'User', wildcard: 'user:create', action: ...}, ....]; + */ +export const permissionsFor = (...resources) => { + // initialize resources permissions + let permissions = []; + + // generate resources permissions + if (resources) { + // copy unique resources + const copyOfResources = uniq([...resources]); + + // create permissions(permissions) per resource + forEach(copyOfResources, resource => { + // prepare resource permissions + const resourcePermissions = map(RESOURCE_ACTIONS, action => { + return { + resource, + action: toLower(action), + description: startCase(`${action} ${resource}`), + wildcard: toLower([resource, action].join(':')), + }; + }); + + // collect resource permissions + permissions = [...permissions, ...resourcePermissions]; + }); + } + + // return resources permissions + return permissions; +}; + /** * @function abbreviate * @name abbreviate diff --git a/test/index.spec.js b/test/index.spec.js index c95a344..84697fc 100644 --- a/test/index.spec.js +++ b/test/index.spec.js @@ -1,3 +1,4 @@ +import { _ } from 'lodash'; import { expect } from '@lykmapipo/test-helpers'; import { isNotValue, @@ -10,6 +11,7 @@ import { sortedUniq, pkg, scopesFor, + permissionsFor, abbreviate, idOf, assign, @@ -199,6 +201,31 @@ describe('common', () => { ); }); + it('should create permissions for resources', () => { + const permissions = permissionsFor('User', 'Payment'); + expect(permissions).to.exist; + expect(_.map(permissions, 'wildcard')).to.include( + 'user:create', + 'user:view', + 'user:edit', + 'user:delete', + 'user:share', + 'user:print', + 'user:import', + 'user:export', + 'user:download', + 'payment:create', + 'payment:view', + 'payment:edit', + 'payment:delete', + 'payment:share', + 'payment:print', + 'payment:import', + 'payment:export', + 'payment:download' + ); + }); + it('should abbreviate a phrase', () => { const abbreviation = abbreviate('Ministry of Finance'); expect(abbreviation).to.exist;