From 43c94b68b0a4998f485140a7b9e9558cbd60ea0f Mon Sep 17 00:00:00 2001 From: Zomatree Date: Mon, 17 Nov 2025 22:13:07 +0000 Subject: [PATCH] chore: update routes to use utoipa --- crates/core/coalesced/src/service.rs | 2 +- crates/core/database/src/lib.rs | 4 ++ .../core/database/src/models/users/model.rs | 2 +- crates/core/database/src/util/idempotency.rs | 22 ++++---- crates/core/models/src/v0/channels.rs | 1 + crates/core/models/src/v0/config.rs | 14 ++--- crates/core/models/src/v0/messages.rs | 2 + crates/core/models/src/v0/server_members.rs | 1 + crates/core/models/src/v0/servers.rs | 2 + crates/core/models/src/v0/user_settings.rs | 1 + crates/core/result/src/lib.rs | 9 ++-- crates/core/result/src/utoipa_impl.rs | 52 +++++++++++++++++++ crates/delta/src/routes/bots/create.rs | 10 +++- crates/delta/src/routes/bots/delete.rs | 10 +++- crates/delta/src/routes/bots/edit.rs | 10 +++- crates/delta/src/routes/bots/fetch.rs | 10 +++- crates/delta/src/routes/bots/fetch_owned.rs | 10 +++- crates/delta/src/routes/bots/fetch_public.rs | 10 +++- crates/delta/src/routes/bots/invite.rs | 10 +++- .../delta/src/routes/channels/channel_ack.rs | 10 +++- .../src/routes/channels/channel_delete.rs | 11 +++- .../delta/src/routes/channels/channel_edit.rs | 10 +++- .../src/routes/channels/channel_fetch.rs | 10 +++- .../src/routes/channels/group_add_member.rs | 10 +++- .../delta/src/routes/channels/group_create.rs | 10 +++- .../routes/channels/group_remove_member.rs | 10 +++- .../src/routes/channels/invite_create.rs | 10 +++- .../src/routes/channels/members_fetch.rs | 10 +++- .../routes/channels/message_bulk_delete.rs | 10 +++- .../channels/message_clear_reactions.rs | 12 +++-- .../src/routes/channels/message_delete.rs | 10 +++- .../delta/src/routes/channels/message_edit.rs | 10 +++- .../src/routes/channels/message_fetch.rs | 10 +++- .../delta/src/routes/channels/message_pin.rs | 10 +++- .../src/routes/channels/message_query.rs | 11 +++- .../src/routes/channels/message_react.rs | 10 +++- .../src/routes/channels/message_search.rs | 12 +++-- .../delta/src/routes/channels/message_send.rs | 11 +++- .../src/routes/channels/message_unpin.rs | 15 ++++-- .../src/routes/channels/message_unreact.rs | 11 +++- .../src/routes/channels/permissions_set.rs | 10 +++- .../channels/permissions_set_default.rs | 10 +++- .../delta/src/routes/channels/voice_join.rs | 10 +++- .../src/routes/channels/webhook_create.rs | 10 +++- .../src/routes/channels/webhook_fetch_all.rs | 10 +++- .../src/routes/customisation/emoji_create.rs | 10 +++- .../src/routes/customisation/emoji_delete.rs | 10 +++- .../src/routes/customisation/emoji_fetch.rs | 10 +++- .../delta/src/routes/invites/invite_delete.rs | 10 +++- .../delta/src/routes/invites/invite_fetch.rs | 10 +++- .../delta/src/routes/invites/invite_join.rs | 10 +++- crates/delta/src/routes/mod.rs | 7 ++- crates/delta/src/routes/onboard/complete.rs | 12 +++-- crates/delta/src/routes/onboard/hello.rs | 12 +++-- .../policy/acknowledge_policy_changes.rs | 10 +++- crates/delta/src/routes/push/subscribe.rs | 10 +++- crates/delta/src/routes/push/unsubscribe.rs | 10 +++- crates/delta/src/routes/root.rs | 7 ++- .../delta/src/routes/safety/report_content.rs | 12 +++-- crates/delta/src/routes/servers/ban_create.rs | 10 +++- crates/delta/src/routes/servers/ban_list.rs | 10 +++- crates/delta/src/routes/servers/ban_remove.rs | 10 +++- .../src/routes/servers/channel_create.rs | 10 +++- crates/delta/src/routes/servers/emoji_list.rs | 10 +++- .../delta/src/routes/servers/invites_fetch.rs | 10 +++- .../delta/src/routes/servers/member_edit.rs | 16 ++++-- .../servers/member_experimental_query.rs | 19 ++++--- .../delta/src/routes/servers/member_fetch.rs | 18 ++++++- .../src/routes/servers/member_fetch_all.rs | 11 +++- .../delta/src/routes/servers/member_remove.rs | 10 +++- .../src/routes/servers/permissions_set.rs | 10 +++- .../routes/servers/permissions_set_default.rs | 10 +++- .../delta/src/routes/servers/roles_create.rs | 10 +++- .../delta/src/routes/servers/roles_delete.rs | 10 +++- crates/delta/src/routes/servers/roles_edit.rs | 10 +++- .../routes/servers/roles_edit_positions.rs | 10 +++- .../delta/src/routes/servers/roles_fetch.rs | 10 +++- crates/delta/src/routes/servers/server_ack.rs | 10 +++- .../delta/src/routes/servers/server_create.rs | 10 +++- .../delta/src/routes/servers/server_delete.rs | 11 +++- .../delta/src/routes/servers/server_edit.rs | 10 +++- .../delta/src/routes/servers/server_fetch.rs | 11 +++- crates/delta/src/routes/sync/get_settings.rs | 10 +++- crates/delta/src/routes/sync/get_unreads.rs | 10 +++- crates/delta/src/routes/sync/set_settings.rs | 16 +++++- crates/delta/src/routes/users/add_friend.rs | 10 +++- crates/delta/src/routes/users/block_user.rs | 10 +++- .../delta/src/routes/users/change_username.rs | 12 +++-- crates/delta/src/routes/users/edit_user.rs | 10 +++- crates/delta/src/routes/users/fetch_dms.rs | 10 +++- .../delta/src/routes/users/fetch_profile.rs | 10 +++- crates/delta/src/routes/users/fetch_self.rs | 10 +++- crates/delta/src/routes/users/fetch_user.rs | 10 +++- .../src/routes/users/fetch_user_flags.rs | 9 +++- crates/delta/src/routes/users/find_mutual.rs | 10 +++- .../src/routes/users/get_default_avatar.rs | 16 +++++- crates/delta/src/routes/users/open_dm.rs | 10 +++- .../delta/src/routes/users/remove_friend.rs | 10 +++- .../src/routes/users/send_friend_request.rs | 10 +++- crates/delta/src/routes/users/unblock_user.rs | 10 +++- .../src/routes/webhooks/webhook_delete.rs | 10 +++- .../routes/webhooks/webhook_delete_token.rs | 9 +++- .../delta/src/routes/webhooks/webhook_edit.rs | 10 +++- .../src/routes/webhooks/webhook_edit_token.rs | 9 +++- .../src/routes/webhooks/webhook_execute.rs | 10 +++- .../routes/webhooks/webhook_execute_github.rs | 7 ++- .../src/routes/webhooks/webhook_fetch.rs | 10 +++- .../routes/webhooks/webhook_fetch_token.rs | 9 +++- .../services/gifbox/src/routes/categories.rs | 2 +- crates/services/gifbox/src/routes/root.rs | 2 +- 110 files changed, 891 insertions(+), 231 deletions(-) create mode 100644 crates/core/result/src/utoipa_impl.rs diff --git a/crates/core/coalesced/src/service.rs b/crates/core/coalesced/src/service.rs index aadadc8a..a3b715cc 100644 --- a/crates/core/coalesced/src/service.rs +++ b/crates/core/coalesced/src/service.rs @@ -15,7 +15,7 @@ use crate::{CoalescionServiceConfig, Error}; #[derive(Debug, Clone)] #[allow(clippy::type_complexity)] -/// # Coalescion service +/// Coalescion service /// /// See module description for example usage. pub struct CoalescionService { diff --git a/crates/core/database/src/lib.rs b/crates/core/database/src/lib.rs index f9827d03..dd147e1d 100644 --- a/crates/core/database/src/lib.rs +++ b/crates/core/database/src/lib.rs @@ -25,6 +25,10 @@ pub use mongodb; #[macro_use] extern crate bson; +#[cfg(feature = "utoipa")] +#[macro_use] +extern crate utoipa; + #[cfg(not(feature = "async-std-runtime"))] compile_error!("async-std-runtime feature must be enabled."); diff --git a/crates/core/database/src/models/users/model.rs b/crates/core/database/src/models/users/model.rs index 0c2b6cee..2e253a12 100644 --- a/crates/core/database/src/models/users/model.rs +++ b/crates/core/database/src/models/users/model.rs @@ -15,7 +15,7 @@ use serde_json::json; use ulid::Ulid; auto_derived_partial!( - /// # User + /// User pub struct User { /// Unique Id #[serde(rename = "_id")] diff --git a/crates/core/database/src/util/idempotency.rs b/crates/core/database/src/util/idempotency.rs index 729d9f55..4e85b35b 100644 --- a/crates/core/database/src/util/idempotency.rs +++ b/crates/core/database/src/util/idempotency.rs @@ -10,16 +10,16 @@ use once_cell::sync::Lazy; use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize)] -pub struct IdempotencyKey { - key: String, -} +#[cfg_attr(feature = "utoipa", derive(IntoParams))] +#[cfg_attr(feature = "utoipa", into_params(names("Idempotency-Key"), parameter_in=Header))] +pub struct IdempotencyKey(String); static TOKEN_CACHE: Lazy>> = Lazy::new(|| Mutex::new(lru::LruCache::new(NonZeroUsize::new(1000).unwrap()))); impl IdempotencyKey { pub fn unchecked_from_string(key: String) -> Self { - Self { key } + Self(key) } // Backwards compatibility. @@ -32,14 +32,14 @@ impl IdempotencyKey { } cache.put(v.clone(), ()); - self.key = v; + self.0 = v; } Ok(()) } pub fn into_key(self) -> String { - self.key + self.0 } } @@ -110,18 +110,16 @@ impl<'r> FromRequest<'r> for IdempotencyKey { )); } - let idempotency = IdempotencyKey { key }; + let idempotency = IdempotencyKey(key); let mut cache = TOKEN_CACHE.lock().await; - if cache.get(&idempotency.key).is_some() { + if cache.get(&idempotency.0).is_some() { return Outcome::Error((Status::Conflict, create_error!(DuplicateNonce))); } - cache.put(idempotency.key.clone(), ()); + cache.put(idempotency.0.clone(), ()); return Outcome::Success(idempotency); } - Outcome::Success(IdempotencyKey { - key: ulid::Ulid::new().to_string(), - }) + Outcome::Success(IdempotencyKey(ulid::Ulid::new().to_string())) } } diff --git a/crates/core/models/src/v0/channels.rs b/crates/core/models/src/v0/channels.rs index ec25257b..eba6456d 100644 --- a/crates/core/models/src/v0/channels.rs +++ b/crates/core/models/src/v0/channels.rs @@ -283,6 +283,7 @@ auto_derived!( /// Options when deleting a channel #[cfg_attr(feature = "rocket", derive(FromForm))] + #[cfg_attr(feature = "utoipa", derive(IntoParams))] pub struct OptionsChannelDelete { /// Whether to not send a leave message pub leave_silently: Option, diff --git a/crates/core/models/src/v0/config.rs b/crates/core/models/src/v0/config.rs index ae5163f1..50465faf 100644 --- a/crates/core/models/src/v0/config.rs +++ b/crates/core/models/src/v0/config.rs @@ -1,5 +1,5 @@ auto_derived!( - /// # hCaptcha Configuration + /// hCaptcha Configuration pub struct CaptchaFeature { /// Whether captcha is enabled pub enabled: bool, @@ -7,7 +7,7 @@ auto_derived!( pub key: String, } - /// # Generic Service Configuration + /// Generic Service Configuration pub struct Feature { /// Whether the service is enabled pub enabled: bool, @@ -15,7 +15,7 @@ auto_derived!( pub url: String, } - /// # Voice Server Configuration + /// Voice Server Configuration pub struct VoiceFeature { /// Whether voice is enabled pub enabled: bool, @@ -25,7 +25,7 @@ auto_derived!( pub ws: String, } - /// # Feature Configuration + /// Feature Configuration pub struct RevoltFeatures { /// hCaptcha configuration pub captcha: CaptchaFeature, @@ -41,7 +41,7 @@ auto_derived!( pub voso: VoiceFeature, } - /// # Build Information + /// Build Information pub struct BuildInformation { /// Commit Hash pub commit_sha: String, @@ -55,7 +55,7 @@ auto_derived!( pub timestamp: String, } - /// # Server Configuration + /// Server Configuration pub struct RevoltConfig { /// Revolt API Version pub revolt: String, @@ -70,4 +70,4 @@ auto_derived!( /// Build information pub build: BuildInformation, } -); \ No newline at end of file +); diff --git a/crates/core/models/src/v0/messages.rs b/crates/core/models/src/v0/messages.rs index dc10ff7e..6aa00128 100644 --- a/crates/core/models/src/v0/messages.rs +++ b/crates/core/models/src/v0/messages.rs @@ -279,6 +279,7 @@ auto_derived!( /// Options for querying messages #[cfg_attr(feature = "validator", derive(Validate))] #[cfg_attr(feature = "rocket", derive(FromForm))] + #[cfg_attr(feature = "utoipa", derive(IntoParams))] pub struct OptionsQueryMessages { /// Maximum number of messages to fetch /// @@ -357,6 +358,7 @@ auto_derived!( /// Options for removing reaction #[cfg_attr(feature = "rocket", derive(FromForm))] + #[cfg_attr(feature = "utoipa", derive(IntoParams))] pub struct OptionsUnreact { /// Remove a specific user's reaction pub user_id: Option, diff --git a/crates/core/models/src/v0/server_members.rs b/crates/core/models/src/v0/server_members.rs index 048f696b..66fd5995 100644 --- a/crates/core/models/src/v0/server_members.rs +++ b/crates/core/models/src/v0/server_members.rs @@ -99,6 +99,7 @@ auto_derived!( /// Options for fetching all members #[cfg_attr(feature = "rocket", derive(FromForm))] + #[cfg_attr(feature = "utoipa", derive(IntoParams))] pub struct OptionsFetchAllMembers { /// Whether to exclude offline users pub exclude_offline: Option, diff --git a/crates/core/models/src/v0/servers.rs b/crates/core/models/src/v0/servers.rs index c3ed20a8..e1ea2b94 100644 --- a/crates/core/models/src/v0/servers.rs +++ b/crates/core/models/src/v0/servers.rs @@ -198,6 +198,7 @@ auto_derived!( /// Options when fetching server #[cfg_attr(feature = "rocket", derive(FromForm))] + #[cfg_attr(feature = "utoipa", derive(IntoParams))] pub struct OptionsFetchServer { /// Whether to include channels pub include_channels: Option, @@ -284,6 +285,7 @@ auto_derived!( /// Options when leaving a server #[cfg_attr(feature = "rocket", derive(FromForm))] + #[cfg_attr(feature = "utoipa", derive(IntoParams))] pub struct OptionsServerDelete { /// Whether to not send a leave message pub leave_silently: Option, diff --git a/crates/core/models/src/v0/user_settings.rs b/crates/core/models/src/v0/user_settings.rs index 390e1953..5a0cf175 100644 --- a/crates/core/models/src/v0/user_settings.rs +++ b/crates/core/models/src/v0/user_settings.rs @@ -17,6 +17,7 @@ auto_derived!( /// Additional options for inserting settings #[cfg_attr(feature = "rocket", derive(FromForm))] + #[cfg_attr(feature = "utoipa", derive(IntoParams))] pub struct OptionsSetSettings { /// Timestamp of settings change. /// diff --git a/crates/core/result/src/lib.rs b/crates/core/result/src/lib.rs index cafd564a..ad7e7809 100644 --- a/crates/core/result/src/lib.rs +++ b/crates/core/result/src/lib.rs @@ -5,8 +5,9 @@ use std::fmt::Display; extern crate serde; #[cfg(feature = "utoipa")] -#[macro_use] -extern crate utoipa; +mod utoipa_impl; +#[cfg(feature = "utoipa")] +pub use crate::utoipa_impl::*; #[cfg(feature = "rocket")] pub mod rocket; @@ -19,7 +20,7 @@ pub type Result = std::result::Result; /// Error information #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "utoipa", derive(ToSchema))] +#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))] #[derive(Debug, Clone)] pub struct Error { /// Type of error and additional information @@ -41,7 +42,7 @@ impl std::error::Error for Error {} /// Possible error types #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "serde", serde(tag = "type"))] -#[cfg_attr(feature = "utoipa", derive(ToSchema))] +#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))] #[derive(Debug, Clone)] pub enum ErrorType { /// This error was not labeled :( diff --git a/crates/core/result/src/utoipa_impl.rs b/crates/core/result/src/utoipa_impl.rs new file mode 100644 index 00000000..0bc97140 --- /dev/null +++ b/crates/core/result/src/utoipa_impl.rs @@ -0,0 +1,52 @@ +use utoipa::{Modify, openapi::{Content, OpenApi, Ref, RefOr, ResponseBuilder}}; + +pub struct ErrorAddon; + +impl Modify for ErrorAddon { + fn modify(&self, utoipa: &mut OpenApi) { + let response = ResponseBuilder::new() + .description("An error occurred") + .content( + "application/json", + Content::new(Some(RefOr::Ref(Ref::from_schema_name("Error")))), + ) + .build(); + + for path in utoipa.paths.paths.values_mut() { + if let Some(route) = path.get.as_mut() { + route + .responses + .responses + .insert("default".to_string(), RefOr::T(response.clone())); + }; + + if let Some(route) = path.delete.as_mut() { + route + .responses + .responses + .insert("default".to_string(), RefOr::T(response.clone())); + }; + + if let Some(route) = path.patch.as_mut() { + route + .responses + .responses + .insert("default".to_string(), RefOr::T(response.clone())); + }; + + if let Some(route) = path.post.as_mut() { + route + .responses + .responses + .insert("default".to_string(), RefOr::T(response.clone())); + }; + + if let Some(route) = path.put.as_mut() { + route + .responses + .responses + .insert("default".to_string(), RefOr::T(response.clone())); + }; + } + } +} diff --git a/crates/delta/src/routes/bots/create.rs b/crates/delta/src/routes/bots/create.rs index 6f05c24f..ff4ef43e 100644 --- a/crates/delta/src/routes/bots/create.rs +++ b/crates/delta/src/routes/bots/create.rs @@ -5,10 +5,16 @@ use rocket::serde::json::Json; use rocket::State; use validator::Validate; -/// # Create Bot +/// Create Bot /// /// Create a new Revolt bot. -#[utoipa::path(tag = "Bots")] +#[utoipa::path( + tag = "Bots", + security(("Session-Token" = [])), + responses( + (status = 200, body = v0::BotWithUserResponse), + ), +)] #[post("/create", data = "")] pub async fn create_bot( db: &State, diff --git a/crates/delta/src/routes/bots/delete.rs b/crates/delta/src/routes/bots/delete.rs index bad58f6a..913fd890 100644 --- a/crates/delta/src/routes/bots/delete.rs +++ b/crates/delta/src/routes/bots/delete.rs @@ -3,10 +3,16 @@ use revolt_result::{create_error, Result}; use rocket::State; use rocket_empty::EmptyResponse; -/// # Delete Bot +/// Delete Bot /// /// Delete a bot by its id. -#[utoipa::path(tag = "Bots")] +#[utoipa::path( + tag = "Bots", + security(("Session-Token" = [])), + responses( + (status = 204), + ), +)] #[delete("/")] pub async fn delete_bot( db: &State, diff --git a/crates/delta/src/routes/bots/edit.rs b/crates/delta/src/routes/bots/edit.rs index 31fef5d5..c464e063 100644 --- a/crates/delta/src/routes/bots/edit.rs +++ b/crates/delta/src/routes/bots/edit.rs @@ -6,10 +6,16 @@ use rocket::State; use rocket::serde::json::Json; use validator::Validate; -/// # Edit Bot +/// Edit Bot /// /// Edit bot details by its id. -#[utoipa::path(tag = "Bots")] +#[utoipa::path( + tag = "Bots", + security(("Session-Token" = [])), + responses( + (status = 200, body = v0::BotWithUserResponse), + ), +)] #[patch("/", data = "")] pub async fn edit_bot( db: &State, diff --git a/crates/delta/src/routes/bots/fetch.rs b/crates/delta/src/routes/bots/fetch.rs index 87fa6737..c084a917 100644 --- a/crates/delta/src/routes/bots/fetch.rs +++ b/crates/delta/src/routes/bots/fetch.rs @@ -3,10 +3,16 @@ use revolt_models::v0::FetchBotResponse; use revolt_result::{create_error, Result}; use rocket::{serde::json::Json, State}; -/// # Fetch Bot +/// Fetch Bot /// /// Fetch details of a bot you own by its id. -#[utoipa::path(tag = "Bots")] +#[utoipa::path( + tag = "Bots", + security(("Session-Token" = [])), + responses( + (status = 200, body = FetchBotResponse), + ), +)] #[get("/")] pub async fn fetch_bot( db: &State, diff --git a/crates/delta/src/routes/bots/fetch_owned.rs b/crates/delta/src/routes/bots/fetch_owned.rs index dfb50cea..02298678 100644 --- a/crates/delta/src/routes/bots/fetch_owned.rs +++ b/crates/delta/src/routes/bots/fetch_owned.rs @@ -5,10 +5,16 @@ use revolt_result::Result; use rocket::serde::json::Json; use rocket::State; -/// # Fetch Owned Bots +/// Fetch Owned Bots /// /// Fetch all of the bots that you have control over. -#[utoipa::path(tag = "Bots")] +#[utoipa::path( + tag = "Bots", + security(("Session-Token" = [])), + responses( + (status = 200, body = OwnedBotsResponse), + ), +)] #[get("/@me")] pub async fn fetch_owned_bots(db: &State, user: User) -> Result> { let mut bots = db.fetch_bots_by_user(&user.id).await?; diff --git a/crates/delta/src/routes/bots/fetch_public.rs b/crates/delta/src/routes/bots/fetch_public.rs index 804ff3a5..8a2b1c0d 100644 --- a/crates/delta/src/routes/bots/fetch_public.rs +++ b/crates/delta/src/routes/bots/fetch_public.rs @@ -5,10 +5,16 @@ use revolt_result::{create_error, Result}; use rocket::serde::json::Json; use rocket::State; -/// # Fetch Public Bot +/// Fetch Public Bot /// /// Fetch details of a public (or owned) bot by its id. -#[utoipa::path(tag = "Bots")] +#[utoipa::path( + tag = "Bots", + security(("Session-Token" = []), ()), + responses( + (status = 200, body = PublicBot), + ), +)] #[get("//invite")] pub async fn fetch_public_bot( db: &State, diff --git a/crates/delta/src/routes/bots/invite.rs b/crates/delta/src/routes/bots/invite.rs index ce0cc70d..4eeadb6c 100644 --- a/crates/delta/src/routes/bots/invite.rs +++ b/crates/delta/src/routes/bots/invite.rs @@ -11,10 +11,16 @@ use rocket::State; use rocket::serde::json::Json; use rocket_empty::EmptyResponse; -/// # Invite Bot +/// Invite Bot /// /// Invite a bot to a server or group by its id.` -#[utoipa::path(tag = "Bots")] +#[utoipa::path( + tag = "Bots", + security(("Session-Token" = [])), + responses( + (status = 200, body = v0::BotWithUserResponse), + ), +)] #[post("//invite", data = "")] pub async fn invite_bot( db: &State, diff --git a/crates/delta/src/routes/channels/channel_ack.rs b/crates/delta/src/routes/channels/channel_ack.rs index 3de322d9..713910c7 100644 --- a/crates/delta/src/routes/channels/channel_ack.rs +++ b/crates/delta/src/routes/channels/channel_ack.rs @@ -7,10 +7,16 @@ use revolt_result::{create_error, Result}; use rocket::State; use rocket_empty::EmptyResponse; -/// # Acknowledge Message +/// Acknowledge Message /// /// Lets the server and all other clients know that we've seen this message id in this channel. -#[utoipa::path(tag = "Messaging")] +#[utoipa::path( + tag = "Messaging", + security(("Session-Token" = [])), + responses( + (status = 204) + ) +)] #[put("//ack/")] pub async fn ack( db: &State, diff --git a/crates/delta/src/routes/channels/channel_delete.rs b/crates/delta/src/routes/channels/channel_delete.rs index bf32fecd..79d97fbb 100644 --- a/crates/delta/src/routes/channels/channel_delete.rs +++ b/crates/delta/src/routes/channels/channel_delete.rs @@ -8,10 +8,17 @@ use revolt_result::{create_error, Result}; use rocket::State; use rocket_empty::EmptyResponse; -/// # Close Channel +/// Close Channel /// /// Deletes a server channel, leaves a group or closes a group. -#[utoipa::path(tag = "Channel Information")] +#[utoipa::path( + tag = "Channel Information", + security(("Session-Token" = []), ("Bot-Token" = [])), + params(v0::OptionsChannelDelete), + responses( + (status = 204), + ), +)] #[delete("/?")] pub async fn delete( db: &State, diff --git a/crates/delta/src/routes/channels/channel_edit.rs b/crates/delta/src/routes/channels/channel_edit.rs index d331d06b..9c5b4998 100644 --- a/crates/delta/src/routes/channels/channel_edit.rs +++ b/crates/delta/src/routes/channels/channel_edit.rs @@ -8,10 +8,16 @@ use revolt_result::{create_error, Result}; use rocket::{serde::json::Json, State}; use validator::Validate; -/// # Edit Channel +/// Edit Channel /// /// Edit a channel object by its id. -#[utoipa::path(tag = "Channel Information")] +#[utoipa::path( + tag = "Channel Information", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 200, body = v0::Channel), + ), +)] #[patch("/", data = "")] pub async fn edit( db: &State, diff --git a/crates/delta/src/routes/channels/channel_fetch.rs b/crates/delta/src/routes/channels/channel_fetch.rs index 5a2e40f8..c183e281 100644 --- a/crates/delta/src/routes/channels/channel_fetch.rs +++ b/crates/delta/src/routes/channels/channel_fetch.rs @@ -8,10 +8,16 @@ use revolt_permissions::{calculate_channel_permissions, ChannelPermission}; use revolt_result::Result; use rocket::{serde::json::Json, State}; -/// # Fetch Channel +/// Fetch Channel /// /// Fetch channel by its id. -#[utoipa::path(tag = "Channel Information")] +#[utoipa::path( + tag = "Channel Information", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 200, body = v0::Channel), + ), +)] #[get("/")] pub async fn fetch( db: &State, diff --git a/crates/delta/src/routes/channels/group_add_member.rs b/crates/delta/src/routes/channels/group_add_member.rs index 2e88a9fe..677de4f5 100644 --- a/crates/delta/src/routes/channels/group_add_member.rs +++ b/crates/delta/src/routes/channels/group_add_member.rs @@ -8,10 +8,16 @@ use revolt_result::{create_error, Result}; use rocket::State; use rocket_empty::EmptyResponse; -/// # Add Member to Group +/// Add Member to Group /// /// Adds another user to the group. -#[utoipa::path(tag = "Groups")] +#[utoipa::path( + tag = "Groups", + security(("Session-Token" = [])), + responses( + (status = 204), + ), +)] #[put("//recipients/")] pub async fn add_member( db: &State, diff --git a/crates/delta/src/routes/channels/group_create.rs b/crates/delta/src/routes/channels/group_create.rs index 6ac6cd53..c38e577b 100644 --- a/crates/delta/src/routes/channels/group_create.rs +++ b/crates/delta/src/routes/channels/group_create.rs @@ -6,10 +6,16 @@ use rocket::serde::json::Json; use rocket::State; use validator::Validate; -/// # Create Group +/// Create Group /// /// Create a new group channel. -#[utoipa::path(tag = "Groups")] +#[utoipa::path( + tag = "Groups", + security(("Session-Token" = [])), + responses( + (status = 200, body = v0::Channel), + ), +)] #[post("/create", data = "")] pub async fn create_group( db: &State, diff --git a/crates/delta/src/routes/channels/group_remove_member.rs b/crates/delta/src/routes/channels/group_remove_member.rs index 3d9e0f32..c14fa379 100644 --- a/crates/delta/src/routes/channels/group_remove_member.rs +++ b/crates/delta/src/routes/channels/group_remove_member.rs @@ -5,10 +5,16 @@ use revolt_result::{create_error, Result}; use rocket::State; use rocket_empty::EmptyResponse; -/// # Remove Member from Group +/// Remove Member from Group /// /// Removes a user from the group. -#[utoipa::path(tag = "Groups")] +#[utoipa::path( + tag = "Groups", + security(("Session-Token" = [])), + responses( + (status = 204), + ), +)] #[delete("//recipients/")] pub async fn remove_member( db: &State, diff --git a/crates/delta/src/routes/channels/invite_create.rs b/crates/delta/src/routes/channels/invite_create.rs index dd6734e2..31427caa 100644 --- a/crates/delta/src/routes/channels/invite_create.rs +++ b/crates/delta/src/routes/channels/invite_create.rs @@ -8,12 +8,18 @@ use revolt_permissions::{calculate_channel_permissions, ChannelPermission}; use revolt_result::{create_error, Result}; use rocket::{serde::json::Json, State}; -/// # Create Invite +/// Create Invite /// /// Creates an invite to this channel. /// /// Channel must be a `TextChannel`. -#[utoipa::path(tag = "Channel Invites")] +#[utoipa::path( + tag = "Channel Invites", + security(("Session-Token" = [])), + responses( + (status = 200, body = v0::Invite), + ), +)] #[post("//invites")] pub async fn create_invite( db: &State, diff --git a/crates/delta/src/routes/channels/members_fetch.rs b/crates/delta/src/routes/channels/members_fetch.rs index 42b5b48d..7f5e4e21 100644 --- a/crates/delta/src/routes/channels/members_fetch.rs +++ b/crates/delta/src/routes/channels/members_fetch.rs @@ -7,12 +7,18 @@ use revolt_permissions::{calculate_channel_permissions, ChannelPermission}; use revolt_result::{create_error, Result}; use rocket::{serde::json::Json, State}; -/// # Fetch Group Members +/// Fetch Group Members /// /// Retrieves all users who are part of this group. /// /// This may not return full user information if users are not friends but have mutual connections. -#[utoipa::path(tag = "Groups")] +#[utoipa::path( + tag = "Groups", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 200, body = Vec), + ), +)] #[get("//members")] pub async fn fetch_members( db: &State, diff --git a/crates/delta/src/routes/channels/message_bulk_delete.rs b/crates/delta/src/routes/channels/message_bulk_delete.rs index 12b6b1e4..6d32cb35 100644 --- a/crates/delta/src/routes/channels/message_bulk_delete.rs +++ b/crates/delta/src/routes/channels/message_bulk_delete.rs @@ -10,14 +10,20 @@ use rocket::{serde::json::Json, State}; use rocket_empty::EmptyResponse; use validator::Validate; -/// # Bulk Delete Messages +/// 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. /// /// Messages must have been sent within the past 1 week. -#[utoipa::path(tag = "Messaging")] +#[utoipa::path( + tag = "Messaging", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 204), + ), +)] #[delete("//messages/bulk", data = "", rank = 1)] pub async fn bulk_delete_messages( db: &State, diff --git a/crates/delta/src/routes/channels/message_clear_reactions.rs b/crates/delta/src/routes/channels/message_clear_reactions.rs index 67a5841d..1fd0141e 100644 --- a/crates/delta/src/routes/channels/message_clear_reactions.rs +++ b/crates/delta/src/routes/channels/message_clear_reactions.rs @@ -7,12 +7,18 @@ use revolt_result::Result; use rocket::State; use rocket_empty::EmptyResponse; -/// # Remove All Reactions from Message +/// Remove All Reactions from Message /// /// Remove your own, someone else's or all of a given reaction. /// /// Requires `ManageMessages` permission. -#[utoipa::path(tag = "Interactions")] +#[utoipa::path( + tag = "Interactions", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 204), + ), +)] #[delete("//messages//reactions")] pub async fn clear_reactions( db: &State, @@ -37,7 +43,7 @@ pub async fn clear_reactions( reactions: Some(Default::default()), ..Default::default() }, - vec![] + vec![], ) .await .map(|_| EmptyResponse) diff --git a/crates/delta/src/routes/channels/message_delete.rs b/crates/delta/src/routes/channels/message_delete.rs index 7ca6c69b..2dddff81 100644 --- a/crates/delta/src/routes/channels/message_delete.rs +++ b/crates/delta/src/routes/channels/message_delete.rs @@ -7,10 +7,16 @@ use revolt_result::Result; use rocket::State; use rocket_empty::EmptyResponse; -/// # Delete Message +/// Delete Message /// /// Delete a message you've sent or one you have permission to delete. -#[utoipa::path(tag = "Messaging")] +#[utoipa::path( + tag = "Messaging", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 204), + ), +)] #[delete("//messages/", rank = 2)] pub async fn delete( db: &State, diff --git a/crates/delta/src/routes/channels/message_edit.rs b/crates/delta/src/routes/channels/message_edit.rs index 201ee3ff..7352f7e5 100644 --- a/crates/delta/src/routes/channels/message_edit.rs +++ b/crates/delta/src/routes/channels/message_edit.rs @@ -10,10 +10,16 @@ use revolt_result::{create_error, Result}; use rocket::{serde::json::Json, State}; use validator::Validate; -/// # Edit Message +/// Edit Message /// /// Edits a message that you've previously sent. -#[utoipa::path(tag = "Messaging")] +#[utoipa::path( + tag = "Messaging", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 200, body = v0::Message), + ), +)] #[patch("//messages/", data = "")] pub async fn edit( db: &State, diff --git a/crates/delta/src/routes/channels/message_fetch.rs b/crates/delta/src/routes/channels/message_fetch.rs index 98f917d6..10ecaa6a 100644 --- a/crates/delta/src/routes/channels/message_fetch.rs +++ b/crates/delta/src/routes/channels/message_fetch.rs @@ -7,10 +7,16 @@ use revolt_permissions::{calculate_channel_permissions, ChannelPermission}; use revolt_result::{create_error, Result}; use rocket::{serde::json::Json, State}; -/// # Fetch Message +/// Fetch Message /// /// Retrieves a message by its id. -#[utoipa::path(tag = "Messaging")] +#[utoipa::path( + tag = "Messaging", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 200, body = v0::Message), + ), +)] #[get("//messages/")] pub async fn fetch( db: &State, diff --git a/crates/delta/src/routes/channels/message_pin.rs b/crates/delta/src/routes/channels/message_pin.rs index 2937d5ce..683c2753 100644 --- a/crates/delta/src/routes/channels/message_pin.rs +++ b/crates/delta/src/routes/channels/message_pin.rs @@ -8,10 +8,16 @@ use revolt_result::{create_error, Result}; use rocket::State; use rocket_empty::EmptyResponse; -/// # Pins a message +/// Pins a message /// /// Pins a message by its id. -#[utoipa::path(tag = "Messaging")] +#[utoipa::path( + tag = "Messaging", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 204), + ), +)] #[post("//messages//pin")] pub async fn message_pin( db: &State, diff --git a/crates/delta/src/routes/channels/message_query.rs b/crates/delta/src/routes/channels/message_query.rs index d40081c6..3d65bfe1 100644 --- a/crates/delta/src/routes/channels/message_query.rs +++ b/crates/delta/src/routes/channels/message_query.rs @@ -8,10 +8,17 @@ use revolt_result::{create_error, Result}; use rocket::{serde::json::Json, State}; use validator::Validate; -/// # Fetch Messages +/// Fetch Messages /// /// Fetch multiple messages. -#[utoipa::path(tag = "Messaging")] +#[utoipa::path( + tag = "Messaging", + security(("Session-Token" = []), ("Bot-Token" = [])), + params(v0::OptionsQueryMessages), + responses( + (status = 200, body = v0::BulkMessageResponse), + ), +)] #[get("//messages?")] pub async fn query( db: &State, diff --git a/crates/delta/src/routes/channels/message_react.rs b/crates/delta/src/routes/channels/message_react.rs index 9cd1d9b2..983c0d76 100644 --- a/crates/delta/src/routes/channels/message_react.rs +++ b/crates/delta/src/routes/channels/message_react.rs @@ -7,10 +7,16 @@ use revolt_result::Result; use rocket::State; use rocket_empty::EmptyResponse; -/// # Add Reaction to Message +/// Add Reaction to Message /// /// React to a given message. -#[utoipa::path(tag = "Interactions")] +#[utoipa::path( + tag = "Interactions", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 204), + ), +)] #[put("//messages//reactions/")] pub async fn react_message( db: &State, diff --git a/crates/delta/src/routes/channels/message_search.rs b/crates/delta/src/routes/channels/message_search.rs index 00617eef..5b2945b2 100644 --- a/crates/delta/src/routes/channels/message_search.rs +++ b/crates/delta/src/routes/channels/message_search.rs @@ -8,10 +8,16 @@ use revolt_result::{create_error, Result}; use rocket::{serde::json::Json, State}; use validator::Validate; -/// # Search for Messages +/// Search for Messages /// /// This route searches for messages within the given parameters. -#[utoipa::path(tag = "Messaging")] +#[utoipa::path( + tag = "Messaging", + security(("Session-Token" = [])), + responses( + (status = 200, body = v0::BulkMessageResponse), + ), +)] #[post("//search", data = "")] pub async fn search( db: &State, @@ -31,7 +37,7 @@ pub async fn search( })?; if options.query.is_some() && options.pinned.is_some() { - return Err(create_error!(InvalidOperation)) + return Err(create_error!(InvalidOperation)); } let channel = target.as_channel(db).await?; diff --git a/crates/delta/src/routes/channels/message_send.rs b/crates/delta/src/routes/channels/message_send.rs index cbcecbd9..ca1096b8 100644 --- a/crates/delta/src/routes/channels/message_send.rs +++ b/crates/delta/src/routes/channels/message_send.rs @@ -12,10 +12,17 @@ use rocket::serde::json::Json; use rocket::State; use validator::Validate; -/// # Send Message +/// Send Message /// /// Sends a message to the given channel. -#[utoipa::path(tag = "Messaging")] +#[utoipa::path( + tag = "Messaging", + security(("Session-Token" = []), ("Bot-Token" = [])), + params(IdempotencyKey), + responses( + (status = 200, body = v0::Message), + ), +)] #[post("//messages", data = "")] pub async fn message_send( db: &State, diff --git a/crates/delta/src/routes/channels/message_unpin.rs b/crates/delta/src/routes/channels/message_unpin.rs index 3e83e407..24104a9a 100644 --- a/crates/delta/src/routes/channels/message_unpin.rs +++ b/crates/delta/src/routes/channels/message_unpin.rs @@ -1,14 +1,23 @@ -use revolt_database::{util::{permissions::DatabasePermissionQuery, reference::Reference}, Channel, Database, FieldsMessage, PartialMessage, SystemMessage, User, AMQP}; +use revolt_database::{ + util::{permissions::DatabasePermissionQuery, reference::Reference}, + Channel, Database, FieldsMessage, PartialMessage, SystemMessage, User, AMQP, +}; use revolt_models::v0::MessageAuthor; use revolt_permissions::{calculate_channel_permissions, ChannelPermission}; use revolt_result::{create_error, Result}; use rocket::State; use rocket_empty::EmptyResponse; -/// # Unpins a message +/// Unpins a message /// /// Unpins a message by its id. -#[utoipa::path(tag = "Messaging")] +#[utoipa::path( + tag = "Messaging", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 204), + ), +)] #[delete("//messages//pin")] pub async fn message_unpin( db: &State, diff --git a/crates/delta/src/routes/channels/message_unreact.rs b/crates/delta/src/routes/channels/message_unreact.rs index 84e7b3cb..a8a12618 100644 --- a/crates/delta/src/routes/channels/message_unreact.rs +++ b/crates/delta/src/routes/channels/message_unreact.rs @@ -8,12 +8,19 @@ use revolt_result::Result; use rocket::State; use rocket_empty::EmptyResponse; -/// # Remove Reaction(s) to Message +/// Remove Reaction(s) to Message /// /// Remove your own, someone else's or all of a given reaction. /// /// Requires `ManageMessages` if changing others' reactions. -#[utoipa::path(tag = "Interactions")] +#[utoipa::path( + tag = "Interactions", + security(("Session-Token" = []), ("Bot-Token" = [])), + params(v0::OptionsUnreact), + responses( + (status = 204), + ), +)] #[delete("//messages//reactions/?")] pub async fn unreact_message( db: &State, diff --git a/crates/delta/src/routes/channels/permissions_set.rs b/crates/delta/src/routes/channels/permissions_set.rs index 59dbb153..044c1cd5 100644 --- a/crates/delta/src/routes/channels/permissions_set.rs +++ b/crates/delta/src/routes/channels/permissions_set.rs @@ -7,12 +7,18 @@ use revolt_permissions::{calculate_channel_permissions, ChannelPermission, Overr use revolt_result::{create_error, Result}; use rocket::{serde::json::Json, State}; -/// # Set Role Permission +/// Set Role Permission /// /// Sets permissions for the specified role in this channel. /// /// Channel must be a `TextChannel` or `VoiceChannel`. -#[utoipa::path(tag = "Channel Permissions")] +#[utoipa::path( + tag = "Channel Permissions", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 200, body = v0::Channel), + ), +)] #[put("//permissions/", data = "", rank = 2)] pub async fn set_role_permissions( db: &State, diff --git a/crates/delta/src/routes/channels/permissions_set_default.rs b/crates/delta/src/routes/channels/permissions_set_default.rs index 6fea6d4a..228f72ce 100644 --- a/crates/delta/src/routes/channels/permissions_set_default.rs +++ b/crates/delta/src/routes/channels/permissions_set_default.rs @@ -7,12 +7,18 @@ use revolt_permissions::{calculate_channel_permissions, ChannelPermission}; use revolt_result::{create_error, Result}; use rocket::{serde::json::Json, State}; -/// # Set Default Permission +/// Set Default Permission /// /// Sets permissions for the default role in this channel. /// /// Channel must be a `Group`, `TextChannel` or `VoiceChannel`. -#[utoipa::path(tag = "Channel Permissions")] +#[utoipa::path( + tag = "Channel Permissions", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 200, body = v0::Channel), + ), +)] #[put("//permissions/default", data = "", rank = 1)] pub async fn set_default_channel_permissions( db: &State, diff --git a/crates/delta/src/routes/channels/voice_join.rs b/crates/delta/src/routes/channels/voice_join.rs index c909f892..70e32864 100644 --- a/crates/delta/src/routes/channels/voice_join.rs +++ b/crates/delta/src/routes/channels/voice_join.rs @@ -8,10 +8,16 @@ use revolt_permissions::{calculate_channel_permissions, ChannelPermission}; use revolt_result::{create_error, Result}; use rocket::{serde::json::Json, State}; -/// # Join Call +/// Join Call /// /// Asks the voice server for a token to join the call. -#[utoipa::path(tag = "Voice")] +#[utoipa::path( + tag = "Messaging", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 200, body = v0::LegacyCreateVoiceUserResponse), + ), +)] #[post("//join_call")] pub async fn call( db: &State, diff --git a/crates/delta/src/routes/channels/webhook_create.rs b/crates/delta/src/routes/channels/webhook_create.rs index f7e7c03c..3602a06e 100644 --- a/crates/delta/src/routes/channels/webhook_create.rs +++ b/crates/delta/src/routes/channels/webhook_create.rs @@ -11,10 +11,16 @@ use rocket::{serde::json::Json, State}; use ulid::Ulid; use validator::Validate; -/// # Creates a webhook +/// Creates a webhook /// /// Creates a webhook which 3rd party platforms can use to send messages -#[utoipa::path(tag = "Webhooks")] +#[utoipa::path( + tag = "Webhooks", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 200, body = v0::Webhook), + ), +)] #[post("//webhooks", data = "")] pub async fn create_webhook( db: &State, diff --git a/crates/delta/src/routes/channels/webhook_fetch_all.rs b/crates/delta/src/routes/channels/webhook_fetch_all.rs index 005e0da5..449f6abf 100644 --- a/crates/delta/src/routes/channels/webhook_fetch_all.rs +++ b/crates/delta/src/routes/channels/webhook_fetch_all.rs @@ -7,10 +7,16 @@ use revolt_permissions::{calculate_channel_permissions, ChannelPermission}; use revolt_result::Result; use rocket::{serde::json::Json, State}; -/// # Gets all webhooks +/// Gets all webhooks /// /// Gets all webhooks inside the channel -#[utoipa::path(tag = "Webhooks")] +#[utoipa::path( + tag = "Webhooks", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 200, body = Vec), + ), +)] #[get("//webhooks")] pub async fn fetch_webhooks( db: &State, diff --git a/crates/delta/src/routes/customisation/emoji_create.rs b/crates/delta/src/routes/customisation/emoji_create.rs index 48183b3b..700e9c05 100644 --- a/crates/delta/src/routes/customisation/emoji_create.rs +++ b/crates/delta/src/routes/customisation/emoji_create.rs @@ -7,10 +7,16 @@ use validator::Validate; use rocket::{serde::json::Json, State}; -/// # Create New Emoji +/// Create New Emoji /// /// Create an emoji by its Autumn upload id. -#[utoipa::path(tag = "Emojis")] +#[utoipa::path( + tag = "Emojis", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 200, body = v0::Emoji), + ), +)] #[put("/emoji/", data = "")] pub async fn create_emoji( db: &State, diff --git a/crates/delta/src/routes/customisation/emoji_delete.rs b/crates/delta/src/routes/customisation/emoji_delete.rs index f9fc6e84..19fe4ccb 100644 --- a/crates/delta/src/routes/customisation/emoji_delete.rs +++ b/crates/delta/src/routes/customisation/emoji_delete.rs @@ -8,10 +8,16 @@ use revolt_result::Result; use rocket::State; use rocket_empty::EmptyResponse; -/// # Delete Emoji +/// Delete Emoji /// /// Delete an emoji by its id. -#[utoipa::path(tag = "Emojis")] +#[utoipa::path( + tag = "Emojis", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 204), + ), +)] #[delete("/emoji/")] pub async fn delete_emoji( db: &State, diff --git a/crates/delta/src/routes/customisation/emoji_fetch.rs b/crates/delta/src/routes/customisation/emoji_fetch.rs index 297c2abf..1d7764a4 100644 --- a/crates/delta/src/routes/customisation/emoji_fetch.rs +++ b/crates/delta/src/routes/customisation/emoji_fetch.rs @@ -4,10 +4,16 @@ use revolt_result::Result; use rocket::{serde::json::Json, State}; -/// # Fetch Emoji +/// Fetch Emoji /// /// Fetch an emoji by its id. -#[utoipa::path(tag = "Emojis")] +#[utoipa::path( + tag = "Emojis", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 200, body = v0::Emoji), + ), +)] #[get("/emoji/")] pub async fn fetch_emoji(db: &State, emoji_id: Reference<'_>) -> Result> { emoji_id diff --git a/crates/delta/src/routes/invites/invite_delete.rs b/crates/delta/src/routes/invites/invite_delete.rs index de2a4718..a9e9e7a5 100644 --- a/crates/delta/src/routes/invites/invite_delete.rs +++ b/crates/delta/src/routes/invites/invite_delete.rs @@ -7,10 +7,16 @@ use revolt_result::Result; use rocket::State; use rocket_empty::EmptyResponse; -/// # Delete Invite +/// Delete Invite /// /// Delete an invite by its id. -#[utoipa::path(tag = "Invites")] +#[utoipa::path( + tag = "Invites", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 204), + ), +)] #[delete("/")] pub async fn delete(db: &State, user: User, target: Reference<'_>) -> Result { let invite = target.as_invite(db).await?; diff --git a/crates/delta/src/routes/invites/invite_fetch.rs b/crates/delta/src/routes/invites/invite_fetch.rs index 053b07ee..ad4d8587 100644 --- a/crates/delta/src/routes/invites/invite_fetch.rs +++ b/crates/delta/src/routes/invites/invite_fetch.rs @@ -3,10 +3,16 @@ use revolt_models::v0; use revolt_result::Result; use rocket::{serde::json::Json, State}; -/// # Fetch Invite +/// Fetch Invite /// /// Fetch an invite by its id. -#[utoipa::path(tag = "Invites")] +#[utoipa::path( + tag = "Invites", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 200, body = v0::InviteResponse), + ), +)] #[get("/")] pub async fn fetch(db: &State, target: Reference<'_>) -> Result> { Ok(Json(match target.as_invite(db).await? { diff --git a/crates/delta/src/routes/invites/invite_join.rs b/crates/delta/src/routes/invites/invite_join.rs index 16bc4518..908df38b 100644 --- a/crates/delta/src/routes/invites/invite_join.rs +++ b/crates/delta/src/routes/invites/invite_join.rs @@ -3,10 +3,16 @@ use revolt_models::v0::{self, InviteJoinResponse}; use revolt_result::{create_error, Result}; use rocket::{serde::json::Json, State}; -/// # Join Invite +/// Join Invite /// /// Join an invite by its ID -#[utoipa::path(tag = "Invites")] +#[utoipa::path( + tag = "Invites", + security(("Session-Token" = [])), + responses( + (status = 200, body = v0::InviteJoinResponse), + ), +)] #[post("/")] pub async fn join( db: &State, diff --git a/crates/delta/src/routes/mod.rs b/crates/delta/src/routes/mod.rs index dc213701..09396060 100644 --- a/crates/delta/src/routes/mod.rs +++ b/crates/delta/src/routes/mod.rs @@ -1,5 +1,6 @@ use revolt_config::Settings; -use revolt_database::{util::utoipa::TokenSecurity}; +use revolt_database::util::utoipa::TokenSecurity; +use revolt_result::ErrorAddon; pub use rocket::http::Status; pub use rocket::response::Redirect; use rocket::{Build, Rocket}; @@ -236,8 +237,12 @@ pub fn mount(config: Settings, mut rocket: Rocket) -> Rocket { ), modifiers( &Extensions, + + // TODO: merge these together when authifier is moved into the backend &SecurityAddon, &TokenSecurity, + + &ErrorAddon, ), )] pub struct ApiDoc; diff --git a/crates/delta/src/routes/onboard/complete.rs b/crates/delta/src/routes/onboard/complete.rs index 8ce0ed93..36f0a77a 100644 --- a/crates/delta/src/routes/onboard/complete.rs +++ b/crates/delta/src/routes/onboard/complete.rs @@ -15,7 +15,7 @@ use validator::Validate; /// Block lookalike characters pub static RE_USERNAME: Lazy = Lazy::new(|| Regex::new(r"^(\p{L}|[\d_.-])+$").unwrap()); -/// # New User Data +/// New User Data #[derive(Validate, Serialize, Deserialize, ToSchema)] pub struct DataOnboard { /// New username which will be used to identify the user on the platform @@ -23,10 +23,16 @@ pub struct DataOnboard { username: String, } -/// # Complete Onboarding +/// Complete Onboarding /// /// This sets a new username, completes onboarding and allows a user to start using Revolt. -#[utoipa::path(tag = "Onboarding")] +#[utoipa::path( + tag = "Onboarding", + security(("Session-Token" = [])), + responses( + (status = 200, body = v0::User), + ), +)] #[post("/complete", data = "")] pub async fn complete( db: &State, diff --git a/crates/delta/src/routes/onboard/hello.rs b/crates/delta/src/routes/onboard/hello.rs index 537efc8e..dba1cb0f 100644 --- a/crates/delta/src/routes/onboard/hello.rs +++ b/crates/delta/src/routes/onboard/hello.rs @@ -4,17 +4,23 @@ use revolt_database::User; use rocket::serde::json::Json; use serde::Serialize; -/// # Onboarding Status +/// Onboarding Status #[derive(Serialize, ToSchema)] pub struct DataHello { /// Whether onboarding is required onboarding: bool, } -/// # Check Onboarding Status +/// Check Onboarding Status /// /// This will tell you whether the current account requires onboarding or whether you can continue to send requests as usual. You may skip calling this if you're restoring an existing session. -#[utoipa::path(tag = "Onboarding")] +#[utoipa::path( + tag = "Onboarding", + security(("Session-Token" = [])), + responses( + (status = 200, body = DataHello), + ), +)] #[get("/hello")] pub async fn hello(_session: Session, user: Option) -> Json { Json(DataHello { diff --git a/crates/delta/src/routes/policy/acknowledge_policy_changes.rs b/crates/delta/src/routes/policy/acknowledge_policy_changes.rs index f9f5aab1..392a6bbb 100644 --- a/crates/delta/src/routes/policy/acknowledge_policy_changes.rs +++ b/crates/delta/src/routes/policy/acknowledge_policy_changes.rs @@ -3,10 +3,16 @@ use revolt_result::Result; use rocket::State; -/// # Acknowledge Policy Changes +/// Acknowledge Policy Changes /// /// Accept/acknowledge changes to platform policy. -#[utoipa::path(tag = "Policy")] +#[utoipa::path( + tag = "Policy", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 204), + ), +)] #[post("/acknowledge")] pub async fn acknowledge_policy_changes(db: &State, user: User) -> Result<()> { db.acknowledge_policy_changes(&user.id).await diff --git a/crates/delta/src/routes/push/subscribe.rs b/crates/delta/src/routes/push/subscribe.rs index 6e4ba84d..7be7bcce 100644 --- a/crates/delta/src/routes/push/subscribe.rs +++ b/crates/delta/src/routes/push/subscribe.rs @@ -6,12 +6,18 @@ use revolt_result::{create_database_error, Result}; use rocket::{serde::json::Json, State}; use rocket_empty::EmptyResponse; -/// # Push Subscribe +/// Push Subscribe /// /// Create a new Web Push subscription. /// /// If an existing subscription exists on this session, it will be removed. -#[utoipa::path(tag = "Web Push")] +#[utoipa::path( + tag = "Web Push", + security(("Session-Token" = [])), + responses( + (status = 204), + ), +)] #[post("/subscribe", data = "")] pub async fn subscribe( authifier: &State, diff --git a/crates/delta/src/routes/push/unsubscribe.rs b/crates/delta/src/routes/push/unsubscribe.rs index df5c9ad8..b30db155 100644 --- a/crates/delta/src/routes/push/unsubscribe.rs +++ b/crates/delta/src/routes/push/unsubscribe.rs @@ -5,10 +5,16 @@ use rocket_empty::EmptyResponse; use rocket::State; -/// # Unsubscribe +/// Unsubscribe /// /// Remove the Web Push subscription associated with the current session. -#[utoipa::path(tag = "Web Push")] +#[utoipa::path( + tag = "Web Push", + security(("Session-Token" = [])), + responses( + (status = 204), + ), +)] #[post("/unsubscribe")] pub async fn unsubscribe( authifier: &State, diff --git a/crates/delta/src/routes/root.rs b/crates/delta/src/routes/root.rs index ac988373..25db7a25 100644 --- a/crates/delta/src/routes/root.rs +++ b/crates/delta/src/routes/root.rs @@ -3,10 +3,13 @@ use revolt_models::v0; use revolt_result::Result; use rocket::serde::json::Json; -/// # Query Node +/// Query Node /// /// Fetch the server configuration for this Revolt instance. -#[utoipa::path(tag = "Core")] +#[utoipa::path( + tag = "Core", + responses((status = 200, body = v0::RevoltConfig)) +)] #[get("/")] pub async fn root() -> Result> { let config = config().await; diff --git a/crates/delta/src/routes/safety/report_content.rs b/crates/delta/src/routes/safety/report_content.rs index 587d9439..b7db1023 100644 --- a/crates/delta/src/routes/safety/report_content.rs +++ b/crates/delta/src/routes/safety/report_content.rs @@ -7,7 +7,7 @@ use validator::Validate; use rocket::{serde::json::Json, State}; -/// # Report Data +/// Report Data #[derive(Validate, Deserialize, ToSchema)] pub struct DataReportContent { /// Content being reported @@ -18,10 +18,16 @@ pub struct DataReportContent { additional_context: String, } -/// # Report Content +/// Report Content /// /// Report a piece of content to the moderation team. -#[utoipa::path(tag = "User Safety")] +#[utoipa::path( + tag = "User Safety", + security(("Session-Token" = [])), + responses( + (status = 204), + ), +)] #[post("/report", data = "")] pub async fn report_content( db: &State, diff --git a/crates/delta/src/routes/servers/ban_create.rs b/crates/delta/src/routes/servers/ban_create.rs index 609497e9..e42d7243 100644 --- a/crates/delta/src/routes/servers/ban_create.rs +++ b/crates/delta/src/routes/servers/ban_create.rs @@ -9,10 +9,16 @@ use revolt_result::{create_error, Result}; use rocket::{serde::json::Json, State}; use validator::Validate; -/// # Ban User +/// Ban User /// /// Ban a user by their id. -#[utoipa::path(tag = "Server Members")] +#[utoipa::path( + tag = "Server Members", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 200, body = v0::ServerBan), + ), +)] #[put("//bans/", data = "")] pub async fn ban( db: &State, diff --git a/crates/delta/src/routes/servers/ban_list.rs b/crates/delta/src/routes/servers/ban_list.rs index 34726db9..e6032dfc 100644 --- a/crates/delta/src/routes/servers/ban_list.rs +++ b/crates/delta/src/routes/servers/ban_list.rs @@ -9,10 +9,16 @@ use revolt_result::Result; use rocket::serde::json::Json; use rocket::State; -/// # Fetch Bans +/// Fetch Bans /// /// Fetch all bans on a server. -#[utoipa::path(tag = "Server Members")] +#[utoipa::path( + tag = "Server Members", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 200, body = v0::BanListResult), + ), +)] #[get("//bans")] pub async fn list( db: &State, diff --git a/crates/delta/src/routes/servers/ban_remove.rs b/crates/delta/src/routes/servers/ban_remove.rs index b1468a96..1850f3c1 100644 --- a/crates/delta/src/routes/servers/ban_remove.rs +++ b/crates/delta/src/routes/servers/ban_remove.rs @@ -7,10 +7,16 @@ use revolt_result::Result; use rocket::State; use rocket_empty::EmptyResponse; -/// # Unban user +/// Unban user /// /// Remove a user's ban. -#[utoipa::path(tag = "Server Members")] +#[utoipa::path( + tag = "Server Members", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 204), + ), +)] #[delete("//bans/")] pub async fn unban( db: &State, diff --git a/crates/delta/src/routes/servers/channel_create.rs b/crates/delta/src/routes/servers/channel_create.rs index a633f4fc..736ed42f 100644 --- a/crates/delta/src/routes/servers/channel_create.rs +++ b/crates/delta/src/routes/servers/channel_create.rs @@ -8,10 +8,16 @@ use rocket::serde::json::Json; use rocket::State; use validator::Validate; -/// # Create Channel +/// Create Channel /// /// Create a new Text or Voice channel. -#[utoipa::path(tag = "Server Information")] +#[utoipa::path( + tag = "Server Information", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 200, body = v0::Channel), + ), +)] #[post("//channels", data = "")] pub async fn create_server_channel( db: &State, diff --git a/crates/delta/src/routes/servers/emoji_list.rs b/crates/delta/src/routes/servers/emoji_list.rs index db19499a..a7f09afb 100644 --- a/crates/delta/src/routes/servers/emoji_list.rs +++ b/crates/delta/src/routes/servers/emoji_list.rs @@ -7,10 +7,16 @@ use revolt_permissions::PermissionQuery; use revolt_result::{create_error, Result}; use rocket::{serde::json::Json, State}; -/// # Fetch Server Emoji +/// Fetch Server Emoji /// /// Fetch all emoji on a server. -#[utoipa::path(tag = "Server Customisation")] +#[utoipa::path( + tag = "Server Customisation", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 200, body = Vec), + ), +)] #[get("//emojis")] pub async fn list_emoji( db: &State, diff --git a/crates/delta/src/routes/servers/invites_fetch.rs b/crates/delta/src/routes/servers/invites_fetch.rs index f43554ad..612916c7 100644 --- a/crates/delta/src/routes/servers/invites_fetch.rs +++ b/crates/delta/src/routes/servers/invites_fetch.rs @@ -7,10 +7,16 @@ use revolt_permissions::{calculate_server_permissions, ChannelPermission}; use revolt_result::Result; use rocket::{serde::json::Json, State}; -/// # Fetch Invites +/// Fetch Invites /// /// Fetch all server invites. -#[utoipa::path(tag = "Server Members")] +#[utoipa::path( + tag = "Server Members", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 200, body = Vec), + ), +)] #[get("//invites")] pub async fn invites( db: &State, diff --git a/crates/delta/src/routes/servers/member_edit.rs b/crates/delta/src/routes/servers/member_edit.rs index 08f58c08..9d4e78d1 100644 --- a/crates/delta/src/routes/servers/member_edit.rs +++ b/crates/delta/src/routes/servers/member_edit.rs @@ -11,10 +11,16 @@ use revolt_result::{create_error, Result}; use rocket::{serde::json::Json, State}; use validator::Validate; -/// # Edit Member +/// Edit Member /// /// Edit a member by their id. -#[utoipa::path(tag = "Server Members")] +#[utoipa::path( + tag = "Server Members", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 200, body = v0::Member), + ), +)] #[patch("//members/", data = "")] pub async fn edit( db: &State, @@ -40,7 +46,9 @@ pub async fn edit( let permissions = calculate_server_permissions(&mut query).await; // Fetch target permissions - let mut target_query = DatabasePermissionQuery::new(db, &target_user).server(&server).member(&member); + let mut target_query = DatabasePermissionQuery::new(db, &target_user) + .server(&server) + .member(&member); let target_permissions = calculate_server_permissions(&mut target_query).await; // Check permissions in server @@ -71,7 +79,7 @@ pub async fn edit( } if target_permissions.has_channel_permission(ChannelPermission::TimeoutMembers) { - return Err(create_error!(IsElevated)) + return Err(create_error!(IsElevated)); } } diff --git a/crates/delta/src/routes/servers/member_experimental_query.rs b/crates/delta/src/routes/servers/member_experimental_query.rs index 27809dfd..81420b42 100644 --- a/crates/delta/src/routes/servers/member_experimental_query.rs +++ b/crates/delta/src/routes/servers/member_experimental_query.rs @@ -9,8 +9,8 @@ use revolt_result::{create_error, Result}; use rocket::{serde::json::Json, State}; use serde::{Deserialize, Serialize}; -/// # Query Parameters -#[derive(Deserialize, ToSchema, FromForm)] +/// Query Parameters +#[derive(Deserialize, ToSchema, FromForm, IntoParams)] pub struct OptionsQueryMembers { /// String to search for query: String, @@ -19,8 +19,8 @@ pub struct OptionsQueryMembers { experimental_api: bool, } -/// # Query members by name -#[derive(Serialize, ToSchema)] +/// Query members by name +#[derive(Serialize, ToSchema, IntoParams)] pub struct MemberQueryResponse { /// List of members members: Vec, @@ -28,10 +28,17 @@ pub struct MemberQueryResponse { users: Vec, } -/// # Query members by name +/// Query members by name /// /// Query members by a given name, this API is not stable and will be removed in the future. -#[utoipa::path(tag = "Server Members")] +#[utoipa::path( + tag = "Server Members", + security(("Session-Token" = []), ("Bot-Token" = [])), + params(OptionsQueryMembers), + responses( + (status = 200, body = MemberQueryResponse), + ), +)] #[get("//members_experimental_query?")] pub async fn member_experimental_query( db: &State, diff --git a/crates/delta/src/routes/servers/member_fetch.rs b/crates/delta/src/routes/servers/member_fetch.rs index 5ec1fc3f..6d5bcc43 100644 --- a/crates/delta/src/routes/servers/member_fetch.rs +++ b/crates/delta/src/routes/servers/member_fetch.rs @@ -7,10 +7,24 @@ use revolt_permissions::PermissionQuery; use revolt_result::{create_error, Result}; use rocket::{serde::json::Json, State}; -/// # Fetch Member +/// Fetch Member /// /// Retrieve a member. -#[utoipa::path(tag = "Server Members")] +#[utoipa::path( + tag = "Server Members", + security(("Session-Token" = []), ("Bot-Token" = [])), + params( + ( + "roles" = bool, + Query, + description = "Whether to include roles in the response", + example = json!(true) + ) + ), + responses( + (status = 200, body = v0::MemberResponse), + ), +)] #[get("//members/?")] pub async fn fetch( db: &State, diff --git a/crates/delta/src/routes/servers/member_fetch_all.rs b/crates/delta/src/routes/servers/member_fetch_all.rs index b7eb30d7..bcfb5896 100644 --- a/crates/delta/src/routes/servers/member_fetch_all.rs +++ b/crates/delta/src/routes/servers/member_fetch_all.rs @@ -7,10 +7,17 @@ use revolt_permissions::PermissionQuery; use revolt_result::{create_error, Result}; use rocket::{serde::json::Json, State}; -/// # Fetch Members +/// Fetch Members /// /// Fetch all server members. -#[utoipa::path(tag = "Server Members")] +#[utoipa::path( + tag = "Server Members", + security(("Session-Token" = []), ("Bot-Token" = [])), + params(v0::OptionsFetchAllMembers), + responses( + (status = 200, body = v0::AllMemberResponse), + ), +)] #[get("//members?")] pub async fn fetch_all( db: &State, diff --git a/crates/delta/src/routes/servers/member_remove.rs b/crates/delta/src/routes/servers/member_remove.rs index b96e3498..084de8d6 100644 --- a/crates/delta/src/routes/servers/member_remove.rs +++ b/crates/delta/src/routes/servers/member_remove.rs @@ -7,10 +7,16 @@ use revolt_result::{create_error, Result}; use rocket::State; use rocket_empty::EmptyResponse; -/// # Kick Member +/// Kick Member /// /// Removes a member from the server. -#[utoipa::path(tag = "Server Members")] +#[utoipa::path( + tag = "Server Members", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 204), + ), +)] #[delete("//members/")] pub async fn kick( db: &State, diff --git a/crates/delta/src/routes/servers/permissions_set.rs b/crates/delta/src/routes/servers/permissions_set.rs index 2f57b2bf..399f2e32 100644 --- a/crates/delta/src/routes/servers/permissions_set.rs +++ b/crates/delta/src/routes/servers/permissions_set.rs @@ -7,10 +7,16 @@ use revolt_permissions::{calculate_server_permissions, ChannelPermission, Overri use revolt_result::{create_error, Result}; use rocket::{serde::json::Json, State}; -/// # Set Role Permission +/// Set Role Permission /// /// Sets permissions for the specified role in the server. -#[utoipa::path(tag = "Server Permissions")] +#[utoipa::path( + tag = "Server Permissions", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 200, body = v0::Server), + ), +)] #[put("//permissions/", data = "", rank = 2)] pub async fn set_role_permission( db: &State, diff --git a/crates/delta/src/routes/servers/permissions_set_default.rs b/crates/delta/src/routes/servers/permissions_set_default.rs index c965ca33..486e650c 100644 --- a/crates/delta/src/routes/servers/permissions_set_default.rs +++ b/crates/delta/src/routes/servers/permissions_set_default.rs @@ -9,10 +9,16 @@ use revolt_permissions::{ use revolt_result::Result; use rocket::{serde::json::Json, State}; -/// # Set Default Permission +/// Set Default Permission /// /// Sets permissions for the default role in this server. -#[utoipa::path(tag = "Server Permissions")] +#[utoipa::path( + tag = "Server Permissions", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 200, body = v0::Server), + ), +)] #[put("//permissions/default", data = "", rank = 1)] pub async fn set_default_server_permissions( db: &State, diff --git a/crates/delta/src/routes/servers/roles_create.rs b/crates/delta/src/routes/servers/roles_create.rs index eabe90f2..dc1aec26 100644 --- a/crates/delta/src/routes/servers/roles_create.rs +++ b/crates/delta/src/routes/servers/roles_create.rs @@ -9,10 +9,16 @@ use revolt_result::{create_error, Result}; use rocket::{serde::json::Json, State}; use validator::Validate; -/// # Create Role +/// Create Role /// /// Creates a new server role. -#[utoipa::path(tag = "Server Permissions")] +#[utoipa::path( + tag = "Server Permissions", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 200, body = v0::NewRoleResponse), + ), +)] #[post("//roles", data = "")] pub async fn create( db: &State, diff --git a/crates/delta/src/routes/servers/roles_delete.rs b/crates/delta/src/routes/servers/roles_delete.rs index f0f80a4f..ff04ed6b 100644 --- a/crates/delta/src/routes/servers/roles_delete.rs +++ b/crates/delta/src/routes/servers/roles_delete.rs @@ -7,10 +7,16 @@ use revolt_result::{create_error, Result}; use rocket::State; use rocket_empty::EmptyResponse; -/// # Delete Role +/// Delete Role /// /// Delete a server role by its id. -#[utoipa::path(tag = "Server Permissions")] +#[utoipa::path( + tag = "Server Permissions", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 204), + ), +)] #[delete("//roles/")] pub async fn delete( db: &State, diff --git a/crates/delta/src/routes/servers/roles_edit.rs b/crates/delta/src/routes/servers/roles_edit.rs index 4c3041fe..04e0031e 100644 --- a/crates/delta/src/routes/servers/roles_edit.rs +++ b/crates/delta/src/routes/servers/roles_edit.rs @@ -8,10 +8,16 @@ use revolt_result::{create_error, Result}; use rocket::{serde::json::Json, State}; use validator::Validate; -/// # Edit Role +/// Edit Role /// /// Edit a role by its id. -#[utoipa::path(tag = "Server Permissions")] +#[utoipa::path( + tag = "Server Permissions", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 200, body = v0::Role), + ), +)] #[patch("//roles/", data = "", rank = 1)] pub async fn edit( db: &State, diff --git a/crates/delta/src/routes/servers/roles_edit_positions.rs b/crates/delta/src/routes/servers/roles_edit_positions.rs index d3489173..dd815909 100644 --- a/crates/delta/src/routes/servers/roles_edit_positions.rs +++ b/crates/delta/src/routes/servers/roles_edit_positions.rs @@ -7,10 +7,16 @@ use revolt_permissions::{calculate_server_permissions, ChannelPermission}; use revolt_result::{create_error, Result}; use rocket::{serde::json::Json, State}; -/// # Edits server roles ranks +/// Edits server roles ranks /// /// Edit's server role's ranks. -#[utoipa::path(tag = "Server Permissions")] +#[utoipa::path( + tag = "Server Permissions", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 200, body = v0::Server), + ), +)] #[patch("//roles/ranks", data = "")] pub async fn edit_role_ranks( db: &State, diff --git a/crates/delta/src/routes/servers/roles_fetch.rs b/crates/delta/src/routes/servers/roles_fetch.rs index 27734e9e..2f4449bc 100644 --- a/crates/delta/src/routes/servers/roles_fetch.rs +++ b/crates/delta/src/routes/servers/roles_fetch.rs @@ -7,10 +7,16 @@ use revolt_permissions::PermissionQuery; use revolt_result::{create_error, Result}; use rocket::{serde::json::Json, State}; -/// # Fetch Role +/// Fetch Role /// /// Fetch a role by its id. -#[utoipa::path(tag = "Server Permissions")] +#[utoipa::path( + tag = "Server Permissions", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 200, body = v0::Role), + ), +)] #[get("//roles/")] pub async fn fetch( db: &State, diff --git a/crates/delta/src/routes/servers/server_ack.rs b/crates/delta/src/routes/servers/server_ack.rs index 9162dd40..f8fcd6e1 100644 --- a/crates/delta/src/routes/servers/server_ack.rs +++ b/crates/delta/src/routes/servers/server_ack.rs @@ -7,10 +7,16 @@ use revolt_result::{create_error, Result}; use rocket::State; use rocket_empty::EmptyResponse; -/// # Mark Server As Read +/// Mark Server As Read /// /// Mark all channels in a server as read. -#[utoipa::path(tag = "Server Information")] +#[utoipa::path( + tag = "Server Permissions", + security(("Session-Token" = [])), + responses( + (status = 204), + ), +)] #[put("//ack")] pub async fn ack(db: &State, user: User, target: Reference<'_>) -> Result { if user.bot.is_some() { diff --git a/crates/delta/src/routes/servers/server_create.rs b/crates/delta/src/routes/servers/server_create.rs index dd1068ba..527c000c 100644 --- a/crates/delta/src/routes/servers/server_create.rs +++ b/crates/delta/src/routes/servers/server_create.rs @@ -6,10 +6,16 @@ use rocket::serde::json::Json; use rocket::State; use validator::Validate; -/// # Create Server +/// Create Server /// /// Create a new server. -#[utoipa::path(tag = "Server Information")] +#[utoipa::path( + tag = "Server Permissions", + security(("Session-Token" = [])), + responses( + (status = 200, body = v0::CreateServerLegacyResponse), + ), +)] #[post("/create", data = "")] pub async fn create_server( db: &State, diff --git a/crates/delta/src/routes/servers/server_delete.rs b/crates/delta/src/routes/servers/server_delete.rs index 49006aac..6df7114f 100644 --- a/crates/delta/src/routes/servers/server_delete.rs +++ b/crates/delta/src/routes/servers/server_delete.rs @@ -5,10 +5,17 @@ use rocket::State; use rocket_empty::EmptyResponse; -/// # Delete / Leave Server +/// Delete / Leave Server /// /// Deletes a server if owner otherwise leaves. -#[utoipa::path(tag = "Server Information")] +#[utoipa::path( + tag = "Server Permissions", + security(("Session-Token" = []), ("Bot-Token" = [])), + params(v0::OptionsServerDelete), + responses( + (status = 204), + ), +)] #[delete("/?")] pub async fn delete( db: &State, diff --git a/crates/delta/src/routes/servers/server_edit.rs b/crates/delta/src/routes/servers/server_edit.rs index 54a97c3a..44f037d2 100644 --- a/crates/delta/src/routes/servers/server_edit.rs +++ b/crates/delta/src/routes/servers/server_edit.rs @@ -10,10 +10,16 @@ use revolt_result::{create_error, Result}; use rocket::{serde::json::Json, State}; use validator::Validate; -/// # Edit Server +/// Edit Server /// /// Edit a server by its id. -#[utoipa::path(tag = "Server Information")] +#[utoipa::path( + tag = "Server Information", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 200, body = v0::Server), + ), +)] #[patch("/", data = "")] pub async fn edit( db: &State, diff --git a/crates/delta/src/routes/servers/server_fetch.rs b/crates/delta/src/routes/servers/server_fetch.rs index 8defad7f..28e838f9 100644 --- a/crates/delta/src/routes/servers/server_fetch.rs +++ b/crates/delta/src/routes/servers/server_fetch.rs @@ -7,10 +7,17 @@ use revolt_permissions::{calculate_channel_permissions, ChannelPermission, Permi use revolt_result::{create_error, Result}; use rocket::{serde::json::Json, State}; -/// # Fetch Server +/// Fetch Server /// /// Fetch a server by its id. -#[utoipa::path(tag = "Server Information")] +#[utoipa::path( + tag = "Server Information", + security(("Session-Token" = []), ("Bot-Token" = [])), + params(v0::OptionsFetchServer), + responses( + (status = 200, body = v0::Server), + ), +)] #[get("/?")] pub async fn fetch( db: &State, diff --git a/crates/delta/src/routes/sync/get_settings.rs b/crates/delta/src/routes/sync/get_settings.rs index 8173ad92..12026a48 100644 --- a/crates/delta/src/routes/sync/get_settings.rs +++ b/crates/delta/src/routes/sync/get_settings.rs @@ -4,12 +4,18 @@ use revolt_result::Result; use rocket::serde::json::Json; use rocket::State; -/// # Fetch Settings +/// Fetch Settings /// /// Fetch settings from server filtered by keys. /// /// This will return an object with the requested keys, each value is a tuple of `(timestamp, value)`, the value is the previously uploaded data. -#[utoipa::path(tag = "Sync")] +#[utoipa::path( + tag = "Sync", + security(("Session-Token" = [])), + responses( + (status = 200, body = v0::OptionsFetchSettings), + ), +)] #[post("/settings/fetch", data = "")] pub async fn fetch( db: &State, diff --git a/crates/delta/src/routes/sync/get_unreads.rs b/crates/delta/src/routes/sync/get_unreads.rs index d7f115b8..8a0f55fe 100644 --- a/crates/delta/src/routes/sync/get_unreads.rs +++ b/crates/delta/src/routes/sync/get_unreads.rs @@ -4,10 +4,16 @@ use revolt_result::Result; use rocket::serde::json::Json; use rocket::State; -/// # Fetch Unreads +/// Fetch Unreads /// /// Fetch information about unread state on channels. -#[utoipa::path(tag = "Sync")] +#[utoipa::path( + tag = "Sync", + security(("Session-Token" = [])), + responses( + (status = 200, body = v0::ChannelUnread), + ), +)] #[get("/unreads")] pub async fn unreads(db: &State, user: User) -> Result>> { db.fetch_unreads(&user.id) diff --git a/crates/delta/src/routes/sync/set_settings.rs b/crates/delta/src/routes/sync/set_settings.rs index c3d4edb2..08fa37ef 100644 --- a/crates/delta/src/routes/sync/set_settings.rs +++ b/crates/delta/src/routes/sync/set_settings.rs @@ -9,10 +9,22 @@ use std::collections::HashMap; type Data = HashMap; -/// # Set Settings +/// Set Settings /// /// Upload data to save to settings. -#[utoipa::path(tag = "Sync")] +#[utoipa::path( + tag = "Sync", + security(("Session-Token" = [])), + request_body( + content = Data, + content_type = "application/json", + example = json!({"servers": "[\"01F7ZSBSFHQ8TA81725KQCSDDP\"]"}), + ), + params(v0::OptionsSetSettings), + responses( + (status = 204), + ), +)] #[post("/settings/set?", data = "")] pub async fn set( db: &State, diff --git a/crates/delta/src/routes/users/add_friend.rs b/crates/delta/src/routes/users/add_friend.rs index 1fafc46d..cdf4e6e7 100644 --- a/crates/delta/src/routes/users/add_friend.rs +++ b/crates/delta/src/routes/users/add_friend.rs @@ -5,10 +5,16 @@ use revolt_result::{create_error, Result}; use rocket::serde::json::Json; use rocket::State; -/// # Accept Friend Request +/// Accept Friend Request /// /// Accept another user's friend request. -#[utoipa::path(tag = "Relationships")] +#[utoipa::path( + tag = "Relationships", + security(("Session-Token" = [])), + responses( + (status = 200, body = v0::User), + ), +)] #[put("//friend")] pub async fn add( db: &State, diff --git a/crates/delta/src/routes/users/block_user.rs b/crates/delta/src/routes/users/block_user.rs index 19f7139f..441c3426 100644 --- a/crates/delta/src/routes/users/block_user.rs +++ b/crates/delta/src/routes/users/block_user.rs @@ -5,10 +5,16 @@ use revolt_result::Result; use rocket::serde::json::Json; use rocket::State; -/// # Block User +/// Block User /// /// Block another user by their id. -#[utoipa::path(tag = "Relationships")] +#[utoipa::path( + tag = "Relationships", + security(("Session-Token" = [])), + responses( + (status = 200, body = v0::User), + ), +)] #[put("//block")] pub async fn block( db: &State, diff --git a/crates/delta/src/routes/users/change_username.rs b/crates/delta/src/routes/users/change_username.rs index 2ba7413a..8f946eb1 100644 --- a/crates/delta/src/routes/users/change_username.rs +++ b/crates/delta/src/routes/users/change_username.rs @@ -14,7 +14,7 @@ use validator::Validate; /// Block lookalike characters pub static RE_USERNAME: Lazy = Lazy::new(|| Regex::new(r"^(\p{L}|[\d_.-])+$").unwrap()); -/// # Username Information +/// Username Information #[derive(Validate, Serialize, Deserialize, ToSchema)] pub struct DataChangeUsername { /// New username @@ -25,10 +25,16 @@ pub struct DataChangeUsername { password: String, } -/// # Change Username +/// Change Username /// /// Change your username. -#[utoipa::path(tag = "User Information")] +#[utoipa::path( + tag = "User Information", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 200, body = v0::User), + ), +)] #[patch("/@me/username", data = "")] pub async fn change_username( db: &State, diff --git a/crates/delta/src/routes/users/edit_user.rs b/crates/delta/src/routes/users/edit_user.rs index fba1f7e7..2809d1d6 100644 --- a/crates/delta/src/routes/users/edit_user.rs +++ b/crates/delta/src/routes/users/edit_user.rs @@ -6,10 +6,16 @@ use rocket::serde::json::Json; use rocket::State; use validator::Validate; -/// # Edit User +/// Edit User /// /// Edit currently authenticated user. -#[utoipa::path(tag = "User Information")] +#[utoipa::path( + tag = "User Information", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 200, body = v0::User), + ), +)] #[patch("/", data = "")] pub async fn edit( db: &State, diff --git a/crates/delta/src/routes/users/fetch_dms.rs b/crates/delta/src/routes/users/fetch_dms.rs index b0ef8856..0f44334b 100644 --- a/crates/delta/src/routes/users/fetch_dms.rs +++ b/crates/delta/src/routes/users/fetch_dms.rs @@ -3,10 +3,16 @@ use revolt_models::v0; use revolt_result::Result; use rocket::{serde::json::Json, State}; -/// # Fetch Direct Message Channels +/// Fetch Direct Message Channels /// /// This fetches your direct messages, including any DM and group DM conversations. -#[utoipa::path(tag = "Direct Messaging")] +#[utoipa::path( + tag = "Direct Messaging", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 200, body = Vec), + ), +)] #[get("/dms")] pub async fn direct_messages(db: &State, user: User) -> Result>> { db.find_direct_messages(&user.id) diff --git a/crates/delta/src/routes/users/fetch_profile.rs b/crates/delta/src/routes/users/fetch_profile.rs index 44e360d8..38d78f9d 100644 --- a/crates/delta/src/routes/users/fetch_profile.rs +++ b/crates/delta/src/routes/users/fetch_profile.rs @@ -7,12 +7,18 @@ use revolt_permissions::{calculate_user_permissions, UserPermission}; use revolt_result::Result; use rocket::{serde::json::Json, State}; -/// # Fetch User Profile +/// Fetch User Profile /// /// Retrieve a user's profile data. /// /// Will fail if you do not have permission to access the other user's profile. -#[utoipa::path(tag = "User Information")] +#[utoipa::path( + tag = "User Information", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 200, body = v0::UserProfile), + ), +)] #[get("//profile")] pub async fn profile( db: &State, diff --git a/crates/delta/src/routes/users/fetch_self.rs b/crates/delta/src/routes/users/fetch_self.rs index ee5fc63f..af4cebee 100755 --- a/crates/delta/src/routes/users/fetch_self.rs +++ b/crates/delta/src/routes/users/fetch_self.rs @@ -3,10 +3,16 @@ use revolt_models::v0; use revolt_result::Result; use rocket::serde::json::Json; -/// # Fetch Self +/// Fetch Self /// /// Retrieve your user information. -#[utoipa::path(tag = "User Information")] +#[utoipa::path( + tag = "User Information", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 200, body = v0::User), + ), +)] #[get("/@me")] pub async fn fetch(user: User) -> Result> { Ok(Json(user.into_self(false).await)) diff --git a/crates/delta/src/routes/users/fetch_user.rs b/crates/delta/src/routes/users/fetch_user.rs index 3c0f6336..545bc809 100644 --- a/crates/delta/src/routes/users/fetch_user.rs +++ b/crates/delta/src/routes/users/fetch_user.rs @@ -8,10 +8,16 @@ use revolt_permissions::{calculate_user_permissions, UserPermission}; use revolt_result::Result; use rocket::{serde::json::Json, State}; -/// # Fetch User +/// Fetch User /// /// Retrieve a user's information. -#[utoipa::path(tag = "User Information")] +#[utoipa::path( + tag = "User Information", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 200, body = v0::User), + ), +)] #[get("/")] pub async fn fetch( db: &State, diff --git a/crates/delta/src/routes/users/fetch_user_flags.rs b/crates/delta/src/routes/users/fetch_user_flags.rs index 52498f81..853155df 100644 --- a/crates/delta/src/routes/users/fetch_user_flags.rs +++ b/crates/delta/src/routes/users/fetch_user_flags.rs @@ -3,10 +3,15 @@ use revolt_models::v0; use revolt_result::Result; use rocket::{serde::json::Json, State}; -/// # Fetch User Flags +/// Fetch User Flags /// /// Retrieve a user's flags. -#[utoipa::path(tag = "User Information")] +#[utoipa::path( + tag = "User Information", + responses( + (status = 200, body = v0::FlagResponse), + ), +)] #[get("//flags")] pub async fn fetch_user_flags( db: &State, diff --git a/crates/delta/src/routes/users/find_mutual.rs b/crates/delta/src/routes/users/find_mutual.rs index 39859270..f35335ee 100644 --- a/crates/delta/src/routes/users/find_mutual.rs +++ b/crates/delta/src/routes/users/find_mutual.rs @@ -8,10 +8,16 @@ use revolt_result::{create_error, Result}; use rocket::serde::json::Json; use rocket::State; -/// # Fetch Mutual Friends, Servers, Groups and DMs +/// Fetch Mutual Friends, Servers, Groups and DMs /// /// Retrieve a list of mutual friends, servers, groups and DMs with another user. -#[utoipa::path(tag = "Relationships")] +#[utoipa::path( + tag = "User Information", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 200, body = v0::MutualResponse), + ), +)] #[get("//mutual")] pub async fn mutual( db: &State, diff --git a/crates/delta/src/routes/users/get_default_avatar.rs b/crates/delta/src/routes/users/get_default_avatar.rs index a85396e0..2203bd52 100644 --- a/crates/delta/src/routes/users/get_default_avatar.rs +++ b/crates/delta/src/routes/users/get_default_avatar.rs @@ -3,6 +3,7 @@ use rocket::response::{self, Responder}; use rocket::{Request, Response}; #[derive(ToSchema)] +#[schema(format = "binary", value_type = String)] pub struct CachedFile(Vec); pub static CACHE_CONTROL: &str = "public, max-age=31536000, immutable"; @@ -15,10 +16,21 @@ impl<'r> Responder<'r, 'static> for CachedFile { } } -/// # Fetch Default Avatar +/// Fetch Default Avatar /// /// This returns a default avatar based on the given id. -#[utoipa::path(tag = "User Information")] +#[utoipa::path( + tag = "User Information", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + ( + status = 200, + description = "PNG image with the users default avatar.", + content_type = "image/png", + body = CachedFile, + ), + ), +)] #[get("//default_avatar")] pub async fn default_avatar(target: String) -> (ContentType, CachedFile) { ( diff --git a/crates/delta/src/routes/users/open_dm.rs b/crates/delta/src/routes/users/open_dm.rs index 07c19582..290be61e 100644 --- a/crates/delta/src/routes/users/open_dm.rs +++ b/crates/delta/src/routes/users/open_dm.rs @@ -7,12 +7,18 @@ use revolt_permissions::{calculate_user_permissions, UserPermission}; use revolt_result::Result; use rocket::{serde::json::Json, State}; -/// # Open Direct Message +/// Open Direct Message /// /// Open a DM with another user. /// /// If the target is oneself, a saved messages channel is returned. -#[utoipa::path(tag = "Direct Messaging")] +#[utoipa::path( + tag = "Direct Messaging", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 200, body = v0::Channel), + ), +)] #[get("//dm")] pub async fn open_dm( db: &State, diff --git a/crates/delta/src/routes/users/remove_friend.rs b/crates/delta/src/routes/users/remove_friend.rs index 1c1fc40f..f746cd52 100644 --- a/crates/delta/src/routes/users/remove_friend.rs +++ b/crates/delta/src/routes/users/remove_friend.rs @@ -5,10 +5,16 @@ use revolt_result::{create_error, Result}; use rocket::serde::json::Json; use rocket::State; -/// # Deny Friend Request / Remove Friend +/// Deny Friend Request / Remove Friend /// /// Denies another user's friend request or removes an existing friend. -#[utoipa::path(tag = "Relationships")] +#[utoipa::path( + tag = "Relationships", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 200, body = v0::User), + ), +)] #[delete("//friend")] pub async fn remove( db: &State, diff --git a/crates/delta/src/routes/users/send_friend_request.rs b/crates/delta/src/routes/users/send_friend_request.rs index ce91be1b..f42ad9c2 100644 --- a/crates/delta/src/routes/users/send_friend_request.rs +++ b/crates/delta/src/routes/users/send_friend_request.rs @@ -5,10 +5,16 @@ use revolt_result::{create_error, Result}; use rocket::serde::json::Json; use rocket::State; -/// # Send Friend Request +/// Send Friend Request /// /// Send a friend request to another user. -#[utoipa::path(tag = "Relationships")] +#[utoipa::path( + tag = "Relationships", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 200, body = v0::User), + ), +)] #[post("/friend", data = "")] pub async fn send_friend_request( db: &State, diff --git a/crates/delta/src/routes/users/unblock_user.rs b/crates/delta/src/routes/users/unblock_user.rs index 789e7542..e8829a37 100644 --- a/crates/delta/src/routes/users/unblock_user.rs +++ b/crates/delta/src/routes/users/unblock_user.rs @@ -5,10 +5,16 @@ use revolt_result::Result; use rocket::serde::json::Json; use rocket::State; -/// # Unblock User +/// Unblock User /// /// Unblock another user by their id. -#[utoipa::path(tag = "Relationships")] +#[utoipa::path( + tag = "Relationships", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 200, body = v0::User), + ), +)] #[delete("//block")] pub async fn unblock( db: &State, diff --git a/crates/delta/src/routes/webhooks/webhook_delete.rs b/crates/delta/src/routes/webhooks/webhook_delete.rs index 3c76bafd..40518cf4 100644 --- a/crates/delta/src/routes/webhooks/webhook_delete.rs +++ b/crates/delta/src/routes/webhooks/webhook_delete.rs @@ -7,10 +7,16 @@ use revolt_result::Result; use rocket::State; use rocket_empty::EmptyResponse; -/// # Deletes a webhook +/// Deletes a webhook /// /// Deletes a webhook -#[utoipa::path(tag = "Webhooks")] +#[utoipa::path( + tag = "Webhooks", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 204), + ), +)] #[delete("/")] pub async fn webhook_delete( db: &State, diff --git a/crates/delta/src/routes/webhooks/webhook_delete_token.rs b/crates/delta/src/routes/webhooks/webhook_delete_token.rs index 9d8d9541..dd036a28 100644 --- a/crates/delta/src/routes/webhooks/webhook_delete_token.rs +++ b/crates/delta/src/routes/webhooks/webhook_delete_token.rs @@ -3,10 +3,15 @@ use revolt_result::Result; use rocket::State; use rocket_empty::EmptyResponse; -/// # Deletes a webhook +/// Deletes a webhook /// /// Deletes a webhook with a token -#[utoipa::path(tag = "Webhooks")] +#[utoipa::path( + tag = "Webhooks", + responses( + (status = 204), + ), +)] #[delete("//")] pub async fn webhook_delete_token( db: &State, diff --git a/crates/delta/src/routes/webhooks/webhook_edit.rs b/crates/delta/src/routes/webhooks/webhook_edit.rs index c25df675..1ca603e8 100644 --- a/crates/delta/src/routes/webhooks/webhook_edit.rs +++ b/crates/delta/src/routes/webhooks/webhook_edit.rs @@ -8,10 +8,16 @@ use revolt_result::{create_error, Result}; use rocket::{serde::json::Json, State}; use validator::Validate; -/// # Edits a webhook +/// Edits a webhook /// /// Edits a webhook -#[utoipa::path(tag = "Webhooks")] +#[utoipa::path( + tag = "Webhooks", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 200, body = Webhook), + ), +)] #[patch("/", data = "")] pub async fn webhook_edit( db: &State, diff --git a/crates/delta/src/routes/webhooks/webhook_edit_token.rs b/crates/delta/src/routes/webhooks/webhook_edit_token.rs index 212b20ba..3d7aebb3 100644 --- a/crates/delta/src/routes/webhooks/webhook_edit_token.rs +++ b/crates/delta/src/routes/webhooks/webhook_edit_token.rs @@ -5,10 +5,15 @@ use revolt_models::validator::Validate; use revolt_result::{create_error, Result}; use rocket::{serde::json::Json, State}; -/// # Edits a webhook +/// Edits a webhook /// /// Edits a webhook with a token -#[utoipa::path(tag = "Webhooks")] +#[utoipa::path( + tag = "Webhooks", + responses( + (status = 200, body = Webhook), + ), +)] #[patch("//", data = "")] pub async fn webhook_edit_token( db: &State, diff --git a/crates/delta/src/routes/webhooks/webhook_execute.rs b/crates/delta/src/routes/webhooks/webhook_execute.rs index 56295a70..bb08a5bd 100644 --- a/crates/delta/src/routes/webhooks/webhook_execute.rs +++ b/crates/delta/src/routes/webhooks/webhook_execute.rs @@ -10,10 +10,16 @@ use rocket::{serde::json::Json, State}; use validator::Validate; -/// # Executes a webhook +/// Executes a webhook /// /// Executes a webhook and sends a message -#[utoipa::path(tag = "Webhooks")] +#[utoipa::path( + tag = "Webhooks", + params(IdempotencyKey), + responses( + (status = 200, body = v0::Message) + ) +)] #[post("//", data = "")] pub async fn webhook_execute( db: &State, diff --git a/crates/delta/src/routes/webhooks/webhook_execute_github.rs b/crates/delta/src/routes/webhooks/webhook_execute_github.rs index 187a5b7f..95cdc119 100644 --- a/crates/delta/src/routes/webhooks/webhook_execute_github.rs +++ b/crates/delta/src/routes/webhooks/webhook_execute_github.rs @@ -708,10 +708,13 @@ fn convert_event(data: &str, event_name: &str) -> Result { }) } -/// # Executes a webhook specific to github +/// Executes a webhook specific to github /// /// Executes a webhook specific to github and sends a message containing the relevant info about the event -#[utoipa::path(tag = "Webhooks", params(EventHeader))] +#[utoipa::path( + tag = "Webhooks", + params(EventHeader) +)] #[post("///github", data = "")] pub async fn webhook_execute_github( db: &State, diff --git a/crates/delta/src/routes/webhooks/webhook_fetch.rs b/crates/delta/src/routes/webhooks/webhook_fetch.rs index 870adc75..474117be 100644 --- a/crates/delta/src/routes/webhooks/webhook_fetch.rs +++ b/crates/delta/src/routes/webhooks/webhook_fetch.rs @@ -7,10 +7,16 @@ use revolt_permissions::{calculate_channel_permissions, ChannelPermission}; use revolt_result::Result; use rocket::{serde::json::Json, State}; -/// # Gets a webhook +/// Gets a webhook /// /// Gets a webhook -#[utoipa::path(tag = "Webhooks")] +#[utoipa::path( + tag = "Webhooks", + security(("Session-Token" = []), ("Bot-Token" = [])), + responses( + (status = 200, body = Webhook), + ), +)] #[get("/")] pub async fn webhook_fetch( db: &State, diff --git a/crates/delta/src/routes/webhooks/webhook_fetch_token.rs b/crates/delta/src/routes/webhooks/webhook_fetch_token.rs index f1a9a92c..1e330f4a 100644 --- a/crates/delta/src/routes/webhooks/webhook_fetch_token.rs +++ b/crates/delta/src/routes/webhooks/webhook_fetch_token.rs @@ -3,10 +3,15 @@ use revolt_models::v0::Webhook; use revolt_result::Result; use rocket::{serde::json::Json, State}; -/// # Gets a webhook +/// Gets a webhook /// /// Gets a webhook with a token -#[utoipa::path(tag = "Webhooks")] +#[utoipa::path( + tag = "Webhooks", + responses( + (status = 200, body = Webhook), + ), +)] #[get("//")] pub async fn webhook_fetch_token( db: &State, diff --git a/crates/services/gifbox/src/routes/categories.rs b/crates/services/gifbox/src/routes/categories.rs index 145686f6..24c3746e 100644 --- a/crates/services/gifbox/src/routes/categories.rs +++ b/crates/services/gifbox/src/routes/categories.rs @@ -24,7 +24,7 @@ pub struct CategoriesQueryParams { security(("Session-Token" = []), ("Bot-Token" = [])), params(CategoriesQueryParams), responses( - (status = 200, description = "Categories results", body = inline(Vec)), + (status = 200, description = "Categories results", body = Vec), (status = "default", body = Error) ) )] diff --git a/crates/services/gifbox/src/routes/root.rs b/crates/services/gifbox/src/routes/root.rs index 4bf3aed5..541cc238 100644 --- a/crates/services/gifbox/src/routes/root.rs +++ b/crates/services/gifbox/src/routes/root.rs @@ -11,7 +11,7 @@ static CRATE_VERSION: &str = env!("CARGO_PKG_VERSION"); path = "/", tag = "Misc", responses( - (status = 200, description = "Root response", body = inline(types::RootResponse)) + (status = 200, description = "Root response", body = types::RootResponse) ) )] pub async fn root() -> Json> {