From 35a11f791643efe25c578ba262fca64f2055f1ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0spik?= Date: Sun, 28 Jun 2026 18:16:35 +0300 Subject: [PATCH] feat: add admin account enable route MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: İspik --- crates/core/models/src/v0/admin.rs | 2 + .../routes/admin/accounts/account_enable.rs | 57 +++++++++++++++++++ crates/delta/src/routes/admin/mod.rs | 1 + 3 files changed, 60 insertions(+) diff --git a/crates/core/models/src/v0/admin.rs b/crates/core/models/src/v0/admin.rs index 558c37a3..57a3ee55 100644 --- a/crates/core/models/src/v0/admin.rs +++ b/crates/core/models/src/v0/admin.rs @@ -327,6 +327,7 @@ auto_derived! { DisableAccount, EmailChange, EmailVerify, + EnableAccount, // Channels DeleteChannel, @@ -383,6 +384,7 @@ impl AdminAuditItemActions { AdminAuditItemActions::DisableAccount => true, AdminAuditItemActions::EmailChange => true, AdminAuditItemActions::EmailVerify => true, + AdminAuditItemActions::EnableAccount => true, AdminAuditItemActions::DeleteChannel => true, AdminAuditItemActions::EditChannel => true, AdminAuditItemActions::WipeChannel => true, diff --git a/crates/delta/src/routes/admin/accounts/account_enable.rs b/crates/delta/src/routes/admin/accounts/account_enable.rs index e69de29b..17c1db74 100644 --- a/crates/delta/src/routes/admin/accounts/account_enable.rs +++ b/crates/delta/src/routes/admin/accounts/account_enable.rs @@ -0,0 +1,57 @@ +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; + +/// Enable an account. Requires ManageAccounts permissions +#[openapi(tag = "Admin")] +#[post("/accounts/enable/?")] +pub async fn admin_account_enable( + db: &State, + auth: AdminAuthorization, + target: 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 = target.as_user(db).await?; + + if target.privileged { + return Err(create_error!(PrivilegedAccount)); + } + + let admin = db.admin_user_fetch(&target.id).await.ok(); + + if let Some(admin) = admin { + if user_has_permission(&admin, v0::AdminUserPermissionFlags::ManageAccounts) { + return Err(create_error!(PrivilegedAccount)); + } + } + + let mut account = db.fetch_account(&target.id).await?; + + account.disabled = false; + + account.save(db).await?; + + create_audit_action( + db, + &user.id, + v0::AdminAuditItemActions::EnableAccount, + case, + Some(&target.id), + None, + ) + .await?; + + Ok(EmptyResponse) +} diff --git a/crates/delta/src/routes/admin/mod.rs b/crates/delta/src/routes/admin/mod.rs index 9ca4eca1..46f2a290 100644 --- a/crates/delta/src/routes/admin/mod.rs +++ b/crates/delta/src/routes/admin/mod.rs @@ -42,6 +42,7 @@ pub fn routes() -> (Vec, OpenApi) { accounts::account_disable::admin_account_disable, accounts::account_email_change::admin_account_email_change, accounts::account_email_verify::admin_account_email_verify, + accounts::account_enable::admin_account_enable, channels::actions::channel_delete::admin_delete_channel, channels::actions::channel_edit::admin_channel_edit, channels::actions::channel_wipe::admin_channel_wipe,