Files
stoatchat/crates/delta/src/routes/invites/invite_delete.rs
2025-11-17 22:13:07 +00:00

42 lines
1.3 KiB
Rust

use revolt_database::{
util::{permissions::DatabasePermissionQuery, reference::Reference},
Database, Invite, User,
};
use revolt_permissions::{calculate_server_permissions, ChannelPermission};
use revolt_result::Result;
use rocket::State;
use rocket_empty::EmptyResponse;
/// Delete Invite
///
/// Delete an invite by its id.
#[utoipa::path(
tag = "Invites",
security(("Session-Token" = []), ("Bot-Token" = [])),
responses(
(status = 204),
),
)]
#[delete("/<target>")]
pub async fn delete(db: &State<Database>, user: User, target: Reference<'_>) -> Result<EmptyResponse> {
let invite = target.as_invite(db).await?;
if user.id == invite.creator() {
db.delete_invite(invite.code()).await
} else {
match invite {
Invite::Server { code, server, .. } => {
let server = db.fetch_server(&server).await?;
let mut query = DatabasePermissionQuery::new(db, &user).server(&server);
calculate_server_permissions(&mut query)
.await
.throw_if_lacking_channel_permission(ChannelPermission::ManageServer)?;
db.delete_invite(&code).await
}
_ => unreachable!(),
}
}
.map(|_| EmptyResponse)
}