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 = { 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)