GuDingZiChan/backend/src/utils/permissions.ts

73 lines
2.3 KiB
TypeScript

export const USER_ROLES = ['admin', 'administrative', 'it', 'user'] as const
export type UserRole = (typeof USER_ROLES)[number]
export const PERMISSIONS = {
ASSETS_VIEW_ALL: 'assets.view_all',
ASSETS_VIEW_OWN: 'assets.view_own',
ASSETS_CREATE: 'assets.create',
ASSETS_IMPORT: 'assets.import',
ASSETS_CORRECT: 'assets.correct',
ASSETS_DELETE: 'assets.delete',
ASSETS_BORROW: 'assets.borrow',
ASSETS_TRANSFER: 'assets.transfer',
ASSETS_MAINTENANCE: 'assets.maintenance',
ASSETS_MOUNT: 'assets.mount',
ASSETS_PRINT_LABELS: 'assets.print_labels',
DISPOSALS_APPLY: 'disposals.apply',
DISPOSALS_APPROVE: 'disposals.approve',
DISPOSALS_COMPLETE: 'disposals.complete',
INVENTORY_MANAGE: 'inventory.manage',
NOTIFICATIONS_VIEW: 'notifications.view',
USERS_MANAGE: 'users.manage',
SYNC_MANAGE: 'sync.manage',
SYSTEM_SETTINGS: 'system.settings',
REPORTS_VIEW: 'reports.view'
} as const
export type Permission = (typeof PERMISSIONS)[keyof typeof PERMISSIONS]
const ALL_PERMISSIONS = Object.values(PERMISSIONS) as Permission[]
const ROLE_PERMISSIONS: Record<UserRole, readonly Permission[]> = {
admin: ALL_PERMISSIONS,
administrative: [
PERMISSIONS.ASSETS_VIEW_ALL,
PERMISSIONS.ASSETS_CREATE,
PERMISSIONS.ASSETS_IMPORT,
PERMISSIONS.ASSETS_CORRECT,
PERMISSIONS.ASSETS_PRINT_LABELS,
PERMISSIONS.DISPOSALS_APPROVE,
PERMISSIONS.DISPOSALS_COMPLETE,
PERMISSIONS.INVENTORY_MANAGE,
PERMISSIONS.NOTIFICATIONS_VIEW,
PERMISSIONS.REPORTS_VIEW
],
it: [
PERMISSIONS.ASSETS_VIEW_ALL,
PERMISSIONS.ASSETS_BORROW,
PERMISSIONS.ASSETS_TRANSFER,
PERMISSIONS.ASSETS_MAINTENANCE,
PERMISSIONS.ASSETS_MOUNT,
PERMISSIONS.ASSETS_PRINT_LABELS,
PERMISSIONS.DISPOSALS_APPLY,
PERMISSIONS.INVENTORY_MANAGE,
PERMISSIONS.NOTIFICATIONS_VIEW,
PERMISSIONS.REPORTS_VIEW
],
user: [PERMISSIONS.ASSETS_VIEW_OWN]
}
export const isUserRole = (value: unknown): value is UserRole =>
typeof value === 'string' && USER_ROLES.includes(value as UserRole)
export const getPermissionsForRole = (role: string): Permission[] => {
if (!isUserRole(role)) {
return []
}
return [...ROLE_PERMISSIONS[role]]
}
export const roleHasPermission = (role: string, permission: Permission) =>
getPermissionsForRole(role).includes(permission)