From 4c8ea31d988163af0223d316e0e2af99caa13181 Mon Sep 17 00:00:00 2001 From: Paul Makles Date: Sat, 11 Mar 2023 17:26:48 +0000 Subject: [PATCH] feat(admin): add global message query route --- .../delta/src/routes/admin/message_query.rs | 31 +++++++++++++++++++ crates/delta/src/routes/admin/mod.rs | 9 ++++++ crates/delta/src/routes/{ => admin}/stats.rs | 2 +- .../src/routes/channels/message_query.rs | 2 +- .../src/routes/channels/message_search.rs | 2 +- crates/delta/src/routes/mod.rs | 8 +++-- .../src/impl/generic/channels/message.rs | 5 +-- 7 files changed, 51 insertions(+), 8 deletions(-) create mode 100644 crates/delta/src/routes/admin/message_query.rs create mode 100644 crates/delta/src/routes/admin/mod.rs rename crates/delta/src/routes/{ => admin}/stats.rs (91%) diff --git a/crates/delta/src/routes/admin/message_query.rs b/crates/delta/src/routes/admin/message_query.rs new file mode 100644 index 00000000..e9b1a1e5 --- /dev/null +++ b/crates/delta/src/routes/admin/message_query.rs @@ -0,0 +1,31 @@ +use revolt_quark::{ + models::{ + message::{BulkMessageResponse, MessageQuery}, + User, + }, + Db, Error, Result, +}; +use rocket::serde::json::Json; + +/// # Globally Fetch Messages +/// +/// This is a privileged route to globally fetch messages. +#[openapi(tag = "Admin")] +#[post("/messages", data = "")] +pub async fn message_query( + db: &Db, + user: User, + data: Json, +) -> Result> { + // Must be privileged for this route + if !user.privileged { + return Err(Error::NotPrivileged); + } + + // Fetch data using query + let data = data.into_inner(); + let messages = db.fetch_messages(data).await?; + BulkMessageResponse::transform(db, None, messages, Some(true)) + .await + .map(Json) +} diff --git a/crates/delta/src/routes/admin/mod.rs b/crates/delta/src/routes/admin/mod.rs new file mode 100644 index 00000000..28baf710 --- /dev/null +++ b/crates/delta/src/routes/admin/mod.rs @@ -0,0 +1,9 @@ +use revolt_rocket_okapi::revolt_okapi::openapi3::OpenApi; +use rocket::Route; + +mod message_query; +mod stats; + +pub fn routes() -> (Vec, OpenApi) { + openapi_get_routes_spec![stats::stats, message_query::message_query] +} diff --git a/crates/delta/src/routes/stats.rs b/crates/delta/src/routes/admin/stats.rs similarity index 91% rename from crates/delta/src/routes/stats.rs rename to crates/delta/src/routes/admin/stats.rs index ff7d1ac9..1d043b03 100644 --- a/crates/delta/src/routes/stats.rs +++ b/crates/delta/src/routes/admin/stats.rs @@ -6,7 +6,7 @@ use rocket::serde::json::Json; /// # Query Stats /// /// Fetch various technical statistics. -#[openapi(tag = "Core")] +#[openapi(tag = "Admin")] #[get("/stats")] pub async fn stats(db: &Db) -> Result> { Ok(Json(db.generate_stats().await?)) diff --git a/crates/delta/src/routes/channels/message_query.rs b/crates/delta/src/routes/channels/message_query.rs index 59ff9af8..fba69bdb 100644 --- a/crates/delta/src/routes/channels/message_query.rs +++ b/crates/delta/src/routes/channels/message_query.rs @@ -91,7 +91,7 @@ pub async fn req( }) .await?; - BulkMessageResponse::transform(db, &channel, messages, include_users) + BulkMessageResponse::transform(db, Some(&channel), messages, include_users) .await .map(Json) } diff --git a/crates/delta/src/routes/channels/message_search.rs b/crates/delta/src/routes/channels/message_search.rs index bb229444..37f32e30 100644 --- a/crates/delta/src/routes/channels/message_search.rs +++ b/crates/delta/src/routes/channels/message_search.rs @@ -90,7 +90,7 @@ pub async fn req( }) .await?; - BulkMessageResponse::transform(db, &channel, messages, include_users) + BulkMessageResponse::transform(db, Some(&channel), messages, include_users) .await .map(Json) } diff --git a/crates/delta/src/routes/mod.rs b/crates/delta/src/routes/mod.rs index d7724c4a..b26d2cd2 100644 --- a/crates/delta/src/routes/mod.rs +++ b/crates/delta/src/routes/mod.rs @@ -3,6 +3,7 @@ pub use rocket::http::Status; pub use rocket::response::Redirect; use rocket::{Build, Rocket}; +mod admin; mod bots; mod channels; mod customisation; @@ -12,7 +13,6 @@ mod push; mod root; mod safety; mod servers; -mod stats; mod sync; mod users; @@ -22,7 +22,8 @@ pub fn mount(mut rocket: Rocket) -> Rocket { mount_endpoints_and_merged_docs! { rocket, "/".to_owned(), settings, "/" => (vec![], custom_openapi_spec()), - "" => openapi_get_routes_spec![root::root, stats::stats, root::ping], + "" => openapi_get_routes_spec![root::root, root::ping], + "/admin" => admin::routes(), "/users" => users::routes(), "/bots" => bots::routes(), "/channels" => channels::routes(), @@ -109,8 +110,9 @@ fn custom_openapi_spec() -> OpenApi { ] }, { - "name": "Platform Moderation", + "name": "Platform Administration", "tags": [ + "Admin", "User Safety" ] }, diff --git a/crates/quark/src/impl/generic/channels/message.rs b/crates/quark/src/impl/generic/channels/message.rs index 9b876c79..8e4a0e6e 100644 --- a/crates/quark/src/impl/generic/channels/message.rs +++ b/crates/quark/src/impl/generic/channels/message.rs @@ -377,7 +377,7 @@ impl SendableEmbed { impl BulkMessageResponse { pub async fn transform( db: &Database, - channel: &Channel, + channel: Option<&Channel>, messages: Vec, include_users: Option, ) -> Result { @@ -386,7 +386,8 @@ impl BulkMessageResponse { let users = User::fetch_foreign_users(db, &user_ids).await?; Ok(match channel { - Channel::TextChannel { server, .. } | Channel::VoiceChannel { server, .. } => { + Some(Channel::TextChannel { server, .. }) + | Some(Channel::VoiceChannel { server, .. }) => { BulkMessageResponse::MessagesAndUsers { messages, users,