use std::collections::HashSet; #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)] pub enum PermissionAction { ReadAsset, ReadMetadata, ReadLocation, ReadPerson, WriteMetadata, DeleteAsset, ManageAccess, ManageUsers, ManageSystem, } #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)] pub enum ResourceType { Asset, Album, Collection, Person, Directory, Global, } #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)] pub struct Permission { pub action: PermissionAction, pub resource_type: ResourceType, } impl Permission { pub fn new(action: PermissionAction, resource_type: ResourceType) -> Self { Self { action, resource_type } } } pub fn viewer_permissions() -> HashSet { HashSet::from([ Permission::new(PermissionAction::ReadAsset, ResourceType::Global), Permission::new(PermissionAction::ReadMetadata, ResourceType::Global), ]) } pub fn contributor_permissions() -> HashSet { let mut perms = viewer_permissions(); perms.insert(Permission::new(PermissionAction::WriteMetadata, ResourceType::Global)); perms } pub fn admin_permissions() -> HashSet { let mut perms = contributor_permissions(); perms.insert(Permission::new(PermissionAction::DeleteAsset, ResourceType::Global)); perms.insert(Permission::new(PermissionAction::ManageAccess, ResourceType::Global)); perms.insert(Permission::new(PermissionAction::ManageUsers, ResourceType::Global)); perms.insert(Permission::new(PermissionAction::ManageSystem, ResourceType::Global)); perms.insert(Permission::new(PermissionAction::ReadLocation, ResourceType::Global)); perms.insert(Permission::new(PermissionAction::ReadPerson, ResourceType::Global)); perms }