diff --git a/crates/core/models/src/v0/admin.rs b/crates/core/models/src/v0/admin.rs index e56450d1..3703f19c 100644 --- a/crates/core/models/src/v0/admin.rs +++ b/crates/core/models/src/v0/admin.rs @@ -290,6 +290,7 @@ auto_derived! { Discover = 16, ManageAccounts = 17, + ManageChannels = 18, } pub enum AdminAuditItemActions { @@ -324,6 +325,9 @@ auto_derived! { // Accounts DeleteAccount, DisableAccount, + + // Channels + DeleteChannel, } // Joiner payloads @@ -373,6 +377,7 @@ impl AdminAuditItemActions { AdminAuditItemActions::ServerFetchMembers => false, AdminAuditItemActions::DeleteAccount => true, AdminAuditItemActions::DisableAccount => true, + AdminAuditItemActions::DeleteChannel => true, } } } diff --git a/crates/delta/src/routes/admin/channels/actions/channel_delete.rs b/crates/delta/src/routes/admin/channels/actions/channel_delete.rs index e69de29b..72f3b280 100644 --- a/crates/delta/src/routes/admin/channels/actions/channel_delete.rs +++ b/crates/delta/src/routes/admin/channels/actions/channel_delete.rs @@ -0,0 +1,40 @@ +use crate::routes::admin::util::{ + create_audit_action, flatten_authorized_user, user_has_permission, +}; +use revolt_database::{util::reference::Reference, AdminAuthorization, Database}; +use revolt_models::v0; +use revolt_result::{create_error, Result}; +use rocket::State; +use rocket_empty::EmptyResponse; + +#[openapi(tag = "Admin")] +#[delete("/admin/channels/?")] +pub async fn admin_delete_channel( + db: &State, + auth: AdminAuthorization, + channel_id: Reference<'_>, + case: Option<&str>, +) -> Result { + let user = flatten_authorized_user(&auth); + if !user_has_permission(user, v0::AdminUserPermissionFlags::ManageAccounts) { + return Err(create_error!(MissingPermission { + permission: "ManageAccounts".to_string() + })); + } + + let target = channel_id.as_channel(&db).await?; + + target.delete(&db).await?; + + create_audit_action( + &db, + &user.id, + v0::AdminAuditItemActions::DeleteChannel, + case, + Some(channel_id.id), + None, + ) + .await?; + + Ok(EmptyResponse) +} diff --git a/crates/delta/src/routes/admin/channels/actions/mod.rs b/crates/delta/src/routes/admin/channels/actions/mod.rs index 99bdc2ca..2fec3a69 100644 --- a/crates/delta/src/routes/admin/channels/actions/mod.rs +++ b/crates/delta/src/routes/admin/channels/actions/mod.rs @@ -1,3 +1,3 @@ -mod channel_delete; -mod channel_edit; -mod channel_wipe; +pub mod channel_delete; +pub mod channel_edit; +pub mod channel_wipe; diff --git a/crates/delta/src/routes/admin/channels/mod.rs b/crates/delta/src/routes/admin/channels/mod.rs index f6d4d6e6..d0a73f79 100644 --- a/crates/delta/src/routes/admin/channels/mod.rs +++ b/crates/delta/src/routes/admin/channels/mod.rs @@ -1,2 +1,2 @@ -mod actions; -mod fetch; +pub mod actions; +pub mod fetch; diff --git a/crates/delta/src/routes/admin/mod.rs b/crates/delta/src/routes/admin/mod.rs index daafc67a..347addba 100644 --- a/crates/delta/src/routes/admin/mod.rs +++ b/crates/delta/src/routes/admin/mod.rs @@ -40,5 +40,6 @@ pub fn routes() -> (Vec, OpenApi) { servers::actions::server_remove_members::admin_server_remove_members, accounts::account_delete::admin_account_delete, accounts::account_disable::admin_account_disable, + channels::actions::channel_delete::admin_delete_channel, ] }