2024-08-26 17:56:07 +02:00
|
|
|
import { defineStore } from "pinia";
|
2024-09-17 16:44:02 +02:00
|
|
|
import type { PermissionModule, PermissionObject, PermissionSection, PermissionType } from "@/types/permissionTypes";
|
2024-08-26 17:56:07 +02:00
|
|
|
|
|
|
|
export const useAbilityStore = defineStore("ability", {
|
|
|
|
state: () => {
|
|
|
|
return {
|
|
|
|
permissions: {} as PermissionObject,
|
2024-10-07 18:09:18 +02:00
|
|
|
isOwner: false as boolean,
|
2024-08-26 17:56:07 +02:00
|
|
|
};
|
|
|
|
},
|
|
|
|
getters: {
|
|
|
|
can:
|
|
|
|
(state) =>
|
|
|
|
(type: PermissionType | "admin", section: PermissionSection, module?: PermissionModule): boolean => {
|
|
|
|
const permissions = state.permissions;
|
2024-10-07 18:09:18 +02:00
|
|
|
if (state.isOwner) return true;
|
2024-09-01 14:54:49 +02:00
|
|
|
if (type == "admin") return permissions?.admin ?? false;
|
|
|
|
if (permissions?.admin) return true;
|
2024-08-26 17:56:07 +02:00
|
|
|
if (
|
2024-08-27 11:46:24 +02:00
|
|
|
(!module &&
|
|
|
|
permissions[section] != undefined &&
|
|
|
|
(permissions[section]?.all == "*" || permissions[section]?.all?.includes(type))) ||
|
|
|
|
permissions[section]?.all == "*" ||
|
|
|
|
permissions[section]?.all?.includes(type)
|
|
|
|
)
|
|
|
|
return true;
|
|
|
|
if (module && (permissions[section]?.[module] == "*" || permissions[section]?.[module]?.includes(type)))
|
|
|
|
return true;
|
|
|
|
return false;
|
|
|
|
},
|
2024-08-27 17:55:10 +02:00
|
|
|
canSection:
|
|
|
|
(state) =>
|
|
|
|
(type: PermissionType | "admin", section: PermissionSection): boolean => {
|
|
|
|
const permissions = state.permissions;
|
2024-10-07 18:09:18 +02:00
|
|
|
if (state.isOwner) return true;
|
2024-09-01 14:54:49 +02:00
|
|
|
if (type == "admin") return permissions?.admin ?? false;
|
|
|
|
if (permissions?.admin) return true;
|
2024-08-27 17:55:10 +02:00
|
|
|
if (
|
|
|
|
permissions[section]?.all == "*" ||
|
|
|
|
permissions[section]?.all?.includes(type) ||
|
|
|
|
permissions[section] != undefined
|
|
|
|
)
|
|
|
|
return true;
|
|
|
|
return false;
|
|
|
|
},
|
2024-08-27 11:46:24 +02:00
|
|
|
_can:
|
|
|
|
() =>
|
|
|
|
(
|
|
|
|
permissions: PermissionObject,
|
|
|
|
type: PermissionType | "admin",
|
|
|
|
section: PermissionSection,
|
|
|
|
module?: PermissionModule
|
|
|
|
): boolean => {
|
2024-10-07 18:09:18 +02:00
|
|
|
// ignores ownership
|
2024-09-01 14:54:49 +02:00
|
|
|
if (type == "admin") return permissions?.admin ?? false;
|
|
|
|
if (permissions?.admin) return true;
|
2024-08-27 11:46:24 +02:00
|
|
|
if (
|
|
|
|
(!module &&
|
|
|
|
permissions[section] != undefined &&
|
|
|
|
(permissions[section]?.all == "*" || permissions[section]?.all?.includes(type))) ||
|
2024-08-26 17:56:07 +02:00
|
|
|
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: {
|
2024-10-07 18:09:18 +02:00
|
|
|
setAbility(permissions: PermissionObject, isOwner: boolean) {
|
2024-08-26 17:56:07 +02:00
|
|
|
this.permissions = permissions;
|
2024-10-07 18:09:18 +02:00
|
|
|
this.isOwner = isOwner;
|
2024-08-26 17:56:07 +02:00
|
|
|
},
|
|
|
|
},
|
|
|
|
});
|