Source: management-system/src/frontend/helpers/iam/permissions/permissions-handler.js

import { PERMISSION_MAPPING } from '@/shared-frontend-backend/constants/index.js';

/**
 * translates a permissions number into a list of permissions
 *
 * @param {Number} permission - permissions as a number
 * @returns {Array} - array of permissions such as ['view', 'edit']
 */
export const translatePermissionToList = async (permission) => {
  const permissionsList = [];
  const permissions = Object.keys(PERMISSION_MAPPING).reverse();
  permissions.forEach((perm) => {
    if (PERMISSION_MAPPING[perm] <= permission && permission > 0) {
      permissionsList.push(perm);
      permission -= PERMISSION_MAPPING[perm];
    }
  });
  return permissionsList;
};

/**
 * translates a permission list into a permissions number
 *
 * @param {Array} list - array of permissions such as ['view', 'edit']
 * @returns {Number} - permission as a number
 */
export const translateListToPermission = async (list) => {
  let permission = 0;
  list.forEach((permissionName) => {
    permission += PERMISSION_MAPPING[permissionName];
  });
  return permission;
};

/**
 * initializes permissions for each individual resource that is loaded in stores on initial page load
 *
 * @param {Array} resource - an array of resources
 * @returns {Object} - permissions object
 */
export const initResourcePermissions = async (resources) => {
  const permissions = {};
  resources.forEach((process) => {
    if (process.owner) {
      const type = process.type[0].toUpperCase() + process.type.slice(1);
      if (!permissions[type]) {
        permissions[type] = {
          conditions: {
            [process.id]: process.permissions,
          },
        };
      } else {
        permissions[type].conditions = {
          ...permissions[type].conditions,
          [process.id]: process.permissions,
        };
      }
    }
  });
  return permissions;
};

/**
 * adds a new permission depending on role permissions for a newly created resource
 *
 * @param {Object} resource - resource object
 * @param {Object} userPermissions - user permissions object from auth store
 * @returns {Object} - permission object
 */
export const addResourcePermission = async (resource, userPermissions) => {
  const type = resource.type[0].toUpperCase() + resource.type.slice(1);

  if (userPermissions[type] && userPermissions[type].actions) {
    const permission = {
      [type]: {
        conditions: {
          [resource.id]: userPermissions[type].actions,
        },
      },
    };
    return permission;
  }

  throw new Error('No resource permissions available!');
};