Skip to content

Commit

Permalink
feat: add permissionsFor helper
Browse files Browse the repository at this point in the history
  • Loading branch information
lykmapipo committed Sep 30, 2019
1 parent 50b18ec commit ab06c16
Show file tree
Hide file tree
Showing 2 changed files with 78 additions and 3 deletions.
54 changes: 51 additions & 3 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ import {
orderBy,
reduce,
some,
startCase,
toLower,
toString,
toUpper,
Expand Down Expand Up @@ -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 <lallyelias87@gmail.com>
* @license MIT
* @since 0.6.0
Expand Down Expand Up @@ -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 <lallyelias87@gmail.com>
* @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
Expand Down
27 changes: 27 additions & 0 deletions test/index.spec.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { _ } from 'lodash';
import { expect } from '@lykmapipo/test-helpers';
import {
isNotValue,
Expand All @@ -10,6 +11,7 @@ import {
sortedUniq,
pkg,
scopesFor,
permissionsFor,
abbreviate,
idOf,
assign,
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit ab06c16

Please sign in to comment.