4

I am working on a Role Based permissions, I have following array,

let Roles = {
  [
    { model: 'user', property: 'find', permission: 'allow' },
    { model: 'user', property: 'create', permission: 'allow' },
    { model: 'user', property: 'update', permission: 'deny' },
    { model: 'user', property: 'delete', permission: 'deny' }
  ],
  [
    { model: 'registration', property: 'find', permission: 'allow' },
    { model: 'registration', property: 'create', permission: 'deny' },
    { model: 'registration', property: 'update', permission: 'deny' },
    { model: 'registration', property: 'delete', permission: 'deny' }
  ]
  [
    { model: 'schedule', property: 'find', permission: 'allow' },
    { model: 'schedule', property: 'create', permission: 'allow' },
    { model: 'schedule', property: 'update', permission: 'allow' }
    { model: 'schedule', property: 'delete', permission: 'deny' }
  ]
}

and I am trying to get the following output

  let userPermissions = [{
  'menu_name': 'user',
  'canFetchData': true,
  'canCreateData': true,
  'canUpdateData': false,
  'canDeleteData': false,
}]

let registrationPermissions = [{
  'menu_name': 'registration',
  'canFetchData': true,
  'canCreateData': false,
  'canUpdateData': false,
  'canDeleteData': false,
}]

let schedulePermissions = [{
  'menu_name': 'schedule',
  'canFetchData': true,
  'canCreateData': true,
  'canUpdateData': true,
  'canDeleteData': false,
}]

the condition to generate the result would be , for a given model and property , if permission is allow , it should be true, else false.

I have tried by writing if condition and assign the value true , if condition matches . But for the second array the values are overriding

From the Roles array , Iam passing each array to the following function and returning the result

  private canFetchData;
  private canCreateData;
  private canUpdateData;
  private canDeleteData;

filterAndApplyPermission(data) {
for (let i = 0; i < data.length; i++) {
  if (data[i].property === 'find' && data[i].permission === 'ALLOW') {
    this.canFetchData = true;
  } else if (data[i].property === 'create' && data[i].permission === 'ALLOW') {
    this.canCreateData = true;
  } else if (data[i].property === 'update' && data[i].permission === 'ALLOW') {
    this.canUpdateData = true;
  } else if (data[i].property === 'delete' && data[i].permission === 'ALLOW') {
    this.canDeleteData = true;
  }
}

const grouped_permission = {
  'menu': data[0].model,
  'canFetchData': this.canFetchData,
  'canCreateData': this.canCreateData,
  'canUpdateData': this.canUpdateData,
  'canDeleteData': this.canDeleteData,
};
   return grouped_permission;
 }
7
  • 2
    Do you really want three arrays with only one object in them? Or do you just need the object? Commented Apr 24, 2018 at 11:03
  • It might be that the this in this.canFetchData = true; refers to the same object...still, we need some more code Commented Apr 24, 2018 at 11:03
  • 1
    Please provide the full context, what is the value of this in your code ? Commented Apr 24, 2018 at 11:04
  • Also take a few minutes to read minimal reproducible example. Providing enough code for others to run and reproduce problem will solve problem quickly Commented Apr 24, 2018 at 11:04
  • 1
    Also, the syntax of Roles seems to be wrong Commented Apr 24, 2018 at 11:16

2 Answers 2

1

You can use filter to find the array of permissions from a certain user:

roleInfo
.filter(roles=>roles[0].model==="schedule")[0]

Use reduce to create your object and switch for each property.

rolesForUser
.reduce(
  (info,item)=>{
    switch(item.property) {
      case 'find':
        info.canFetchData = (item.permission==='allow')?true:false
        break;
      //other cases
    }
    return info;
  },
  {menu_name : user}//initial info object with menu_name set to user
);

const roleInfo = [
  [
    { model: 'user', property: 'find', permission: 'allow' },
    { model: 'user', property: 'create', permission: 'allow' },
    { model: 'user', property: 'update', permission: 'deny' },
    { model: 'user', property: 'delete', permission: 'deny' }
  ],
  [
    { model: 'registration', property: 'find', permission: 'allow' },
    { model: 'registration', property: 'create', permission: 'deny' },
    { model: 'registration', property: 'update', permission: 'deny' },
    { model: 'registration', property: 'delete', permission: 'deny' }
  ],
  [
    { model: 'schedule', property: 'find', permission: 'allow' },
    { model: 'schedule', property: 'create', permission: 'allow' },
    { model: 'schedule', property: 'update', permission: 'allow' },
    { model: 'schedule', property: 'delete', permission: 'deny' }
  ]
];

const getRoleForUser = (user,roleInfo) =>
  roleInfo
  .filter(roles=>roles[0].model===user)[0]
  .reduce(
    (info,item)=>{
      switch (item.property) {
        case 'find':
          info.canFetchData = (item.permission==='allow')?true:false
          break;
        case 'create':
          info.canCreateData = (item.permission==='allow')?true:false
          break;
        case 'update':
          info.canUpdateData = (item.permission==='allow')?true:false
          break;
        case 'delete':
          info.canDeleteData = (item.permission==='allow')?true:false
          break;
        default:
          throw new Error(`${item.property} is an unknown permission`);
      }
      return info;
    },
    {menu_name : user}
  );

console.log(getRoleForUser("registration",roleInfo));

Sign up to request clarification or add additional context in comments.

Comments

1

As you mentioned in question

Role Based permissions, I have following array

You can define your permission object like this

const permissionObj = {
    find: 'canFetchData',
    create: 'canCreateData',
    update: 'canUpdateData',
    delete: 'canDeleteData'
}

You can iterate your array using reduce() function and use that permissionObj inside of reduce() function.

DEMO

const dataObj =[[{
            model: 'user',
            property: 'find',
            permission: 'allow'
        }, {
            model: 'user',
            property: 'create',
            permission: 'allow'
        }, {
            model: 'user',
            property: 'update',
            permission: 'deny'
        }, {
            model: 'user',
            property: 'delete',
            permission: 'deny'
        }],
         [{
            model: 'registration',
            property: 'find',
            permission: 'allow'
        }, {
            model: 'registration',
            property: 'create',
            permission: 'deny'
        }, {
            model: 'registration',
            property: 'update',
            permission: 'deny'
        }, {
            model: 'registration',
            property: 'delete',
            permission: 'deny'
        }],
         [{
            model: 'schedule',
            property: 'find',
            permission: 'allow'
        }, {
            model: 'schedule',
            property: 'create',
            permission: 'allow'
        }, {
            model: 'schedule',
            property: 'update',
            permission: 'allow'
        }, {
            model: 'schedule',
            property: 'delete',
            permission: 'deny'
        }]
    ],
    permissionObj = {
        find: 'canFetchData',
        create: 'canCreateData',
        update: 'canUpdateData',
        delete: 'canDeleteData'
    };

let result = dataObj.reduce((r, arr) => {
    let model = '',
        obj = arr.reduce((p, o) => {
            model = o.model;
            p[permissionObj[o.property]] = o.permission.toUpperCase() === 'ALLOW';
            return p;
        }, {})
    r[`${model}Permissions`] = [Object.assign(obj, {
        menu_name: model
    })];
    return r;
}, {});

console.log(result)
.as-console-wrapper {  max-height: 100% !important;  top: 0;}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.