203 lines
6.3 KiB
TypeScript
203 lines
6.3 KiB
TypeScript
export enum PermissionGroupEnum {
|
|
SERVICES = "services",
|
|
CUSTOMERS = "customers",
|
|
USERS = "users",
|
|
FINANCIAL = "financial",
|
|
CONTENT = "content",
|
|
SUPPORT = "support",
|
|
OTHER = "other",
|
|
PRODUCTS = "products",
|
|
REPRESENTATIVES = "representatives",
|
|
TASK_MANAGER = "task_manager",
|
|
}
|
|
|
|
export const PERMISSION_GROUP_ORDER: PermissionGroupEnum[] = [
|
|
PermissionGroupEnum.SERVICES,
|
|
PermissionGroupEnum.CUSTOMERS,
|
|
PermissionGroupEnum.USERS,
|
|
PermissionGroupEnum.FINANCIAL,
|
|
PermissionGroupEnum.CONTENT,
|
|
PermissionGroupEnum.SUPPORT,
|
|
PermissionGroupEnum.OTHER,
|
|
PermissionGroupEnum.PRODUCTS,
|
|
PermissionGroupEnum.REPRESENTATIVES,
|
|
PermissionGroupEnum.TASK_MANAGER,
|
|
];
|
|
|
|
export enum PermissionEnum {
|
|
SERVICES_CREATE = "services_create",
|
|
SERVICES_READ = "services_read",
|
|
SERVICES_UPDATE = "services_update",
|
|
SERVICES_DELETE = "services_delete",
|
|
|
|
CUSTOMERS_CREATE = "customers_create",
|
|
CUSTOMERS_READ = "customers_read",
|
|
CUSTOMERS_UPDATE = "customers_update",
|
|
CUSTOMERS_DELETE = "customers_delete",
|
|
|
|
AGENTS_CREATE = "agents_create",
|
|
AGENTS_READ = "agents_read",
|
|
AGENTS_UPDATE = "agents_update",
|
|
AGENTS_DELETE = "agents_delete",
|
|
|
|
DEVELOPERS_CREATE = "developers_create",
|
|
DEVELOPERS_READ = "developers_read",
|
|
DEVELOPERS_UPDATE = "developers_update",
|
|
DEVELOPERS_DELETE = "developers_delete",
|
|
|
|
INVOICES_CREATE = "invoices_create",
|
|
INVOICES_READ = "invoices_read",
|
|
INVOICES_UPDATE = "invoices_update",
|
|
INVOICES_DELETE = "invoices_delete",
|
|
|
|
TRANSACTIONS_CREATE = "transactions_create",
|
|
TRANSACTIONS_READ = "transactions_read",
|
|
TRANSACTIONS_UPDATE = "transactions_update",
|
|
TRANSACTIONS_DELETE = "transactions_delete",
|
|
|
|
DISCOUNTS_CREATE = "discounts_create",
|
|
DISCOUNTS_READ = "discounts_read",
|
|
DISCOUNTS_UPDATE = "discounts_update",
|
|
DISCOUNTS_DELETE = "discounts_delete",
|
|
|
|
ADMINS_CREATE = "admins_create",
|
|
ADMINS_READ = "admins_read",
|
|
ADMINS_UPDATE = "admins_update",
|
|
ADMINS_DELETE = "admins_delete",
|
|
|
|
TICKETS_CREATE = "tickets_create",
|
|
TICKETS_READ = "tickets_read",
|
|
TICKETS_UPDATE = "tickets_update",
|
|
TICKETS_DELETE = "tickets_delete",
|
|
|
|
CRITICISMS_CREATE = "criticisms_create",
|
|
CRITICISMS_READ = "criticisms_read",
|
|
CRITICISMS_UPDATE = "criticisms_update",
|
|
CRITICISMS_DELETE = "criticisms_delete",
|
|
|
|
CONTACTS_US_CREATE = "contacts_us_create",
|
|
CONTACTS_US_READ = "contacts_us_read",
|
|
CONTACTS_US_UPDATE = "contacts_us_update",
|
|
CONTACTS_US_DELETE = "contacts_us_delete",
|
|
|
|
ADVERTISEMENTS_CREATE = "advertisements_create",
|
|
ADVERTISEMENTS_READ = "advertisements_read",
|
|
ADVERTISEMENTS_UPDATE = "advertisements_update",
|
|
ADVERTISEMENTS_DELETE = "advertisements_delete",
|
|
|
|
ANNOUNCEMENTS_CREATE = "announcements_create",
|
|
ANNOUNCEMENTS_READ = "announcements_read",
|
|
ANNOUNCEMENTS_UPDATE = "announcements_update",
|
|
ANNOUNCEMENTS_DELETE = "announcements_delete",
|
|
|
|
BLOGS_CREATE = "blogs_create",
|
|
BLOGS_READ = "blogs_read",
|
|
BLOGS_UPDATE = "blogs_update",
|
|
BLOGS_DELETE = "blogs_delete",
|
|
|
|
LEARNINGS_CREATE = "learnings_create",
|
|
LEARNINGS_READ = "learnings_read",
|
|
LEARNINGS_UPDATE = "learnings_update",
|
|
LEARNINGS_DELETE = "learnings_delete",
|
|
|
|
SETTINGS_CREATE = "settings_create",
|
|
SETTINGS_READ = "settings_read",
|
|
SETTINGS_UPDATE = "settings_update",
|
|
SETTINGS_DELETE = "settings_delete",
|
|
|
|
BANK_ACCOUNTS_CREATE = "bank_accounts_create",
|
|
BANK_ACCOUNTS_READ = "bank_accounts_read",
|
|
BANK_ACCOUNTS_UPDATE = "bank_accounts_update",
|
|
BANK_ACCOUNTS_DELETE = "bank_accounts_delete",
|
|
|
|
PAYMENTS_CREATE = "payments_create",
|
|
PAYMENTS_READ = "payments_read",
|
|
PAYMENTS_UPDATE = "payments_update",
|
|
PAYMENTS_DELETE = "payments_delete",
|
|
|
|
SUPPORT_PLAN_CREATE = "support_plan_create",
|
|
SUPPORT_PLAN_READ = "support_plan_read",
|
|
SUPPORT_PLAN_UPDATE = "support_plan_update",
|
|
SUPPORT_PLAN_DELETE = "support_plan_delete",
|
|
|
|
RESELLER_CREATE = "reseller_create",
|
|
RESELLER_READ = "reseller_read",
|
|
RESELLER_UPDATE = "reseller_update",
|
|
RESELLER_DELETE = "reseller_delete",
|
|
|
|
WORKSPACE_CREATE = "workspace_create",
|
|
WORKSPACE_READ = "workspace_read",
|
|
WORKSPACE_UPDATE = "workspace_update",
|
|
WORKSPACE_DELETE = "workspace_delete",
|
|
|
|
PROJECT_CREATE = "project_create",
|
|
PROJECT_READ = "project_read",
|
|
PROJECT_UPDATE = "project_update",
|
|
PROJECT_DELETE = "project_delete",
|
|
|
|
TASK_CREATE = "task_create",
|
|
TASK_READ = "task_read",
|
|
TASK_UPDATE = "task_update",
|
|
TASK_DELETE = "task_delete",
|
|
|
|
TASK_PHASE_CREATE = "task_phase_create",
|
|
TASK_PHASE_READ = "task_phase_read",
|
|
TASK_PHASE_UPDATE = "task_phase_update",
|
|
TASK_PHASE_DELETE = "task_phase_delete",
|
|
|
|
LOGS = "logs",
|
|
MANAGE_SSO_CLIENTS = "manage_sso_clients",
|
|
DMENU = "dmenu",
|
|
DKALA = "dkala",
|
|
DPAGE = "dpage",
|
|
DMAIL = "dmail",
|
|
}
|
|
|
|
const CRUD_ACTIONS = ["create", "read", "update", "delete"] as const;
|
|
|
|
export const CONTENT_PERMISSION_RESOURCES = ["blogs", "learnings", "advertisements", "announcements"] as const;
|
|
export const FINANCIAL_PERMISSION_RESOURCES = ["payments", "invoices", "transactions", "discounts", "bank_accounts"] as const;
|
|
export const SUPPORT_PERMISSION_RESOURCES = ["support_plan", "tickets"] as const;
|
|
export const TASK_MANAGER_PERMISSION_RESOURCES = ["workspace", "project", "task", "task_phase"] as const;
|
|
export const USERS_SIDEBAR_PERMISSION_RESOURCES = ["admins"] as const;
|
|
export const PRODUCT_PERMISSION_RESOURCES = ["dmenu", "dkala", "dpage", "dmail"] as const;
|
|
|
|
type PermissionEntry = { name: string };
|
|
|
|
export const getPermissionNames = (permissions: PermissionEntry[] | undefined): string[] =>
|
|
permissions?.map((permission) => permission.name) ?? [];
|
|
|
|
export const hasPermission = (
|
|
permissions: PermissionEntry[] | undefined,
|
|
resourceOrPermission: string,
|
|
): boolean => {
|
|
const names = getPermissionNames(permissions);
|
|
|
|
if (names.includes(resourceOrPermission)) {
|
|
return true;
|
|
}
|
|
|
|
return CRUD_ACTIONS.some((action) => names.includes(`${resourceOrPermission}_${action}`));
|
|
};
|
|
|
|
export const hasAnyPermission = (
|
|
permissions: PermissionEntry[] | undefined,
|
|
resources: readonly string[],
|
|
): boolean => resources.some((resource) => hasPermission(permissions, resource));
|
|
|
|
export const canAccessMenuItem = (
|
|
permissions: PermissionEntry[] | undefined,
|
|
activeName?: string,
|
|
activeNames?: readonly string[],
|
|
): boolean => {
|
|
if (activeNames && activeNames.length > 0) {
|
|
return hasAnyPermission(permissions, activeNames);
|
|
}
|
|
|
|
if (!activeName) {
|
|
return true;
|
|
}
|
|
|
|
return hasPermission(permissions, activeName);
|
|
};
|