use serde::{Deserialize, Serialize};
use utoipa::ToSchema;
use uuid::Uuid;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, ToSchema)]
pub enum PermissionName {
#[serde(rename = "system:manage")]
SystemManage,
#[serde(rename = "user:manage")]
UserManage,
#[serde(rename = "role:manage")]
RoleManage,
#[serde(rename = "token:manage")]
TokenManage,
#[serde(rename = "storage:manage")]
StorageManage,
#[serde(rename = "mail:manage")]
MailManage,
#[serde(rename = "auth:manage")]
AuthManage,
#[serde(rename = "app:create")]
AppCreate,
#[serde(rename = "app:read")]
AppRead,
#[serde(rename = "app:update")]
AppUpdate,
#[serde(rename = "app:delete")]
AppDelete,
#[serde(rename = "release:create")]
ReleaseCreate,
#[serde(rename = "release:read")]
ReleaseRead,
#[serde(rename = "release:update")]
ReleaseUpdate,
#[serde(rename = "release:publish")]
ReleasePublish,
#[serde(rename = "release:promote")]
ReleasePromote,
#[serde(rename = "release:rollback")]
ReleaseRollback,
#[serde(rename = "release:yank")]
ReleaseYank,
#[serde(rename = "artifact:upload")]
ArtifactUpload,
#[serde(rename = "artifact:read")]
ArtifactRead,
#[serde(rename = "artifact:delete")]
ArtifactDelete,
#[serde(rename = "analytics:read")]
AnalyticsRead,
#[serde(rename = "telemetry:read")]
TelemetryRead,
}
const PERMISSIONS: &[(PermissionName, &str)] = {
use PermissionName::*;
&[
(SystemManage, "system:manage"),
(UserManage, "user:manage"),
(RoleManage, "role:manage"),
(TokenManage, "token:manage"),
(StorageManage, "storage:manage"),
(MailManage, "mail:manage"),
(AuthManage, "auth:manage"),
(AppCreate, "app:create"),
(AppRead, "app:read"),
(AppUpdate, "app:update"),
(AppDelete, "app:delete"),
(ReleaseCreate, "release:create"),
(ReleaseRead, "release:read"),
(ReleaseUpdate, "release:update"),
(ReleasePublish, "release:publish"),
(ReleasePromote, "release:promote"),
(ReleaseRollback, "release:rollback"),
(ReleaseYank, "release:yank"),
(ArtifactUpload, "artifact:upload"),
(ArtifactRead, "artifact:read"),
(ArtifactDelete, "artifact:delete"),
(AnalyticsRead, "analytics:read"),
(TelemetryRead, "telemetry:read"),
]
};
impl PermissionName {
pub fn as_str(self) -> &'static str {
PERMISSIONS
.iter()
.find_map(|(p, s)| (*p == self).then_some(*s))
.expect("PERMISSIONS must enumerate every PermissionName variant")
}
pub fn all() -> impl Iterator<Item = PermissionName> {
PERMISSIONS.iter().map(|(p, _)| *p)
}
pub const fn count() -> usize {
PERMISSIONS.len()
}
pub fn from_wire(s: &str) -> Option<PermissionName> {
PERMISSIONS
.iter()
.find_map(|(p, name)| (*name == s).then_some(*p))
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema)]
pub struct Permission {
pub id: Uuid,
pub name: PermissionName,
pub description: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema)]
pub struct Role {
pub id: Uuid,
pub name: String,
pub description: Option<String>,
}