34 lines
1.1 KiB
TypeScript
34 lines
1.1 KiB
TypeScript
|
import { defineStore } from "pinia";
|
||
|
import type { PermissionModule, PermissionObject, PermissionSection, PermissionType } from "../types/permissionTypes";
|
||
|
|
||
|
export const useAbilityStore = defineStore("ability", {
|
||
|
state: () => {
|
||
|
return {
|
||
|
permissions: {} as PermissionObject,
|
||
|
};
|
||
|
},
|
||
|
getters: {
|
||
|
can:
|
||
|
(state) =>
|
||
|
(type: PermissionType | "admin", section: PermissionSection, module?: PermissionModule): boolean => {
|
||
|
const permissions = state.permissions;
|
||
|
if (type == "admin") return permissions.admin ?? false;
|
||
|
if (permissions.admin) return true;
|
||
|
if (
|
||
|
(!module && permissions[section] != undefined) ||
|
||
|
permissions[section]?.all == "*" ||
|
||
|
permissions[section]?.all?.includes(type)
|
||
|
)
|
||
|
return true;
|
||
|
if (module && (permissions[section]?.[module] == "*" || permissions[section]?.[module]?.includes(type)))
|
||
|
return true;
|
||
|
return false;
|
||
|
},
|
||
|
},
|
||
|
actions: {
|
||
|
setAbility(permissions: PermissionObject) {
|
||
|
this.permissions = permissions;
|
||
|
},
|
||
|
},
|
||
|
});
|