use revolt_database::{ util::{permissions::DatabasePermissionQuery, reference::Reference}, Database, PartialWebhook, User, }; use revolt_models::v0::{DataEditWebhook, Webhook}; use revolt_permissions::{calculate_channel_permissions, ChannelPermission}; use revolt_result::{create_error, Result}; use rocket::{serde::json::Json, State}; use validator::Validate; /// # Edits a webhook /// /// Edits a webhook #[openapi(tag = "Webhooks")] #[patch("/", data = "")] pub async fn webhook_edit( db: &State, webhook_id: Reference, user: User, data: Json, ) -> Result> { let data = data.into_inner(); data.validate().map_err(|error| { create_error!(FailedValidation { error: error.to_string() }) })?; let mut webhook = webhook_id.as_webhook(db).await?; let channel = db.fetch_channel(&webhook.channel_id).await?; let mut query = DatabasePermissionQuery::new(db, &user).channel(&channel); calculate_channel_permissions(&mut query) .await .throw_if_lacking_channel_permission(ChannelPermission::ManageWebhooks)?; if data.name.is_none() && data.avatar.is_none() && data.remove.is_empty() { return Ok(Json(webhook.into())); }; let DataEditWebhook { name, avatar, permissions, remove, } = data; let mut partial = PartialWebhook { name, permissions, ..Default::default() }; if let Some(avatar) = avatar { let file = db .find_and_use_attachment(&avatar, "avatars", "user", &webhook.id) .await?; partial.avatar = Some(file) } webhook .update(db, partial, remove.into_iter().map(|v| v.into()).collect()) .await?; Ok(Json(webhook.into())) }