From ac4cedd014cdc3f0a4f46ae178b3fdbb4d973643 Mon Sep 17 00:00:00 2001 From: Paul Makles Date: Sat, 7 May 2022 16:42:06 +0100 Subject: [PATCH] feat: bulk message delete --- Cargo.lock | 2 +- Cargo.toml | 2 +- src/routes/channels/message_bulk_delete.rs | 43 ++++++++++++++++++++++ src/routes/channels/message_delete.rs | 2 +- src/routes/channels/message_search.rs | 2 +- src/routes/channels/mod.rs | 2 + 6 files changed, 49 insertions(+), 4 deletions(-) create mode 100644 src/routes/channels/message_bulk_delete.rs diff --git a/Cargo.lock b/Cargo.lock index 4c9eb123..3d88b601 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2999,7 +2999,7 @@ dependencies = [ [[package]] name = "revolt-quark" version = "0.1.0" -source = "git+https://github.com/revoltchat/quark?rev=e5e8cae091eb7220cd37837494ece966e28cbe81#e5e8cae091eb7220cd37837494ece966e28cbe81" +source = "git+https://github.com/revoltchat/quark?rev=e0ac2fe6c1ed4c874bb39cdd119958ee7f8d0c02#e0ac2fe6c1ed4c874bb39cdd119958ee7f8d0c02" dependencies = [ "async-recursion", "async-std", diff --git a/Cargo.toml b/Cargo.toml index e3ea538c..1d94b7c7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -64,5 +64,5 @@ schemars = "0.8.8" rocket_okapi = { git = "https://github.com/insertish/okapi", rev = "dcf0df115596ee07a587a7a543cddf3d7944645b", features = [ "swagger" ] } # quark -revolt-quark = { git = "https://github.com/revoltchat/quark", rev = "e5e8cae091eb7220cd37837494ece966e28cbe81" } +revolt-quark = { git = "https://github.com/revoltchat/quark", rev = "e0ac2fe6c1ed4c874bb39cdd119958ee7f8d0c02" } # revolt-quark = { path = "../quark" } diff --git a/src/routes/channels/message_bulk_delete.rs b/src/routes/channels/message_bulk_delete.rs new file mode 100644 index 00000000..fad6e2fb --- /dev/null +++ b/src/routes/channels/message_bulk_delete.rs @@ -0,0 +1,43 @@ +use revolt_quark::{ + models::{Message, User}, + perms, Db, EmptyResponse, Error, Permission, Ref, Result, +}; +use rocket::serde::json::Json; +use serde::Deserialize; +use validator::Validate; + +/// # Search Parameters +#[derive(Validate, Deserialize, JsonSchema)] +pub struct OptionsBulkDelete { + /// Message IDs + #[validate(length(min = 1, max = 100))] + ids: Vec, +} + +/// # Bulk Delete Messages +/// +/// Delete multiple messages you've sent or one you have permission to delete. +/// +/// This will always require `ManageMessages` permission regardless of whether you own the message or not. +#[openapi(tag = "Messaging")] +#[delete("//messages/bulk", data = "", rank = 1)] +pub async fn req( + db: &Db, + user: User, + target: Ref, + options: Json, +) -> Result { + let options = options.into_inner(); + options + .validate() + .map_err(|error| Error::FailedValidation { error })?; + + perms(&user) + .channel(&target.as_channel(db).await?) + .throw_permission(db, Permission::ManageMessages) + .await?; + + Message::bulk_delete(db, &target.id, options.ids) + .await + .map(|_| EmptyResponse) +} diff --git a/src/routes/channels/message_delete.rs b/src/routes/channels/message_delete.rs index 98aae099..6a427316 100644 --- a/src/routes/channels/message_delete.rs +++ b/src/routes/channels/message_delete.rs @@ -4,7 +4,7 @@ use revolt_quark::{models::User, perms, Db, EmptyResponse, Error, Permission, Re /// /// Delete a message you've sent or one you have permission to delete. #[openapi(tag = "Messaging")] -#[delete("//messages/")] +#[delete("//messages/", rank = 2)] pub async fn req(db: &Db, user: User, target: Ref, msg: Ref) -> Result { let message = msg.as_message(db).await?; if message.channel != target.id { diff --git a/src/routes/channels/message_search.rs b/src/routes/channels/message_search.rs index 4b68a6f8..0db35568 100644 --- a/src/routes/channels/message_search.rs +++ b/src/routes/channels/message_search.rs @@ -11,7 +11,7 @@ use serde::{Deserialize, Serialize}; use validator::Validate; /// # Search Parameters -#[derive(Validate, Serialize, Deserialize, JsonSchema, FromForm)] +#[derive(Validate, Serialize, Deserialize, JsonSchema)] pub struct OptionsMessageSearch { /// Full-text search query /// diff --git a/src/routes/channels/mod.rs b/src/routes/channels/mod.rs index 95f8ec45..4e5fc8df 100644 --- a/src/routes/channels/mod.rs +++ b/src/routes/channels/mod.rs @@ -10,6 +10,7 @@ mod group_create; mod group_remove_member; mod invite_create; mod members_fetch; +mod message_bulk_delete; mod message_delete; mod message_edit; mod message_fetch; @@ -35,6 +36,7 @@ pub fn routes() -> (Vec, OpenApi) { message_query_stale::req, message_fetch::req, message_edit::req, + message_bulk_delete::req, message_delete::req, group_create::req, group_add_member::req,