use std::sync::Arc;
use super::AuthContextExt;
use backbone_auth::middleware::AuthContext;
use axum::{
extract::{Request, State},
http::StatusCode,
middleware::Next,
response::Response,
};
pub mod conversion_jobs {
pub const LIST: &str = "conversion_job:list";
pub const READ: &str = "conversion_job:read";
pub const CREATE: &str = "conversion_job:create";
pub const UPDATE: &str = "conversion_job:update";
pub const DELETE: &str = "conversion_job:delete";
pub const RESTORE: &str = "conversion_job:restore";
pub const TRASH: &str = "conversion_job:trash";
pub const EMPTY_TRASH: &str = "conversion_job:empty_trash";
pub const BULK_CREATE: &str = "conversion_job:bulk_create";
pub const UPSERT: &str = "conversion_job:upsert";
pub const TRANSITION_START: &str = "conversion_job:transition:start";
pub const TRANSITION_UPDATE_PROGRESS: &str = "conversion_job:transition:update_progress";
pub const TRANSITION_COMPLETE: &str = "conversion_job:transition:complete";
pub const TRANSITION_FAIL: &str = "conversion_job:transition:fail";
pub const TRANSITION_CANCEL_PENDING: &str = "conversion_job:transition:cancel_pending";
pub const TRANSITION_CANCEL_RUNNING: &str = "conversion_job:transition:cancel_running";
pub const TRANSITION_RETRY: &str = "conversion_job:transition:retry";
pub const TRANSITION_RECONVERT: &str = "conversion_job:transition:reconvert";
pub fn all() -> Vec<&'static str> {
vec![
LIST,
READ,
CREATE,
UPDATE,
DELETE,
RESTORE,
TRASH,
EMPTY_TRASH,
BULK_CREATE,
UPSERT,
TRANSITION_START,
TRANSITION_UPDATE_PROGRESS,
TRANSITION_COMPLETE,
TRANSITION_FAIL,
TRANSITION_CANCEL_PENDING,
TRANSITION_CANCEL_RUNNING,
TRANSITION_RETRY,
TRANSITION_RECONVERT,
]
}
}
pub fn has_permission(auth: &AuthContext, permission: &str) -> bool {
auth.has_permission(permission)
}
pub fn has_role(auth: &AuthContext, role: &str) -> bool {
auth.has_role(role)
}
pub fn has_all_roles(auth: &AuthContext, roles: &[&str]) -> bool {
auth.has_all_roles(roles)
}
pub fn has_any_permission(auth: &AuthContext, permissions: &[&str]) -> bool {
permissions.iter().any(|p| auth.has_permission(p))
}
pub async fn require_list_conversion_job(
auth: axum::extract::Extension<AuthContext>,
request: Request,
next: Next,
) -> Result<Response, StatusCode> {
if has_permission(&auth, conversion_jobs::LIST) {
Ok(next.run(request).await)
} else {
Err(StatusCode::FORBIDDEN)
}
}
pub async fn require_read_conversion_job(
auth: axum::extract::Extension<AuthContext>,
request: Request,
next: Next,
) -> Result<Response, StatusCode> {
if has_permission(&auth, conversion_jobs::READ) {
Ok(next.run(request).await)
} else {
Err(StatusCode::FORBIDDEN)
}
}
pub async fn require_create_conversion_job(
auth: axum::extract::Extension<AuthContext>,
request: Request,
next: Next,
) -> Result<Response, StatusCode> {
if has_permission(&auth, conversion_jobs::CREATE) {
Ok(next.run(request).await)
} else {
Err(StatusCode::FORBIDDEN)
}
}
pub async fn require_update_conversion_job(
auth: axum::extract::Extension<AuthContext>,
request: Request,
next: Next,
) -> Result<Response, StatusCode> {
if has_permission(&auth, conversion_jobs::UPDATE) {
Ok(next.run(request).await)
} else {
Err(StatusCode::FORBIDDEN)
}
}
pub async fn require_delete_conversion_job(
auth: axum::extract::Extension<AuthContext>,
request: Request,
next: Next,
) -> Result<Response, StatusCode> {
if has_permission(&auth, conversion_jobs::DELETE) {
Ok(next.run(request).await)
} else {
Err(StatusCode::FORBIDDEN)
}
}
pub async fn require_restore_conversion_job(
auth: axum::extract::Extension<AuthContext>,
request: Request,
next: Next,
) -> Result<Response, StatusCode> {
if has_permission(&auth, conversion_jobs::RESTORE) {
Ok(next.run(request).await)
} else {
Err(StatusCode::FORBIDDEN)
}
}
pub async fn require_trash_conversion_job(
auth: axum::extract::Extension<AuthContext>,
request: Request,
next: Next,
) -> Result<Response, StatusCode> {
if has_permission(&auth, conversion_jobs::TRASH) {
Ok(next.run(request).await)
} else {
Err(StatusCode::FORBIDDEN)
}
}
pub async fn require_empty_trash_conversion_job(
auth: axum::extract::Extension<AuthContext>,
request: Request,
next: Next,
) -> Result<Response, StatusCode> {
if has_permission(&auth, conversion_jobs::EMPTY_TRASH) {
Ok(next.run(request).await)
} else {
Err(StatusCode::FORBIDDEN)
}
}