import { ActionTree, GetterTree, Module, MutationTree } from 'vuex'; import { handleFetch } from '../../api/helpers'; import PermissionStoreModel, { PermissionListModel, PermissionModel, PermissionTypes } from '../types/PermissionStoreModel'; import RootState from '../types/RootStateModel'; const namespaced = true; const state: PermissionStoreModel = { permissions: [], }; const actions: ActionTree = { $init({ dispatch }) { dispatch('fetchUserPermissions'); }, async fetchUserPermissions({ commit }) { const response = await handleFetch('/authorization/permissions'); commit('userPermissions', await response.json() as PermissionModel[]); }, }; const getters: GetterTree = { findPermission: (state) => (itemName: string): PermissionModel | undefined => { for (const permission of state.permissions) { const cmsItemName = permission.cmsItemName.match(/[^.]+$/g); if (!cmsItemName) { throw new Error('Could not convert permission cmsItemName to entity name'); } if (cmsItemName.toString().toLowerCase() === itemName.toLowerCase()) { return permission; } } }, getPermissions: (state, getters) => (itemName: string): PermissionListModel => { return { canRead: getters.hasPermission(itemName, PermissionTypes.Read), canUpdate: getters.hasPermission(itemName, PermissionTypes.Update), canCreate: getters.hasPermission(itemName, PermissionTypes.Create), canDelete: getters.hasPermission(itemName, PermissionTypes.Delete), }; }, hasPermission: (state, getters) => (itemName: string, permission: PermissionTypes): boolean => { const permissionEntity = getters.findPermission(itemName); // If no permission was found, default to having no permissions. if (!permissionEntity) { return false; } return permissionEntity.permission >= permission; }, canRead: (state, getters) => (itemName: string): boolean => { return getters.hasPermission(itemName, PermissionTypes.Read); }, canUpdate: (state, getters) => (itemName: string): boolean => { return getters.hasPermission(itemName, PermissionTypes.Update); }, canCreate: (state, getters) => (itemName: string): boolean => { return getters.hasPermission(itemName, PermissionTypes.Create); }, canDelete: (state, getters) => (itemName: string): boolean => { return getters.hasPermission(itemName, PermissionTypes.Delete); }, }; const mutations: MutationTree = { userPermissions(state, permissions: PermissionModel[]) { state.permissions = permissions; }, }; export const permissionStore: Module = { namespaced, state, getters, actions, mutations, };