feat: add role-based permission system

This commit is contained in:
2026-03-26 11:54:24 -05:00
parent 22f0ded88f
commit fdc27584c9
2 changed files with 99 additions and 0 deletions
+56
View File
@@ -0,0 +1,56 @@
export type Role =
| 'sysadmin'
| 'director'
| 'foster_coordinator'
| 'volunteer_manager'
| 'vet_liaison'
| 'content_editor'
| 'applications_manager'
| 'viewer'
| 'foster';
export type Permission =
| 'dashboard'
| 'pets'
| 'pets_view'
| 'applications'
| 'sponsors'
| 'donations'
| 'expenses'
| 'vets'
| 'medical'
| 'events'
| 'content'
| 'volunteers'
| 'users'
| 'shop'
| 'import'
| 'system';
const ROLE_PERMISSIONS: Record<Role, Permission[]> = {
sysadmin: [
'dashboard', 'pets', 'pets_view', 'applications', 'sponsors',
'donations', 'expenses', 'vets', 'medical', 'events', 'content',
'volunteers', 'users', 'shop', 'import', 'system'
],
director: [
'dashboard', 'pets', 'pets_view', 'applications', 'sponsors',
'donations', 'expenses', 'vets', 'medical', 'events', 'content',
'volunteers', 'users', 'shop', 'import'
],
foster_coordinator: ['dashboard', 'pets', 'pets_view', 'applications'],
volunteer_manager: ['dashboard', 'volunteers', 'events'],
vet_liaison: ['dashboard', 'pets', 'pets_view', 'vets', 'medical', 'expenses'],
content_editor: ['dashboard', 'sponsors', 'content', 'events'],
applications_manager: ['dashboard', 'applications', 'pets_view'],
viewer: ['dashboard'],
foster: ['dashboard']
};
export function hasPermission(role: Role, permission: Permission): boolean {
return ROLE_PERMISSIONS[role]?.includes(permission) ?? false;
}
export function canViewPets(role: Role): boolean {
return hasPermission(role, 'pets') || hasPermission(role, 'pets_view');
}