From 087f7fe216d1aa3deccc826dbd67c22377b59f70 Mon Sep 17 00:00:00 2001 From: Henry Date: Mon, 26 Jan 2026 14:34:45 +0000 Subject: [PATCH] feat: setup default permissions --- packages/shared/src/permissions.ts | 164 +++++++++++++++++++++++++++++ 1 file changed, 164 insertions(+) create mode 100644 packages/shared/src/permissions.ts diff --git a/packages/shared/src/permissions.ts b/packages/shared/src/permissions.ts new file mode 100644 index 00000000..16a2019f --- /dev/null +++ b/packages/shared/src/permissions.ts @@ -0,0 +1,164 @@ +export const permissionActions = [ + "view", + "create", + "edit", + "delete", + "manage", +] as const; +export type PermissionAction = (typeof permissionActions)[number]; + +export const permissionResources = [ + "workspace", + "board", + "list", + "card", + "comment", + "member", +] as const; +export type PermissionResource = (typeof permissionResources)[number]; + +export const allPermissions = [ + "workspace:view", + "workspace:edit", + "workspace:delete", + "workspace:manage", + "board:view", + "board:create", + "board:edit", + "board:delete", + "list:view", + "list:create", + "list:edit", + "list:delete", + "card:view", + "card:create", + "card:edit", + "card:delete", + "comment:view", + "comment:create", + "comment:edit", + "comment:delete", + "member:view", + "member:invite", + "member:edit", + "member:remove", +] as const; + +export type Permission = (typeof allPermissions)[number]; + +export const roleHierarchy = { + admin: 100, + member: 50, + guest: 10, +} as const; + +export type Role = keyof typeof roleHierarchy; +export const roles = Object.keys(roleHierarchy) as Role[]; + +export const defaultRolePermissions: Record = { + admin: allPermissions, + member: [ + "workspace:view", + "board:view", + "board:create", + "list:view", + "list:create", + "list:edit", + "card:view", + "card:create", + "card:edit", + "card:delete", + "comment:view", + "comment:create", + "comment:edit", + "comment:delete", + "member:view", + ], + + guest: [ + "workspace:view", + "board:view", + "list:view", + "card:view", + "comment:view", + "member:view", + ], +} as const; + + +export const permissionCategories = { + workspace: { + label: "Workspace", + permissions: [ + "workspace:view", + "workspace:edit", + "workspace:delete", + "workspace:manage", + ] as const, + }, + board: { + label: "Boards", + permissions: [ + "board:view", + "board:create", + "board:edit", + "board:delete", + ] as const, + }, + list: { + label: "Lists", + permissions: [ + "list:view", + "list:create", + "list:edit", + "list:delete", + ] as const, + }, + card: { + label: "Cards", + permissions: [ + "card:view", + "card:create", + "card:edit", + "card:delete", + ] as const, + }, + comment: { + label: "Comments", + permissions: [ + "comment:view", + "comment:create", + "comment:edit", + "comment:delete", + ] as const, + }, + member: { + label: "Members", + permissions: [ + "member:view", + "member:invite", + "member:edit", + "member:remove", + ] as const, + }, +} as const; + +export function getDefaultPermissions(role: Role): readonly Permission[] { + return defaultRolePermissions[role]; +} + +export function getRoleLevel(role: Role): number { + return roleHierarchy[role]; +} + +export function canManageRole(managerRole: Role, targetRole: Role): boolean { + return roleHierarchy[managerRole] > roleHierarchy[targetRole]; +} + +export function hasPermissionInDefaults( + role: Role, + permission: Permission, +): boolean { + return defaultRolePermissions[role].includes(permission); +} +