feat: move all json and validate to new utils
This commit is contained in:
@@ -26,3 +26,7 @@ disallowed-methods = [
|
|||||||
# Prefer to use Object::delete(&self)
|
# Prefer to use Object::delete(&self)
|
||||||
"revolt_database::models::bots::ops::AbstractBots::delete_bot",
|
"revolt_database::models::bots::ops::AbstractBots::delete_bot",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
disallowed-types = [
|
||||||
|
"rocket::serde::json::Json",
|
||||||
|
]
|
||||||
@@ -10,7 +10,6 @@ use revolt_models::v0::{
|
|||||||
use revolt_permissions::{calculate_channel_permissions, ChannelPermission, PermissionValue};
|
use revolt_permissions::{calculate_channel_permissions, ChannelPermission, PermissionValue};
|
||||||
use revolt_result::{ErrorType, Result};
|
use revolt_result::{ErrorType, Result};
|
||||||
use ulid::Ulid;
|
use ulid::Ulid;
|
||||||
use validator::Validate;
|
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
events::client::EventV1,
|
events::client::EventV1,
|
||||||
@@ -717,12 +716,6 @@ impl Message {
|
|||||||
|
|
||||||
/// Create text embed from sendable embed
|
/// Create text embed from sendable embed
|
||||||
pub async fn create_embed(&self, db: &Database, embed: SendableEmbed) -> Result<Embed> {
|
pub async fn create_embed(&self, db: &Database, embed: SendableEmbed) -> Result<Embed> {
|
||||||
embed.validate().map_err(|error| {
|
|
||||||
create_error!(FailedValidation {
|
|
||||||
error: error.to_string()
|
|
||||||
})
|
|
||||||
})?;
|
|
||||||
|
|
||||||
let media = if let Some(id) = embed.media {
|
let media = if let Some(id) = embed.media {
|
||||||
Some(File::use_attachment(db, &id, &self.id, &self.author).await?)
|
Some(File::use_attachment(db, &id, &self.id, &self.author).await?)
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ mod embeds;
|
|||||||
mod emojis;
|
mod emojis;
|
||||||
mod files;
|
mod files;
|
||||||
mod messages;
|
mod messages;
|
||||||
|
mod onboard;
|
||||||
mod policy_changes;
|
mod policy_changes;
|
||||||
mod safety_reports;
|
mod safety_reports;
|
||||||
mod server_bans;
|
mod server_bans;
|
||||||
@@ -24,6 +25,7 @@ pub use embeds::*;
|
|||||||
pub use emojis::*;
|
pub use emojis::*;
|
||||||
pub use files::*;
|
pub use files::*;
|
||||||
pub use messages::*;
|
pub use messages::*;
|
||||||
|
pub use onboard::*;
|
||||||
pub use policy_changes::*;
|
pub use policy_changes::*;
|
||||||
pub use safety_reports::*;
|
pub use safety_reports::*;
|
||||||
pub use server_bans::*;
|
pub use server_bans::*;
|
||||||
|
|||||||
15
crates/core/models/src/v0/onboard.rs
Normal file
15
crates/core/models/src/v0/onboard.rs
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
auto_derived!(
|
||||||
|
/// # New User Data
|
||||||
|
#[derive(validator::Validate)]
|
||||||
|
pub struct DataOnboard {
|
||||||
|
/// New username which will be used to identify the user on the platform
|
||||||
|
#[validate(length(min = 2, max = 32), regex = "super::RE_USERNAME")]
|
||||||
|
pub username: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// # Onboarding Status
|
||||||
|
pub struct DataHello {
|
||||||
|
/// Whether onboarding is required
|
||||||
|
pub onboarding: bool,
|
||||||
|
}
|
||||||
|
);
|
||||||
@@ -1,6 +1,17 @@
|
|||||||
use iso8601_timestamp::Timestamp;
|
use iso8601_timestamp::Timestamp;
|
||||||
|
|
||||||
auto_derived!(
|
auto_derived!(
|
||||||
|
/// # Report Data
|
||||||
|
#[derive(validator::Validate)]
|
||||||
|
pub struct DataReportContent {
|
||||||
|
/// Content being reported
|
||||||
|
pub content: ReportedContent,
|
||||||
|
/// Additional report description
|
||||||
|
#[validate(length(min = 0, max = 1000))]
|
||||||
|
#[serde(default)]
|
||||||
|
pub additional_context: String,
|
||||||
|
}
|
||||||
|
|
||||||
/// User-generated platform moderation report
|
/// User-generated platform moderation report
|
||||||
pub struct Report {
|
pub struct Report {
|
||||||
/// Unique Id
|
/// Unique Id
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
use super::{Channel, File, RE_COLOUR};
|
use super::{Channel, File, Member, User, RE_COLOUR};
|
||||||
|
|
||||||
use revolt_permissions::{Override, OverrideField};
|
use revolt_permissions::{Override, OverrideField};
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
@@ -293,4 +293,22 @@ auto_derived!(
|
|||||||
pub struct DataEditRoleRanks {
|
pub struct DataEditRoleRanks {
|
||||||
pub ranks: Vec<String>,
|
pub ranks: Vec<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// # Query Parameters
|
||||||
|
#[derive(FromForm)]
|
||||||
|
pub struct OptionsQueryMembers {
|
||||||
|
/// String to search for
|
||||||
|
pub query: String,
|
||||||
|
|
||||||
|
/// Discourage use of this API
|
||||||
|
pub experimental_api: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// # Query members by name
|
||||||
|
pub struct MemberQueryResponse {
|
||||||
|
/// List of members
|
||||||
|
pub members: Vec<Member>,
|
||||||
|
/// List of users
|
||||||
|
pub users: Vec<User>,
|
||||||
|
}
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -275,6 +275,17 @@ auto_derived!(
|
|||||||
/// Username and discriminator combo separated by #
|
/// Username and discriminator combo separated by #
|
||||||
pub username: String,
|
pub username: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// # Username Information
|
||||||
|
#[derive(Validate)]
|
||||||
|
pub struct DataChangeUsername {
|
||||||
|
/// New username
|
||||||
|
#[validate(length(min = 2, max = 32), regex = "super::RE_USERNAME")]
|
||||||
|
pub username: String,
|
||||||
|
/// Current account password
|
||||||
|
#[validate(length(min = 8, max = 1024))]
|
||||||
|
pub password: String,
|
||||||
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
pub trait CheckRelationship {
|
pub trait CheckRelationship {
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
|
use crate::util::json::{Json, Validate};
|
||||||
use revolt_database::{Bot, Database, User};
|
use revolt_database::{Bot, Database, User};
|
||||||
use revolt_models::v0;
|
use revolt_models::v0;
|
||||||
use revolt_result::{create_error, Result};
|
use revolt_result::Result;
|
||||||
use rocket::serde::json::Json;
|
|
||||||
use rocket::State;
|
use rocket::State;
|
||||||
use validator::Validate;
|
|
||||||
|
|
||||||
/// # Create Bot
|
/// # Create Bot
|
||||||
///
|
///
|
||||||
@@ -13,14 +12,9 @@ use validator::Validate;
|
|||||||
pub async fn create_bot(
|
pub async fn create_bot(
|
||||||
db: &State<Database>,
|
db: &State<Database>,
|
||||||
user: User,
|
user: User,
|
||||||
info: Json<v0::DataCreateBot>,
|
info: Validate<Json<v0::DataCreateBot>>,
|
||||||
) -> Result<Json<v0::BotWithUserResponse>> {
|
) -> Result<Json<v0::BotWithUserResponse>> {
|
||||||
let info = info.into_inner();
|
let info = info.into_inner().into_inner();
|
||||||
info.validate().map_err(|error| {
|
|
||||||
create_error!(FailedValidation {
|
|
||||||
error: error.to_string()
|
|
||||||
})
|
|
||||||
})?;
|
|
||||||
|
|
||||||
let (bot, user) = Bot::create(db, info.name, &user, None).await?;
|
let (bot, user) = Bot::create(db, info.name, &user, None).await?;
|
||||||
Ok(Json(v0::BotWithUserResponse {
|
Ok(Json(v0::BotWithUserResponse {
|
||||||
|
|||||||
@@ -3,8 +3,7 @@ use revolt_models::v0::{self, DataEditBot};
|
|||||||
use revolt_result::{create_error, Result};
|
use revolt_result::{create_error, Result};
|
||||||
use rocket::State;
|
use rocket::State;
|
||||||
|
|
||||||
use rocket::serde::json::Json;
|
use crate::util::json::{Json, Validate};
|
||||||
use validator::Validate;
|
|
||||||
|
|
||||||
/// # Edit Bot
|
/// # Edit Bot
|
||||||
///
|
///
|
||||||
@@ -15,14 +14,9 @@ pub async fn edit_bot(
|
|||||||
db: &State<Database>,
|
db: &State<Database>,
|
||||||
user: User,
|
user: User,
|
||||||
target: Reference<'_>,
|
target: Reference<'_>,
|
||||||
data: Json<DataEditBot>,
|
data: Validate<Json<DataEditBot>>,
|
||||||
) -> Result<Json<v0::BotWithUserResponse>> {
|
) -> Result<Json<v0::BotWithUserResponse>> {
|
||||||
let data = data.into_inner();
|
let data = data.into_inner().into_inner();
|
||||||
data.validate().map_err(|error| {
|
|
||||||
create_error!(FailedValidation {
|
|
||||||
error: error.to_string()
|
|
||||||
})
|
|
||||||
})?;
|
|
||||||
|
|
||||||
let mut bot = target.as_bot(db).await?;
|
let mut bot = target.as_bot(db).await?;
|
||||||
if bot.owner != user.id {
|
if bot.owner != user.id {
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
use revolt_database::{util::reference::Reference, Database, User};
|
use revolt_database::{util::reference::Reference, Database, User};
|
||||||
use revolt_models::v0::FetchBotResponse;
|
use revolt_models::v0::FetchBotResponse;
|
||||||
use revolt_result::{create_error, Result};
|
use revolt_result::{create_error, Result};
|
||||||
use rocket::{serde::json::Json, State};
|
use rocket::State;
|
||||||
|
use crate::util::json::Json;
|
||||||
|
|
||||||
/// # Fetch Bot
|
/// # Fetch Bot
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ use futures::future::join_all;
|
|||||||
use revolt_database::{Database, User};
|
use revolt_database::{Database, User};
|
||||||
use revolt_models::v0::OwnedBotsResponse;
|
use revolt_models::v0::OwnedBotsResponse;
|
||||||
use revolt_result::Result;
|
use revolt_result::Result;
|
||||||
use rocket::serde::json::Json;
|
use crate::util::json::Json;
|
||||||
use rocket::State;
|
use rocket::State;
|
||||||
|
|
||||||
/// # Fetch Owned Bots
|
/// # Fetch Owned Bots
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ use revolt_database::{util::reference::Reference, Database, User};
|
|||||||
use revolt_models::v0::PublicBot;
|
use revolt_models::v0::PublicBot;
|
||||||
use revolt_result::{create_error, Result};
|
use revolt_result::{create_error, Result};
|
||||||
|
|
||||||
use rocket::serde::json::Json;
|
use crate::util::json::Json;
|
||||||
use rocket::State;
|
use rocket::State;
|
||||||
|
|
||||||
/// # Fetch Public Bot
|
/// # Fetch Public Bot
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ use revolt_permissions::{
|
|||||||
use revolt_result::{create_error, Result};
|
use revolt_result::{create_error, Result};
|
||||||
use rocket::State;
|
use rocket::State;
|
||||||
|
|
||||||
use rocket::serde::json::Json;
|
use crate::util::json::Json;
|
||||||
use rocket_empty::EmptyResponse;
|
use rocket_empty::EmptyResponse;
|
||||||
|
|
||||||
/// # Invite Bot
|
/// # Invite Bot
|
||||||
|
|||||||
@@ -5,8 +5,8 @@ use revolt_database::{
|
|||||||
use revolt_models::v0;
|
use revolt_models::v0;
|
||||||
use revolt_permissions::{calculate_channel_permissions, ChannelPermission};
|
use revolt_permissions::{calculate_channel_permissions, ChannelPermission};
|
||||||
use revolt_result::{create_error, Result};
|
use revolt_result::{create_error, Result};
|
||||||
use rocket::{serde::json::Json, State};
|
use rocket::State;
|
||||||
use validator::Validate;
|
use crate::util::json::{Json, Validate};
|
||||||
|
|
||||||
/// # Edit Channel
|
/// # Edit Channel
|
||||||
///
|
///
|
||||||
@@ -18,14 +18,9 @@ pub async fn edit(
|
|||||||
amqp: &State<AMQP>,
|
amqp: &State<AMQP>,
|
||||||
user: User,
|
user: User,
|
||||||
target: Reference<'_>,
|
target: Reference<'_>,
|
||||||
data: Json<v0::DataEditChannel>,
|
data: Validate<Json<v0::DataEditChannel>>,
|
||||||
) -> Result<Json<v0::Channel>> {
|
) -> Result<Json<v0::Channel>> {
|
||||||
let data = data.into_inner();
|
let data = data.into_inner().into_inner();
|
||||||
data.validate().map_err(|error| {
|
|
||||||
create_error!(FailedValidation {
|
|
||||||
error: error.to_string()
|
|
||||||
})
|
|
||||||
})?;
|
|
||||||
|
|
||||||
let mut channel = target.as_channel(db).await?;
|
let mut channel = target.as_channel(db).await?;
|
||||||
let mut query = DatabasePermissionQuery::new(db, &user).channel(&channel);
|
let mut query = DatabasePermissionQuery::new(db, &user).channel(&channel);
|
||||||
|
|||||||
@@ -6,7 +6,8 @@ use revolt_database::{
|
|||||||
use revolt_models::v0;
|
use revolt_models::v0;
|
||||||
use revolt_permissions::{calculate_channel_permissions, ChannelPermission};
|
use revolt_permissions::{calculate_channel_permissions, ChannelPermission};
|
||||||
use revolt_result::Result;
|
use revolt_result::Result;
|
||||||
use rocket::{serde::json::Json, State};
|
use rocket::State;
|
||||||
|
use crate::util::json::Json;
|
||||||
|
|
||||||
/// # Fetch Channel
|
/// # Fetch Channel
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -2,9 +2,8 @@ use revolt_database::{Channel, Database, RelationshipStatus, User};
|
|||||||
use revolt_models::v0;
|
use revolt_models::v0;
|
||||||
use revolt_result::{create_error, Result};
|
use revolt_result::{create_error, Result};
|
||||||
|
|
||||||
use rocket::serde::json::Json;
|
use crate::util::json::{Json, Validate};
|
||||||
use rocket::State;
|
use rocket::State;
|
||||||
use validator::Validate;
|
|
||||||
|
|
||||||
/// # Create Group
|
/// # Create Group
|
||||||
///
|
///
|
||||||
@@ -14,18 +13,13 @@ use validator::Validate;
|
|||||||
pub async fn create_group(
|
pub async fn create_group(
|
||||||
db: &State<Database>,
|
db: &State<Database>,
|
||||||
user: User,
|
user: User,
|
||||||
data: Json<v0::DataCreateGroup>,
|
data: Validate<Json<v0::DataCreateGroup>>,
|
||||||
) -> Result<Json<v0::Channel>> {
|
) -> Result<Json<v0::Channel>> {
|
||||||
if user.bot.is_some() {
|
if user.bot.is_some() {
|
||||||
return Err(create_error!(IsBot));
|
return Err(create_error!(IsBot));
|
||||||
}
|
}
|
||||||
|
|
||||||
let data = data.into_inner();
|
let data = data.into_inner().into_inner();
|
||||||
data.validate().map_err(|error| {
|
|
||||||
create_error!(FailedValidation {
|
|
||||||
error: error.to_string()
|
|
||||||
})
|
|
||||||
})?;
|
|
||||||
|
|
||||||
for target in &data.users {
|
for target in &data.users {
|
||||||
match user.relationship_with(target) {
|
match user.relationship_with(target) {
|
||||||
|
|||||||
@@ -6,7 +6,8 @@ use revolt_models::v0;
|
|||||||
use revolt_permissions::{calculate_channel_permissions, ChannelPermission};
|
use revolt_permissions::{calculate_channel_permissions, ChannelPermission};
|
||||||
|
|
||||||
use revolt_result::{create_error, Result};
|
use revolt_result::{create_error, Result};
|
||||||
use rocket::{serde::json::Json, State};
|
use rocket::State;
|
||||||
|
use crate::util::json::Json;
|
||||||
|
|
||||||
/// # Create Invite
|
/// # Create Invite
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -5,7 +5,8 @@ use revolt_database::{
|
|||||||
use revolt_models::v0;
|
use revolt_models::v0;
|
||||||
use revolt_permissions::{calculate_channel_permissions, ChannelPermission};
|
use revolt_permissions::{calculate_channel_permissions, ChannelPermission};
|
||||||
use revolt_result::{create_error, Result};
|
use revolt_result::{create_error, Result};
|
||||||
use rocket::{serde::json::Json, State};
|
use rocket::State;
|
||||||
|
use crate::util::json::Json;
|
||||||
|
|
||||||
/// # Fetch Group Members
|
/// # Fetch Group Members
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -6,9 +6,9 @@ use revolt_database::{
|
|||||||
use revolt_models::v0;
|
use revolt_models::v0;
|
||||||
use revolt_permissions::{calculate_channel_permissions, ChannelPermission};
|
use revolt_permissions::{calculate_channel_permissions, ChannelPermission};
|
||||||
use revolt_result::{create_error, Result};
|
use revolt_result::{create_error, Result};
|
||||||
use rocket::{serde::json::Json, State};
|
use rocket::State;
|
||||||
use rocket_empty::EmptyResponse;
|
use rocket_empty::EmptyResponse;
|
||||||
use validator::Validate;
|
use crate::util::json::{Json, Validate};
|
||||||
|
|
||||||
/// # Bulk Delete Messages
|
/// # Bulk Delete Messages
|
||||||
///
|
///
|
||||||
@@ -23,14 +23,9 @@ pub async fn bulk_delete_messages(
|
|||||||
db: &State<Database>,
|
db: &State<Database>,
|
||||||
user: User,
|
user: User,
|
||||||
target: Reference<'_>,
|
target: Reference<'_>,
|
||||||
options: Json<v0::OptionsBulkDelete>,
|
options: Validate<Json<v0::OptionsBulkDelete>>,
|
||||||
) -> Result<EmptyResponse> {
|
) -> Result<EmptyResponse> {
|
||||||
let options = options.into_inner();
|
let options = options.into_inner().into_inner();
|
||||||
options.validate().map_err(|error| {
|
|
||||||
create_error!(FailedValidation {
|
|
||||||
error: error.to_string()
|
|
||||||
})
|
|
||||||
})?;
|
|
||||||
|
|
||||||
for id in &options.ids {
|
for id in &options.ids {
|
||||||
if ulid::Ulid::from_string(id)
|
if ulid::Ulid::from_string(id)
|
||||||
|
|||||||
@@ -7,8 +7,8 @@ use revolt_database::{
|
|||||||
use revolt_models::v0::{self, Embed};
|
use revolt_models::v0::{self, Embed};
|
||||||
use revolt_permissions::{calculate_channel_permissions, ChannelPermission};
|
use revolt_permissions::{calculate_channel_permissions, ChannelPermission};
|
||||||
use revolt_result::{create_error, Result};
|
use revolt_result::{create_error, Result};
|
||||||
use rocket::{serde::json::Json, State};
|
use rocket::State;
|
||||||
use validator::Validate;
|
use crate::util::json::{Json, Validate};
|
||||||
|
|
||||||
/// # Edit Message
|
/// # Edit Message
|
||||||
///
|
///
|
||||||
@@ -20,14 +20,9 @@ pub async fn edit(
|
|||||||
user: User,
|
user: User,
|
||||||
target: Reference<'_>,
|
target: Reference<'_>,
|
||||||
msg: Reference<'_>,
|
msg: Reference<'_>,
|
||||||
edit: Json<v0::DataEditMessage>,
|
edit: Validate<Json<v0::DataEditMessage>>,
|
||||||
) -> Result<Json<v0::Message>> {
|
) -> Result<Json<v0::Message>> {
|
||||||
let edit = edit.into_inner();
|
let edit = edit.into_inner().into_inner();
|
||||||
edit.validate().map_err(|error| {
|
|
||||||
create_error!(FailedValidation {
|
|
||||||
error: error.to_string()
|
|
||||||
})
|
|
||||||
})?;
|
|
||||||
|
|
||||||
Message::validate_sum(
|
Message::validate_sum(
|
||||||
&edit.content,
|
&edit.content,
|
||||||
|
|||||||
@@ -5,7 +5,8 @@ use revolt_database::{
|
|||||||
use revolt_models::v0;
|
use revolt_models::v0;
|
||||||
use revolt_permissions::{calculate_channel_permissions, ChannelPermission};
|
use revolt_permissions::{calculate_channel_permissions, ChannelPermission};
|
||||||
use revolt_result::{create_error, Result};
|
use revolt_result::{create_error, Result};
|
||||||
use rocket::{serde::json::Json, State};
|
use rocket::State;
|
||||||
|
use crate::util::json::Json;
|
||||||
|
|
||||||
/// # Fetch Message
|
/// # Fetch Message
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -5,8 +5,8 @@ use revolt_database::{
|
|||||||
use revolt_models::v0::{self, MessageSort};
|
use revolt_models::v0::{self, MessageSort};
|
||||||
use revolt_permissions::{calculate_channel_permissions, ChannelPermission};
|
use revolt_permissions::{calculate_channel_permissions, ChannelPermission};
|
||||||
use revolt_result::{create_error, Result};
|
use revolt_result::{create_error, Result};
|
||||||
use rocket::{serde::json::Json, State};
|
use rocket::State;
|
||||||
use validator::Validate;
|
use crate::util::json::{Json, Validate};
|
||||||
|
|
||||||
/// # Fetch Messages
|
/// # Fetch Messages
|
||||||
///
|
///
|
||||||
@@ -17,14 +17,8 @@ pub async fn query(
|
|||||||
db: &State<Database>,
|
db: &State<Database>,
|
||||||
user: User,
|
user: User,
|
||||||
target: Reference<'_>,
|
target: Reference<'_>,
|
||||||
options: v0::OptionsQueryMessages,
|
options: Validate<v0::OptionsQueryMessages>,
|
||||||
) -> Result<Json<v0::BulkMessageResponse>> {
|
) -> Result<Json<v0::BulkMessageResponse>> {
|
||||||
options.validate().map_err(|error| {
|
|
||||||
create_error!(FailedValidation {
|
|
||||||
error: error.to_string()
|
|
||||||
})
|
|
||||||
})?;
|
|
||||||
|
|
||||||
if let Some(MessageSort::Relevance) = options.sort {
|
if let Some(MessageSort::Relevance) = options.sort {
|
||||||
return Err(create_error!(InvalidOperation));
|
return Err(create_error!(InvalidOperation));
|
||||||
}
|
}
|
||||||
@@ -43,7 +37,7 @@ pub async fn query(
|
|||||||
sort,
|
sort,
|
||||||
nearby,
|
nearby,
|
||||||
include_users,
|
include_users,
|
||||||
} = options;
|
} = options.into_inner();
|
||||||
|
|
||||||
Message::fetch_with_users(
|
Message::fetch_with_users(
|
||||||
db,
|
db,
|
||||||
|
|||||||
@@ -5,8 +5,8 @@ use revolt_database::{
|
|||||||
use revolt_models::v0;
|
use revolt_models::v0;
|
||||||
use revolt_permissions::{calculate_channel_permissions, ChannelPermission};
|
use revolt_permissions::{calculate_channel_permissions, ChannelPermission};
|
||||||
use revolt_result::{create_error, Result};
|
use revolt_result::{create_error, Result};
|
||||||
use rocket::{serde::json::Json, State};
|
use rocket::State;
|
||||||
use validator::Validate;
|
use crate::util::json::{Json, Validate};
|
||||||
|
|
||||||
/// # Search for Messages
|
/// # Search for Messages
|
||||||
///
|
///
|
||||||
@@ -17,18 +17,13 @@ pub async fn search(
|
|||||||
db: &State<Database>,
|
db: &State<Database>,
|
||||||
user: User,
|
user: User,
|
||||||
target: Reference<'_>,
|
target: Reference<'_>,
|
||||||
options: Json<v0::DataMessageSearch>,
|
options: Validate<Json<v0::DataMessageSearch>>,
|
||||||
) -> Result<Json<v0::BulkMessageResponse>> {
|
) -> Result<Json<v0::BulkMessageResponse>> {
|
||||||
if user.bot.is_some() {
|
if user.bot.is_some() {
|
||||||
return Err(create_error!(IsBot));
|
return Err(create_error!(IsBot));
|
||||||
}
|
}
|
||||||
|
|
||||||
let options = options.into_inner();
|
let options = options.into_inner().into_inner();
|
||||||
options.validate().map_err(|error| {
|
|
||||||
create_error!(FailedValidation {
|
|
||||||
error: error.to_string()
|
|
||||||
})
|
|
||||||
})?;
|
|
||||||
|
|
||||||
if options.query.is_some() && options.pinned.is_some() {
|
if options.query.is_some() && options.pinned.is_some() {
|
||||||
return Err(create_error!(InvalidOperation))
|
return Err(create_error!(InvalidOperation))
|
||||||
|
|||||||
@@ -7,10 +7,9 @@ use revolt_database::{Interactions, Message, AMQP};
|
|||||||
use revolt_models::v0;
|
use revolt_models::v0;
|
||||||
use revolt_permissions::PermissionQuery;
|
use revolt_permissions::PermissionQuery;
|
||||||
use revolt_permissions::{calculate_channel_permissions, ChannelPermission};
|
use revolt_permissions::{calculate_channel_permissions, ChannelPermission};
|
||||||
use revolt_result::{create_error, Result};
|
use revolt_result::Result;
|
||||||
use crate::util::json::{Json, Validate};
|
use crate::util::json::{Json, Validate};
|
||||||
use rocket::State;
|
use rocket::State;
|
||||||
// use validator::Validate;
|
|
||||||
|
|
||||||
/// # Send Message
|
/// # Send Message
|
||||||
///
|
///
|
||||||
@@ -25,7 +24,7 @@ pub async fn message_send(
|
|||||||
data: Validate<Json<v0::DataMessageSend>>,
|
data: Validate<Json<v0::DataMessageSend>>,
|
||||||
idempotency: IdempotencyKey,
|
idempotency: IdempotencyKey,
|
||||||
) -> Result<Json<v0::Message>> {
|
) -> Result<Json<v0::Message>> {
|
||||||
let data = data.into_inner();
|
let data = data.into_inner().into_inner();
|
||||||
|
|
||||||
// Ensure we have permissions to send a message
|
// Ensure we have permissions to send a message
|
||||||
let channel = target.as_channel(db).await?;
|
let channel = target.as_channel(db).await?;
|
||||||
|
|||||||
@@ -5,7 +5,8 @@ use revolt_database::{
|
|||||||
use revolt_models::v0;
|
use revolt_models::v0;
|
||||||
use revolt_permissions::{calculate_channel_permissions, ChannelPermission, Override};
|
use revolt_permissions::{calculate_channel_permissions, ChannelPermission, Override};
|
||||||
use revolt_result::{create_error, Result};
|
use revolt_result::{create_error, Result};
|
||||||
use rocket::{serde::json::Json, State};
|
use rocket::State;
|
||||||
|
use crate::util::json::Json;
|
||||||
|
|
||||||
/// # Set Role Permission
|
/// # Set Role Permission
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -5,7 +5,8 @@ use revolt_database::{
|
|||||||
use revolt_models::v0::{self, DataDefaultChannelPermissions};
|
use revolt_models::v0::{self, DataDefaultChannelPermissions};
|
||||||
use revolt_permissions::{calculate_channel_permissions, ChannelPermission};
|
use revolt_permissions::{calculate_channel_permissions, ChannelPermission};
|
||||||
use revolt_result::{create_error, Result};
|
use revolt_result::{create_error, Result};
|
||||||
use rocket::{serde::json::Json, State};
|
use rocket::State;
|
||||||
|
use crate::util::json::Json;
|
||||||
|
|
||||||
/// # Set Default Permission
|
/// # Set Default Permission
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -6,7 +6,8 @@ use revolt_database::{
|
|||||||
use revolt_models::v0;
|
use revolt_models::v0;
|
||||||
use revolt_permissions::{calculate_channel_permissions, ChannelPermission};
|
use revolt_permissions::{calculate_channel_permissions, ChannelPermission};
|
||||||
use revolt_result::{create_error, Result};
|
use revolt_result::{create_error, Result};
|
||||||
use rocket::{serde::json::Json, State};
|
use rocket::State;
|
||||||
|
use crate::util::json::Json;
|
||||||
|
|
||||||
/// # Join Call
|
/// # Join Call
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -7,9 +7,9 @@ use revolt_permissions::{
|
|||||||
calculate_channel_permissions, ChannelPermission, DEFAULT_WEBHOOK_PERMISSIONS,
|
calculate_channel_permissions, ChannelPermission, DEFAULT_WEBHOOK_PERMISSIONS,
|
||||||
};
|
};
|
||||||
use revolt_result::{create_error, Result};
|
use revolt_result::{create_error, Result};
|
||||||
use rocket::{serde::json::Json, State};
|
use rocket::State;
|
||||||
|
use crate::util::json::{Json, Validate};
|
||||||
use ulid::Ulid;
|
use ulid::Ulid;
|
||||||
use validator::Validate;
|
|
||||||
|
|
||||||
/// # Creates a webhook
|
/// # Creates a webhook
|
||||||
///
|
///
|
||||||
@@ -20,14 +20,9 @@ pub async fn create_webhook(
|
|||||||
db: &State<Database>,
|
db: &State<Database>,
|
||||||
user: User,
|
user: User,
|
||||||
target: Reference<'_>,
|
target: Reference<'_>,
|
||||||
data: Json<v0::CreateWebhookBody>,
|
data: Validate<Json<v0::CreateWebhookBody>>,
|
||||||
) -> Result<Json<v0::Webhook>> {
|
) -> Result<Json<v0::Webhook>> {
|
||||||
let data = data.into_inner();
|
let data = data.into_inner().into_inner();
|
||||||
data.validate().map_err(|error| {
|
|
||||||
create_error!(FailedValidation {
|
|
||||||
error: error.to_string()
|
|
||||||
})
|
|
||||||
})?;
|
|
||||||
|
|
||||||
let channel = target.as_channel(db).await?;
|
let channel = target.as_channel(db).await?;
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,8 @@ use revolt_database::{
|
|||||||
use revolt_models::v0::Webhook;
|
use revolt_models::v0::Webhook;
|
||||||
use revolt_permissions::{calculate_channel_permissions, ChannelPermission};
|
use revolt_permissions::{calculate_channel_permissions, ChannelPermission};
|
||||||
use revolt_result::Result;
|
use revolt_result::Result;
|
||||||
use rocket::{serde::json::Json, State};
|
use rocket::State;
|
||||||
|
use crate::util::json::Json;
|
||||||
|
|
||||||
/// # Gets all webhooks
|
/// # Gets all webhooks
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -3,9 +3,8 @@ use revolt_database::{util::permissions::DatabasePermissionQuery, Database, Emoj
|
|||||||
use revolt_models::v0;
|
use revolt_models::v0;
|
||||||
use revolt_permissions::{calculate_server_permissions, ChannelPermission};
|
use revolt_permissions::{calculate_server_permissions, ChannelPermission};
|
||||||
use revolt_result::{create_error, Result};
|
use revolt_result::{create_error, Result};
|
||||||
use validator::Validate;
|
use rocket::State;
|
||||||
|
use crate::util::json::{Json, Validate};
|
||||||
use rocket::{serde::json::Json, State};
|
|
||||||
|
|
||||||
/// # Create New Emoji
|
/// # Create New Emoji
|
||||||
///
|
///
|
||||||
@@ -16,16 +15,11 @@ pub async fn create_emoji(
|
|||||||
db: &State<Database>,
|
db: &State<Database>,
|
||||||
user: User,
|
user: User,
|
||||||
id: String,
|
id: String,
|
||||||
data: Json<v0::DataCreateEmoji>,
|
data: Validate<Json<v0::DataCreateEmoji>>,
|
||||||
) -> Result<Json<v0::Emoji>> {
|
) -> Result<Json<v0::Emoji>> {
|
||||||
let config = config().await;
|
let config = config().await;
|
||||||
|
|
||||||
let data = data.into_inner();
|
let data = data.into_inner().into_inner();
|
||||||
data.validate().map_err(|error| {
|
|
||||||
create_error!(FailedValidation {
|
|
||||||
error: error.to_string()
|
|
||||||
})
|
|
||||||
})?;
|
|
||||||
|
|
||||||
// Validate we have permission to write into parent
|
// Validate we have permission to write into parent
|
||||||
match &data.parent {
|
match &data.parent {
|
||||||
|
|||||||
@@ -2,7 +2,8 @@ use revolt_database::{util::reference::Reference, Database};
|
|||||||
use revolt_models::v0;
|
use revolt_models::v0;
|
||||||
use revolt_result::Result;
|
use revolt_result::Result;
|
||||||
|
|
||||||
use rocket::{serde::json::Json, State};
|
use rocket::State;
|
||||||
|
use crate::util::json::Json;
|
||||||
|
|
||||||
/// # Fetch Emoji
|
/// # Fetch Emoji
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
use revolt_database::{util::reference::Reference, Channel, Database, Invite};
|
use revolt_database::{util::reference::Reference, Channel, Database, Invite};
|
||||||
use revolt_models::v0;
|
use revolt_models::v0;
|
||||||
use revolt_result::Result;
|
use revolt_result::Result;
|
||||||
use rocket::{serde::json::Json, State};
|
use rocket::State;
|
||||||
|
use crate::util::json::Json;
|
||||||
|
|
||||||
/// # Fetch Invite
|
/// # Fetch Invite
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
use revolt_database::{util::reference::Reference, Channel, Database, Invite, Member, User, AMQP};
|
use revolt_database::{util::reference::Reference, Channel, Database, Invite, Member, User, AMQP};
|
||||||
use revolt_models::v0::{self, InviteJoinResponse};
|
use revolt_models::v0::{self, InviteJoinResponse};
|
||||||
use revolt_result::{create_error, Result};
|
use revolt_result::{create_error, Result};
|
||||||
use rocket::{serde::json::Json, State};
|
use rocket::State;
|
||||||
|
use crate::util::json::Json;
|
||||||
|
|
||||||
/// # Join Invite
|
/// # Join Invite
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -1,27 +1,11 @@
|
|||||||
use authifier::models::Session;
|
use authifier::models::Session;
|
||||||
use once_cell::sync::Lazy;
|
|
||||||
use regex::Regex;
|
|
||||||
use revolt_database::{Database, User};
|
use revolt_database::{Database, User};
|
||||||
use revolt_models::v0;
|
use revolt_models::v0;
|
||||||
use revolt_result::{create_error, Result};
|
use revolt_result::{create_error, Result};
|
||||||
|
|
||||||
use rocket::{serde::json::Json, State};
|
use rocket::State;
|
||||||
use serde::{Deserialize, Serialize};
|
use crate::util::json::{Json, Validate};
|
||||||
use validator::Validate;
|
|
||||||
|
|
||||||
/// Regex for valid usernames
|
|
||||||
///
|
|
||||||
/// Block zero width space
|
|
||||||
/// Block lookalike characters
|
|
||||||
pub static RE_USERNAME: Lazy<Regex> = Lazy::new(|| Regex::new(r"^(\p{L}|[\d_.-])+$").unwrap());
|
|
||||||
|
|
||||||
/// # New User Data
|
|
||||||
#[derive(Validate, Serialize, Deserialize, JsonSchema)]
|
|
||||||
pub struct DataOnboard {
|
|
||||||
/// New username which will be used to identify the user on the platform
|
|
||||||
#[validate(length(min = 2, max = 32), regex = "RE_USERNAME")]
|
|
||||||
username: String,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// # Complete Onboarding
|
/// # Complete Onboarding
|
||||||
///
|
///
|
||||||
@@ -32,18 +16,13 @@ pub async fn complete(
|
|||||||
db: &State<Database>,
|
db: &State<Database>,
|
||||||
session: Session,
|
session: Session,
|
||||||
user: Option<User>,
|
user: Option<User>,
|
||||||
data: Json<DataOnboard>,
|
data: Validate<Json<v0::DataOnboard>>,
|
||||||
) -> Result<Json<v0::User>> {
|
) -> Result<Json<v0::User>> {
|
||||||
if user.is_some() {
|
if user.is_some() {
|
||||||
return Err(create_error!(AlreadyOnboarded));
|
return Err(create_error!(AlreadyOnboarded));
|
||||||
}
|
}
|
||||||
|
|
||||||
let data = data.into_inner();
|
let data = data.into_inner().into_inner();
|
||||||
data.validate().map_err(|error| {
|
|
||||||
create_error!(FailedValidation {
|
|
||||||
error: error.to_string()
|
|
||||||
})
|
|
||||||
})?;
|
|
||||||
|
|
||||||
Ok(Json(
|
Ok(Json(
|
||||||
User::create(db, data.username, session.user_id, None)
|
User::create(db, data.username, session.user_id, None)
|
||||||
|
|||||||
@@ -1,23 +1,16 @@
|
|||||||
use authifier::models::Session;
|
use authifier::models::Session;
|
||||||
use revolt_database::User;
|
use revolt_database::User;
|
||||||
|
use revolt_models::v0;
|
||||||
|
|
||||||
use rocket::serde::json::Json;
|
use crate::util::json::Json;
|
||||||
use serde::Serialize;
|
|
||||||
|
|
||||||
/// # Onboarding Status
|
|
||||||
#[derive(Serialize, JsonSchema)]
|
|
||||||
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.
|
/// 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.
|
||||||
#[openapi(tag = "Onboarding")]
|
#[openapi(tag = "Onboarding")]
|
||||||
#[get("/hello")]
|
#[get("/hello")]
|
||||||
pub async fn hello(_session: Session, user: Option<User>) -> Json<DataHello> {
|
pub async fn hello(_session: Session, user: Option<User>) -> Json<v0::DataHello> {
|
||||||
Json(DataHello {
|
Json(v0::DataHello {
|
||||||
onboarding: user.is_none(),
|
onboarding: user.is_none(),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,8 @@ use authifier::{
|
|||||||
Authifier,
|
Authifier,
|
||||||
};
|
};
|
||||||
use revolt_result::{create_database_error, Result};
|
use revolt_result::{create_database_error, Result};
|
||||||
use rocket::{serde::json::Json, State};
|
use rocket::State;
|
||||||
|
use crate::util::json::Json;
|
||||||
use rocket_empty::EmptyResponse;
|
use rocket_empty::EmptyResponse;
|
||||||
|
|
||||||
/// # Push Subscribe
|
/// # Push Subscribe
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
|
use crate::util::json::Json;
|
||||||
use revolt_config::config;
|
use revolt_config::config;
|
||||||
use revolt_result::Result;
|
use revolt_result::Result;
|
||||||
use rocket::serde::json::Json;
|
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
|
|
||||||
/// # hCaptcha Configuration
|
/// # hCaptcha Configuration
|
||||||
|
|||||||
@@ -1,22 +1,9 @@
|
|||||||
use revolt_database::{events::client::EventV1, Database, Report, Snapshot, SnapshotContent, User};
|
use revolt_database::{events::client::EventV1, Database, Report, Snapshot, SnapshotContent, User};
|
||||||
use revolt_models::v0::{ReportStatus, ReportedContent};
|
use revolt_models::v0::{DataReportContent, ReportStatus, ReportedContent};
|
||||||
use revolt_result::{create_error, Result};
|
use revolt_result::{create_error, Result};
|
||||||
use serde::Deserialize;
|
|
||||||
use ulid::Ulid;
|
use ulid::Ulid;
|
||||||
use validator::Validate;
|
use rocket::State;
|
||||||
|
use crate::util::json::{Json, Validate};
|
||||||
use rocket::{serde::json::Json, State};
|
|
||||||
|
|
||||||
/// # Report Data
|
|
||||||
#[derive(Validate, Deserialize, JsonSchema)]
|
|
||||||
pub struct DataReportContent {
|
|
||||||
/// Content being reported
|
|
||||||
content: ReportedContent,
|
|
||||||
/// Additional report description
|
|
||||||
#[validate(length(min = 0, max = 1000))]
|
|
||||||
#[serde(default)]
|
|
||||||
additional_context: String,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// # Report Content
|
/// # Report Content
|
||||||
///
|
///
|
||||||
@@ -26,14 +13,9 @@ pub struct DataReportContent {
|
|||||||
pub async fn report_content(
|
pub async fn report_content(
|
||||||
db: &State<Database>,
|
db: &State<Database>,
|
||||||
user: User,
|
user: User,
|
||||||
data: Json<DataReportContent>,
|
data: Validate<Json<DataReportContent>>,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
let data = data.into_inner();
|
let data = data.into_inner().into_inner();
|
||||||
data.validate().map_err(|error| {
|
|
||||||
create_error!(FailedValidation {
|
|
||||||
error: error.to_string()
|
|
||||||
})
|
|
||||||
})?;
|
|
||||||
|
|
||||||
// Bots cannot create reports
|
// Bots cannot create reports
|
||||||
if user.bot.is_some() {
|
if user.bot.is_some() {
|
||||||
|
|||||||
@@ -6,8 +6,8 @@ use revolt_models::v0;
|
|||||||
|
|
||||||
use revolt_permissions::{calculate_server_permissions, ChannelPermission};
|
use revolt_permissions::{calculate_server_permissions, ChannelPermission};
|
||||||
use revolt_result::{create_error, Result};
|
use revolt_result::{create_error, Result};
|
||||||
use rocket::{serde::json::Json, State};
|
use rocket::State;
|
||||||
use validator::Validate;
|
use crate::util::json::{Json, Validate};
|
||||||
|
|
||||||
/// # Ban User
|
/// # Ban User
|
||||||
///
|
///
|
||||||
@@ -19,14 +19,9 @@ pub async fn ban(
|
|||||||
user: User,
|
user: User,
|
||||||
server: Reference<'_>,
|
server: Reference<'_>,
|
||||||
target: Reference<'_>,
|
target: Reference<'_>,
|
||||||
data: Json<v0::DataBanCreate>,
|
data: Validate<Json<v0::DataBanCreate>>,
|
||||||
) -> Result<Json<v0::ServerBan>> {
|
) -> Result<Json<v0::ServerBan>> {
|
||||||
let data = data.into_inner();
|
let data = data.into_inner().into_inner();
|
||||||
data.validate().map_err(|error| {
|
|
||||||
create_error!(FailedValidation {
|
|
||||||
error: error.to_string()
|
|
||||||
})
|
|
||||||
})?;
|
|
||||||
|
|
||||||
let server = server.as_server(db).await?;
|
let server = server.as_server(db).await?;
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ use revolt_models::v0;
|
|||||||
|
|
||||||
use revolt_permissions::{calculate_server_permissions, ChannelPermission};
|
use revolt_permissions::{calculate_server_permissions, ChannelPermission};
|
||||||
use revolt_result::Result;
|
use revolt_result::Result;
|
||||||
use rocket::serde::json::Json;
|
use crate::util::json::Json;
|
||||||
use rocket::State;
|
use rocket::State;
|
||||||
|
|
||||||
/// # Fetch Bans
|
/// # Fetch Bans
|
||||||
|
|||||||
@@ -2,11 +2,10 @@ use revolt_database::util::permissions::DatabasePermissionQuery;
|
|||||||
use revolt_database::{util::reference::Reference, Channel, Database, User};
|
use revolt_database::{util::reference::Reference, Channel, Database, User};
|
||||||
use revolt_models::v0;
|
use revolt_models::v0;
|
||||||
use revolt_permissions::{calculate_server_permissions, ChannelPermission};
|
use revolt_permissions::{calculate_server_permissions, ChannelPermission};
|
||||||
use revolt_result::{create_error, Result};
|
use revolt_result::Result;
|
||||||
|
|
||||||
use rocket::serde::json::Json;
|
use crate::util::json::{Json, Validate};
|
||||||
use rocket::State;
|
use rocket::State;
|
||||||
use validator::Validate;
|
|
||||||
|
|
||||||
/// # Create Channel
|
/// # Create Channel
|
||||||
///
|
///
|
||||||
@@ -17,14 +16,9 @@ pub async fn create_server_channel(
|
|||||||
db: &State<Database>,
|
db: &State<Database>,
|
||||||
user: User,
|
user: User,
|
||||||
server: Reference<'_>,
|
server: Reference<'_>,
|
||||||
data: Json<v0::DataCreateServerChannel>,
|
data: Validate<Json<v0::DataCreateServerChannel>>,
|
||||||
) -> Result<Json<v0::Channel>> {
|
) -> Result<Json<v0::Channel>> {
|
||||||
let data = data.into_inner();
|
let data = data.into_inner().into_inner();
|
||||||
data.validate().map_err(|error| {
|
|
||||||
create_error!(FailedValidation {
|
|
||||||
error: error.to_string()
|
|
||||||
})
|
|
||||||
})?;
|
|
||||||
|
|
||||||
let mut server = server.as_server(db).await?;
|
let mut server = server.as_server(db).await?;
|
||||||
let mut query = DatabasePermissionQuery::new(db, &user).server(&server);
|
let mut query = DatabasePermissionQuery::new(db, &user).server(&server);
|
||||||
|
|||||||
@@ -5,7 +5,8 @@ use revolt_database::{
|
|||||||
use revolt_models::v0;
|
use revolt_models::v0;
|
||||||
use revolt_permissions::PermissionQuery;
|
use revolt_permissions::PermissionQuery;
|
||||||
use revolt_result::{create_error, Result};
|
use revolt_result::{create_error, Result};
|
||||||
use rocket::{serde::json::Json, State};
|
use rocket::State;
|
||||||
|
use crate::util::json::Json;
|
||||||
|
|
||||||
/// # Fetch Server Emoji
|
/// # Fetch Server Emoji
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -5,7 +5,8 @@ use revolt_database::{
|
|||||||
use revolt_models::v0;
|
use revolt_models::v0;
|
||||||
use revolt_permissions::{calculate_server_permissions, ChannelPermission};
|
use revolt_permissions::{calculate_server_permissions, ChannelPermission};
|
||||||
use revolt_result::Result;
|
use revolt_result::Result;
|
||||||
use rocket::{serde::json::Json, State};
|
use rocket::State;
|
||||||
|
use crate::util::json::Json;
|
||||||
|
|
||||||
/// # Fetch Invites
|
/// # Fetch Invites
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ use revolt_models::v0;
|
|||||||
|
|
||||||
use revolt_permissions::{calculate_server_permissions, ChannelPermission};
|
use revolt_permissions::{calculate_server_permissions, ChannelPermission};
|
||||||
use revolt_result::{create_error, Result};
|
use revolt_result::{create_error, Result};
|
||||||
use rocket::{serde::json::Json, State};
|
use crate::util::json::{Json, Validate};
|
||||||
use validator::Validate;
|
use rocket::State;
|
||||||
|
|
||||||
/// # Edit Member
|
/// # Edit Member
|
||||||
///
|
///
|
||||||
@@ -21,14 +21,9 @@ pub async fn edit(
|
|||||||
user: User,
|
user: User,
|
||||||
server: Reference<'_>,
|
server: Reference<'_>,
|
||||||
member: Reference<'_>,
|
member: Reference<'_>,
|
||||||
data: Json<v0::DataMemberEdit>,
|
data: Validate<Json<v0::DataMemberEdit>>,
|
||||||
) -> Result<Json<v0::Member>> {
|
) -> Result<Json<v0::Member>> {
|
||||||
let data = data.into_inner();
|
let data = data.into_inner().into_inner();
|
||||||
data.validate().map_err(|error| {
|
|
||||||
create_error!(FailedValidation {
|
|
||||||
error: error.to_string()
|
|
||||||
})
|
|
||||||
})?;
|
|
||||||
|
|
||||||
// Fetch server and member
|
// Fetch server and member
|
||||||
let mut server = server.as_server(db).await?;
|
let mut server = server.as_server(db).await?;
|
||||||
|
|||||||
@@ -6,27 +6,8 @@ use revolt_database::{
|
|||||||
use revolt_models::v0;
|
use revolt_models::v0;
|
||||||
use revolt_permissions::PermissionQuery;
|
use revolt_permissions::PermissionQuery;
|
||||||
use revolt_result::{create_error, Result};
|
use revolt_result::{create_error, Result};
|
||||||
use rocket::{serde::json::Json, State};
|
use rocket::State;
|
||||||
use serde::{Deserialize, Serialize};
|
use crate::util::json::Json;
|
||||||
|
|
||||||
/// # Query Parameters
|
|
||||||
#[derive(Deserialize, JsonSchema, FromForm)]
|
|
||||||
pub struct OptionsQueryMembers {
|
|
||||||
/// String to search for
|
|
||||||
query: String,
|
|
||||||
|
|
||||||
/// Discourage use of this API
|
|
||||||
experimental_api: bool,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// # Query members by name
|
|
||||||
#[derive(Serialize, JsonSchema)]
|
|
||||||
pub struct MemberQueryResponse {
|
|
||||||
/// List of members
|
|
||||||
members: Vec<v0::Member>,
|
|
||||||
/// List of users
|
|
||||||
users: Vec<v0::User>,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// # Query members by name
|
/// # Query members by name
|
||||||
///
|
///
|
||||||
@@ -37,8 +18,8 @@ pub async fn member_experimental_query(
|
|||||||
db: &State<Database>,
|
db: &State<Database>,
|
||||||
user: User,
|
user: User,
|
||||||
target: Reference<'_>,
|
target: Reference<'_>,
|
||||||
options: OptionsQueryMembers,
|
options: v0::OptionsQueryMembers,
|
||||||
) -> Result<Json<MemberQueryResponse>> {
|
) -> Result<Json<v0::MemberQueryResponse>> {
|
||||||
if !options.experimental_api {
|
if !options.experimental_api {
|
||||||
return Err(create_error!(InternalError));
|
return Err(create_error!(InternalError));
|
||||||
}
|
}
|
||||||
@@ -84,7 +65,7 @@ pub async fn member_experimental_query(
|
|||||||
|
|
||||||
// Take the first ten and return them
|
// Take the first ten and return them
|
||||||
let (members, users): (Vec<Member>, Vec<User>) = zipped_vec.into_iter().take(10).unzip();
|
let (members, users): (Vec<Member>, Vec<User>) = zipped_vec.into_iter().take(10).unzip();
|
||||||
Ok(Json(MemberQueryResponse {
|
Ok(Json(v0::MemberQueryResponse {
|
||||||
members: members.into_iter().map(Into::into).collect(),
|
members: members.into_iter().map(Into::into).collect(),
|
||||||
users: join_all(
|
users: join_all(
|
||||||
users
|
users
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
use crate::util::json::Json;
|
||||||
use revolt_database::{
|
use revolt_database::{
|
||||||
util::{permissions::DatabasePermissionQuery, reference::Reference},
|
util::{permissions::DatabasePermissionQuery, reference::Reference},
|
||||||
Database, User,
|
Database, User,
|
||||||
@@ -5,7 +6,7 @@ use revolt_database::{
|
|||||||
use revolt_models::v0;
|
use revolt_models::v0;
|
||||||
use revolt_permissions::PermissionQuery;
|
use revolt_permissions::PermissionQuery;
|
||||||
use revolt_result::{create_error, Result};
|
use revolt_result::{create_error, Result};
|
||||||
use rocket::{serde::json::Json, State};
|
use rocket::State;
|
||||||
|
|
||||||
/// # Fetch Member
|
/// # Fetch Member
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -5,7 +5,8 @@ use revolt_database::{
|
|||||||
use revolt_models::v0;
|
use revolt_models::v0;
|
||||||
use revolt_permissions::PermissionQuery;
|
use revolt_permissions::PermissionQuery;
|
||||||
use revolt_result::{create_error, Result};
|
use revolt_result::{create_error, Result};
|
||||||
use rocket::{serde::json::Json, State};
|
use rocket::State;
|
||||||
|
use crate::util::json::Json;
|
||||||
|
|
||||||
/// # Fetch Members
|
/// # Fetch Members
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
use crate::util::json::Json;
|
||||||
use revolt_database::{
|
use revolt_database::{
|
||||||
util::{permissions::DatabasePermissionQuery, reference::Reference},
|
util::{permissions::DatabasePermissionQuery, reference::Reference},
|
||||||
Database, User,
|
Database, User,
|
||||||
@@ -5,7 +6,7 @@ use revolt_database::{
|
|||||||
use revolt_models::v0;
|
use revolt_models::v0;
|
||||||
use revolt_permissions::{calculate_server_permissions, ChannelPermission, Override};
|
use revolt_permissions::{calculate_server_permissions, ChannelPermission, Override};
|
||||||
use revolt_result::{create_error, Result};
|
use revolt_result::{create_error, Result};
|
||||||
use rocket::{serde::json::Json, State};
|
use rocket::State;
|
||||||
|
|
||||||
/// # Set Role Permission
|
/// # Set Role Permission
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -7,7 +7,8 @@ use revolt_permissions::{
|
|||||||
calculate_server_permissions, ChannelPermission, DataPermissionsValue, Override,
|
calculate_server_permissions, ChannelPermission, DataPermissionsValue, Override,
|
||||||
};
|
};
|
||||||
use revolt_result::Result;
|
use revolt_result::Result;
|
||||||
use rocket::{serde::json::Json, State};
|
use rocket::State;
|
||||||
|
use crate::util::json::Json;
|
||||||
|
|
||||||
/// # Set Default Permission
|
/// # Set Default Permission
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -6,8 +6,8 @@ use revolt_database::{
|
|||||||
use revolt_models::v0;
|
use revolt_models::v0;
|
||||||
use revolt_permissions::{calculate_server_permissions, ChannelPermission};
|
use revolt_permissions::{calculate_server_permissions, ChannelPermission};
|
||||||
use revolt_result::{create_error, Result};
|
use revolt_result::{create_error, Result};
|
||||||
use rocket::{serde::json::Json, State};
|
use crate::util::json::{Json, Validate};
|
||||||
use validator::Validate;
|
use rocket::State;
|
||||||
|
|
||||||
/// # Create Role
|
/// # Create Role
|
||||||
///
|
///
|
||||||
@@ -18,14 +18,9 @@ pub async fn create(
|
|||||||
db: &State<Database>,
|
db: &State<Database>,
|
||||||
user: User,
|
user: User,
|
||||||
target: Reference<'_>,
|
target: Reference<'_>,
|
||||||
data: Json<v0::DataCreateRole>,
|
data: Validate<Json<v0::DataCreateRole>>,
|
||||||
) -> Result<Json<v0::NewRoleResponse>> {
|
) -> Result<Json<v0::NewRoleResponse>> {
|
||||||
let data = data.into_inner();
|
let data = data.into_inner().into_inner();
|
||||||
data.validate().map_err(|error| {
|
|
||||||
create_error!(FailedValidation {
|
|
||||||
error: error.to_string()
|
|
||||||
})
|
|
||||||
})?;
|
|
||||||
|
|
||||||
let server = target.as_server(db).await?;
|
let server = target.as_server(db).await?;
|
||||||
let mut query = DatabasePermissionQuery::new(db, &user).server(&server);
|
let mut query = DatabasePermissionQuery::new(db, &user).server(&server);
|
||||||
|
|||||||
@@ -5,8 +5,8 @@ use revolt_database::{
|
|||||||
use revolt_models::v0;
|
use revolt_models::v0;
|
||||||
use revolt_permissions::{calculate_server_permissions, ChannelPermission};
|
use revolt_permissions::{calculate_server_permissions, ChannelPermission};
|
||||||
use revolt_result::{create_error, Result};
|
use revolt_result::{create_error, Result};
|
||||||
use rocket::{serde::json::Json, State};
|
use crate::util::json::{Json, Validate};
|
||||||
use validator::Validate;
|
use rocket::State;
|
||||||
|
|
||||||
/// # Edit Role
|
/// # Edit Role
|
||||||
///
|
///
|
||||||
@@ -18,14 +18,9 @@ pub async fn edit(
|
|||||||
user: User,
|
user: User,
|
||||||
target: Reference<'_>,
|
target: Reference<'_>,
|
||||||
role_id: String,
|
role_id: String,
|
||||||
data: Json<v0::DataEditRole>,
|
data: Validate<Json<v0::DataEditRole>>,
|
||||||
) -> Result<Json<v0::Role>> {
|
) -> Result<Json<v0::Role>> {
|
||||||
let data = data.into_inner();
|
let data = data.into_inner().into_inner();
|
||||||
data.validate().map_err(|error| {
|
|
||||||
create_error!(FailedValidation {
|
|
||||||
error: error.to_string()
|
|
||||||
})
|
|
||||||
})?;
|
|
||||||
|
|
||||||
let mut server = target.as_server(db).await?;
|
let mut server = target.as_server(db).await?;
|
||||||
let mut query = DatabasePermissionQuery::new(db, &user).server(&server);
|
let mut query = DatabasePermissionQuery::new(db, &user).server(&server);
|
||||||
|
|||||||
@@ -5,7 +5,8 @@ use revolt_database::{
|
|||||||
use revolt_models::v0;
|
use revolt_models::v0;
|
||||||
use revolt_permissions::{calculate_server_permissions, ChannelPermission};
|
use revolt_permissions::{calculate_server_permissions, ChannelPermission};
|
||||||
use revolt_result::{create_error, Result};
|
use revolt_result::{create_error, Result};
|
||||||
use rocket::{serde::json::Json, State};
|
use rocket::State;
|
||||||
|
use crate::util::json::Json;
|
||||||
|
|
||||||
/// # Edits server roles ranks
|
/// # Edits server roles ranks
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -5,7 +5,8 @@ use revolt_database::{
|
|||||||
use revolt_models::v0;
|
use revolt_models::v0;
|
||||||
use revolt_permissions::PermissionQuery;
|
use revolt_permissions::PermissionQuery;
|
||||||
use revolt_result::{create_error, Result};
|
use revolt_result::{create_error, Result};
|
||||||
use rocket::{serde::json::Json, State};
|
use rocket::State;
|
||||||
|
use crate::util::json::Json;
|
||||||
|
|
||||||
/// # Fetch Role
|
/// # Fetch Role
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -2,9 +2,8 @@ use revolt_database::{Database, Member, Server, User};
|
|||||||
use revolt_models::v0;
|
use revolt_models::v0;
|
||||||
use revolt_result::{create_error, Result};
|
use revolt_result::{create_error, Result};
|
||||||
|
|
||||||
use rocket::serde::json::Json;
|
use crate::util::json::{Json, Validate};
|
||||||
use rocket::State;
|
use rocket::State;
|
||||||
use validator::Validate;
|
|
||||||
|
|
||||||
/// # Create Server
|
/// # Create Server
|
||||||
///
|
///
|
||||||
@@ -14,18 +13,13 @@ use validator::Validate;
|
|||||||
pub async fn create_server(
|
pub async fn create_server(
|
||||||
db: &State<Database>,
|
db: &State<Database>,
|
||||||
user: User,
|
user: User,
|
||||||
data: Json<v0::DataCreateServer>,
|
data: Validate<Json<v0::DataCreateServer>>,
|
||||||
) -> Result<Json<v0::CreateServerLegacyResponse>> {
|
) -> Result<Json<v0::CreateServerLegacyResponse>> {
|
||||||
if user.bot.is_some() {
|
if user.bot.is_some() {
|
||||||
return Err(create_error!(IsBot));
|
return Err(create_error!(IsBot));
|
||||||
}
|
}
|
||||||
|
|
||||||
let data = data.into_inner();
|
let data = data.into_inner().into_inner();
|
||||||
data.validate().map_err(|error| {
|
|
||||||
create_error!(FailedValidation {
|
|
||||||
error: error.to_string()
|
|
||||||
})
|
|
||||||
})?;
|
|
||||||
|
|
||||||
user.can_acquire_server(db).await?;
|
user.can_acquire_server(db).await?;
|
||||||
|
|
||||||
|
|||||||
@@ -7,8 +7,8 @@ use revolt_database::{
|
|||||||
use revolt_models::v0;
|
use revolt_models::v0;
|
||||||
use revolt_permissions::{calculate_server_permissions, ChannelPermission};
|
use revolt_permissions::{calculate_server_permissions, ChannelPermission};
|
||||||
use revolt_result::{create_error, Result};
|
use revolt_result::{create_error, Result};
|
||||||
use rocket::{serde::json::Json, State};
|
use crate::util::json::{Json, Validate};
|
||||||
use validator::Validate;
|
use rocket::State;
|
||||||
|
|
||||||
/// # Edit Server
|
/// # Edit Server
|
||||||
///
|
///
|
||||||
@@ -19,14 +19,9 @@ pub async fn edit(
|
|||||||
db: &State<Database>,
|
db: &State<Database>,
|
||||||
user: User,
|
user: User,
|
||||||
target: Reference<'_>,
|
target: Reference<'_>,
|
||||||
data: Json<v0::DataEditServer>,
|
data: Validate<Json<v0::DataEditServer>>,
|
||||||
) -> Result<Json<v0::Server>> {
|
) -> Result<Json<v0::Server>> {
|
||||||
let data = data.into_inner();
|
let data = data.into_inner().into_inner();
|
||||||
data.validate().map_err(|error| {
|
|
||||||
create_error!(FailedValidation {
|
|
||||||
error: error.to_string()
|
|
||||||
})
|
|
||||||
})?;
|
|
||||||
|
|
||||||
let mut server = target.as_server(db).await?;
|
let mut server = target.as_server(db).await?;
|
||||||
let mut query = DatabasePermissionQuery::new(db, &user).server(&server);
|
let mut query = DatabasePermissionQuery::new(db, &user).server(&server);
|
||||||
|
|||||||
@@ -5,7 +5,8 @@ use revolt_database::{
|
|||||||
use revolt_models::v0;
|
use revolt_models::v0;
|
||||||
use revolt_permissions::{calculate_channel_permissions, ChannelPermission, PermissionQuery};
|
use revolt_permissions::{calculate_channel_permissions, ChannelPermission, PermissionQuery};
|
||||||
use revolt_result::{create_error, Result};
|
use revolt_result::{create_error, Result};
|
||||||
use rocket::{serde::json::Json, State};
|
use rocket::State;
|
||||||
|
use crate::util::json::Json;
|
||||||
|
|
||||||
/// # Fetch Server
|
/// # Fetch Server
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
use revolt_database::{Database, User};
|
use revolt_database::{Database, User};
|
||||||
use revolt_models::v0;
|
use revolt_models::v0;
|
||||||
use revolt_result::Result;
|
use revolt_result::Result;
|
||||||
use rocket::serde::json::Json;
|
use crate::util::json::Json;
|
||||||
use rocket::State;
|
use rocket::State;
|
||||||
|
|
||||||
/// # Fetch Settings
|
/// # Fetch Settings
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
use revolt_database::{Database, User};
|
use revolt_database::{Database, User};
|
||||||
use revolt_models::v0;
|
use revolt_models::v0;
|
||||||
use revolt_result::Result;
|
use revolt_result::Result;
|
||||||
use rocket::serde::json::Json;
|
use crate::util::json::Json;
|
||||||
use rocket::State;
|
use rocket::State;
|
||||||
|
|
||||||
/// # Fetch Unreads
|
/// # Fetch Unreads
|
||||||
|
|||||||
@@ -3,7 +3,8 @@ use revolt_models::v0;
|
|||||||
|
|
||||||
use chrono::prelude::*;
|
use chrono::prelude::*;
|
||||||
use revolt_result::Result;
|
use revolt_result::Result;
|
||||||
use rocket::{serde::json::Json, State};
|
use rocket::State;
|
||||||
|
use crate::util::json::Json;
|
||||||
use rocket_empty::EmptyResponse;
|
use rocket_empty::EmptyResponse;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ use revolt_database::util::reference::Reference;
|
|||||||
use revolt_database::{Database, User, AMQP};
|
use revolt_database::{Database, User, AMQP};
|
||||||
use revolt_models::v0;
|
use revolt_models::v0;
|
||||||
use revolt_result::{create_error, Result};
|
use revolt_result::{create_error, Result};
|
||||||
use rocket::serde::json::Json;
|
use crate::util::json::Json;
|
||||||
use rocket::State;
|
use rocket::State;
|
||||||
|
|
||||||
/// # Accept Friend Request
|
/// # Accept Friend Request
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ use revolt_database::util::reference::Reference;
|
|||||||
use revolt_database::{Database, User};
|
use revolt_database::{Database, User};
|
||||||
use revolt_models::v0;
|
use revolt_models::v0;
|
||||||
use revolt_result::Result;
|
use revolt_result::Result;
|
||||||
use rocket::serde::json::Json;
|
use crate::util::json::Json;
|
||||||
use rocket::State;
|
use rocket::State;
|
||||||
|
|
||||||
/// # Block User
|
/// # Block User
|
||||||
|
|||||||
@@ -1,29 +1,9 @@
|
|||||||
use authifier::models::Account;
|
use authifier::models::Account;
|
||||||
use once_cell::sync::Lazy;
|
|
||||||
use regex::Regex;
|
|
||||||
use revolt_database::{Database, User};
|
use revolt_database::{Database, User};
|
||||||
use revolt_models::v0;
|
use revolt_models::v0;
|
||||||
use revolt_result::{create_error, Result};
|
use revolt_result::{create_error, Result};
|
||||||
use rocket::{serde::json::Json, State};
|
use crate::util::json::{Json, Validate};
|
||||||
use serde::{Deserialize, Serialize};
|
use rocket::State;
|
||||||
use validator::Validate;
|
|
||||||
|
|
||||||
/// Regex for valid usernames
|
|
||||||
///
|
|
||||||
/// Block zero width space
|
|
||||||
/// Block lookalike characters
|
|
||||||
pub static RE_USERNAME: Lazy<Regex> = Lazy::new(|| Regex::new(r"^(\p{L}|[\d_.-])+$").unwrap());
|
|
||||||
|
|
||||||
/// # Username Information
|
|
||||||
#[derive(Validate, Serialize, Deserialize, JsonSchema)]
|
|
||||||
pub struct DataChangeUsername {
|
|
||||||
/// New username
|
|
||||||
#[validate(length(min = 2, max = 32), regex = "RE_USERNAME")]
|
|
||||||
username: String,
|
|
||||||
/// Current account password
|
|
||||||
#[validate(length(min = 8, max = 1024))]
|
|
||||||
password: String,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// # Change Username
|
/// # Change Username
|
||||||
///
|
///
|
||||||
@@ -34,14 +14,9 @@ pub async fn change_username(
|
|||||||
db: &State<Database>,
|
db: &State<Database>,
|
||||||
account: Account,
|
account: Account,
|
||||||
mut user: User,
|
mut user: User,
|
||||||
data: Json<DataChangeUsername>,
|
data: Validate<Json<v0::DataChangeUsername>>,
|
||||||
) -> Result<Json<v0::User>> {
|
) -> Result<Json<v0::User>> {
|
||||||
let data = data.into_inner();
|
let data = data.into_inner().into_inner();
|
||||||
data.validate().map_err(|error| {
|
|
||||||
create_error!(FailedValidation {
|
|
||||||
error: error.to_string()
|
|
||||||
})
|
|
||||||
})?;
|
|
||||||
|
|
||||||
account
|
account
|
||||||
.verify_password(&data.password)
|
.verify_password(&data.password)
|
||||||
|
|||||||
@@ -2,9 +2,8 @@ use revolt_database::FieldsUser;
|
|||||||
use revolt_database::{util::reference::Reference, Database, File, PartialUser, User};
|
use revolt_database::{util::reference::Reference, Database, File, PartialUser, User};
|
||||||
use revolt_models::v0;
|
use revolt_models::v0;
|
||||||
use revolt_result::{create_error, Result};
|
use revolt_result::{create_error, Result};
|
||||||
use rocket::serde::json::Json;
|
use crate::util::json::{Json, Validate};
|
||||||
use rocket::State;
|
use rocket::State;
|
||||||
use validator::Validate;
|
|
||||||
|
|
||||||
/// # Edit User
|
/// # Edit User
|
||||||
///
|
///
|
||||||
@@ -15,14 +14,9 @@ pub async fn edit(
|
|||||||
db: &State<Database>,
|
db: &State<Database>,
|
||||||
mut user: User,
|
mut user: User,
|
||||||
target: Reference<'_>,
|
target: Reference<'_>,
|
||||||
data: Json<v0::DataEditUser>,
|
data: Validate<Json<v0::DataEditUser>>,
|
||||||
) -> Result<Json<v0::User>> {
|
) -> Result<Json<v0::User>> {
|
||||||
let data = data.into_inner();
|
let data = data.into_inner().into_inner();
|
||||||
data.validate().map_err(|error| {
|
|
||||||
create_error!(FailedValidation {
|
|
||||||
error: error.to_string()
|
|
||||||
})
|
|
||||||
})?;
|
|
||||||
|
|
||||||
// Filter out invalid edit fields
|
// Filter out invalid edit fields
|
||||||
if !user.privileged && (data.badges.is_some() || data.flags.is_some()) {
|
if !user.privileged && (data.badges.is_some() || data.flags.is_some()) {
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
use revolt_database::{Database, User};
|
use revolt_database::{Database, User};
|
||||||
use revolt_models::v0;
|
use revolt_models::v0;
|
||||||
use revolt_result::Result;
|
use revolt_result::Result;
|
||||||
use rocket::{serde::json::Json, State};
|
use rocket::State;
|
||||||
|
use crate::util::json::Json;
|
||||||
|
|
||||||
/// # Fetch Direct Message Channels
|
/// # Fetch Direct Message Channels
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -5,7 +5,8 @@ use revolt_database::{
|
|||||||
use revolt_models::v0;
|
use revolt_models::v0;
|
||||||
use revolt_permissions::{calculate_user_permissions, UserPermission};
|
use revolt_permissions::{calculate_user_permissions, UserPermission};
|
||||||
use revolt_result::Result;
|
use revolt_result::Result;
|
||||||
use rocket::{serde::json::Json, State};
|
use rocket::State;
|
||||||
|
use crate::util::json::Json;
|
||||||
|
|
||||||
/// # Fetch User Profile
|
/// # Fetch User Profile
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
use revolt_database::User;
|
use revolt_database::User;
|
||||||
use revolt_models::v0;
|
use revolt_models::v0;
|
||||||
use revolt_result::Result;
|
use revolt_result::Result;
|
||||||
use rocket::serde::json::Json;
|
use crate::util::json::Json;
|
||||||
|
|
||||||
/// # Fetch Self
|
/// # Fetch Self
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -6,7 +6,8 @@ use revolt_models::v0;
|
|||||||
|
|
||||||
use revolt_permissions::{calculate_user_permissions, UserPermission};
|
use revolt_permissions::{calculate_user_permissions, UserPermission};
|
||||||
use revolt_result::Result;
|
use revolt_result::Result;
|
||||||
use rocket::{serde::json::Json, State};
|
use rocket::State;
|
||||||
|
use crate::util::json::Json;
|
||||||
|
|
||||||
/// # Fetch User
|
/// # Fetch User
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
use revolt_database::{util::reference::Reference, Database};
|
use revolt_database::{util::reference::Reference, Database};
|
||||||
use revolt_models::v0;
|
use revolt_models::v0;
|
||||||
use revolt_result::Result;
|
use revolt_result::Result;
|
||||||
use rocket::{serde::json::Json, State};
|
use rocket::State;
|
||||||
|
use crate::util::json::Json;
|
||||||
|
|
||||||
/// # Fetch User Flags
|
/// # Fetch User Flags
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ use revolt_models::v0;
|
|||||||
|
|
||||||
use revolt_permissions::{calculate_user_permissions, UserPermission};
|
use revolt_permissions::{calculate_user_permissions, UserPermission};
|
||||||
use revolt_result::{create_error, Result};
|
use revolt_result::{create_error, Result};
|
||||||
use rocket::serde::json::Json;
|
use crate::util::json::Json;
|
||||||
use rocket::State;
|
use rocket::State;
|
||||||
|
|
||||||
/// # Fetch Mutual Friends And Servers
|
/// # Fetch Mutual Friends And Servers
|
||||||
|
|||||||
@@ -5,7 +5,8 @@ use revolt_database::{
|
|||||||
use revolt_models::v0;
|
use revolt_models::v0;
|
||||||
use revolt_permissions::{calculate_user_permissions, UserPermission};
|
use revolt_permissions::{calculate_user_permissions, UserPermission};
|
||||||
use revolt_result::Result;
|
use revolt_result::Result;
|
||||||
use rocket::{serde::json::Json, State};
|
use rocket::State;
|
||||||
|
use crate::util::json::Json;
|
||||||
|
|
||||||
/// # Open Direct Message
|
/// # Open Direct Message
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ use revolt_database::util::reference::Reference;
|
|||||||
use revolt_database::{Database, User};
|
use revolt_database::{Database, User};
|
||||||
use revolt_models::v0;
|
use revolt_models::v0;
|
||||||
use revolt_result::{create_error, Result};
|
use revolt_result::{create_error, Result};
|
||||||
use rocket::serde::json::Json;
|
use crate::util::json::Json;
|
||||||
use rocket::State;
|
use rocket::State;
|
||||||
|
|
||||||
/// # Deny Friend Request / Remove Friend
|
/// # Deny Friend Request / Remove Friend
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
use revolt_database::{Database, User, AMQP};
|
use revolt_database::{Database, User, AMQP};
|
||||||
use revolt_models::v0;
|
use revolt_models::v0;
|
||||||
use revolt_result::{create_error, Result};
|
use revolt_result::{create_error, Result};
|
||||||
use rocket::serde::json::Json;
|
use crate::util::json::Json;
|
||||||
use rocket::State;
|
use rocket::State;
|
||||||
|
|
||||||
/// # Send Friend Request
|
/// # Send Friend Request
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ use revolt_database::util::reference::Reference;
|
|||||||
use revolt_database::{Database, User};
|
use revolt_database::{Database, User};
|
||||||
use revolt_models::v0;
|
use revolt_models::v0;
|
||||||
use revolt_result::Result;
|
use revolt_result::Result;
|
||||||
use rocket::serde::json::Json;
|
use crate::util::json::Json;
|
||||||
use rocket::State;
|
use rocket::State;
|
||||||
|
|
||||||
/// # Unblock User
|
/// # Unblock User
|
||||||
|
|||||||
@@ -4,9 +4,9 @@ use revolt_database::{
|
|||||||
};
|
};
|
||||||
use revolt_models::v0::{DataEditWebhook, Webhook};
|
use revolt_models::v0::{DataEditWebhook, Webhook};
|
||||||
use revolt_permissions::{calculate_channel_permissions, ChannelPermission};
|
use revolt_permissions::{calculate_channel_permissions, ChannelPermission};
|
||||||
use revolt_result::{create_error, Result};
|
use revolt_result::Result;
|
||||||
use rocket::{serde::json::Json, State};
|
use crate::util::json::{Json, Validate};
|
||||||
use validator::Validate;
|
use rocket::State;
|
||||||
|
|
||||||
/// # Edits a webhook
|
/// # Edits a webhook
|
||||||
///
|
///
|
||||||
@@ -17,14 +17,9 @@ pub async fn webhook_edit(
|
|||||||
db: &State<Database>,
|
db: &State<Database>,
|
||||||
webhook_id: Reference<'_>,
|
webhook_id: Reference<'_>,
|
||||||
user: User,
|
user: User,
|
||||||
data: Json<DataEditWebhook>,
|
data: Validate<Json<DataEditWebhook>>,
|
||||||
) -> Result<Json<Webhook>> {
|
) -> Result<Json<Webhook>> {
|
||||||
let data = data.into_inner();
|
let data = data.into_inner().into_inner();
|
||||||
data.validate().map_err(|error| {
|
|
||||||
create_error!(FailedValidation {
|
|
||||||
error: error.to_string()
|
|
||||||
})
|
|
||||||
})?;
|
|
||||||
|
|
||||||
let mut webhook = webhook_id.as_webhook(db).await?;
|
let mut webhook = webhook_id.as_webhook(db).await?;
|
||||||
let channel = db.fetch_channel(&webhook.channel_id).await?;
|
let channel = db.fetch_channel(&webhook.channel_id).await?;
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
use revolt_database::util::reference::Reference;
|
use revolt_database::util::reference::Reference;
|
||||||
use revolt_database::{Database, File, PartialWebhook};
|
use revolt_database::{Database, File, PartialWebhook};
|
||||||
use revolt_models::v0::{DataEditWebhook, Webhook};
|
use revolt_models::v0::{DataEditWebhook, Webhook};
|
||||||
use revolt_models::validator::Validate;
|
use revolt_result::Result;
|
||||||
use revolt_result::{create_error, Result};
|
use crate::util::json::{Json, Validate};
|
||||||
use rocket::{serde::json::Json, State};
|
use rocket::State;
|
||||||
|
|
||||||
/// # Edits a webhook
|
/// # Edits a webhook
|
||||||
///
|
///
|
||||||
@@ -14,14 +14,9 @@ pub async fn webhook_edit_token(
|
|||||||
db: &State<Database>,
|
db: &State<Database>,
|
||||||
webhook_id: Reference<'_>,
|
webhook_id: Reference<'_>,
|
||||||
token: String,
|
token: String,
|
||||||
data: Json<DataEditWebhook>,
|
data: Validate<Json<DataEditWebhook>>,
|
||||||
) -> Result<Json<Webhook>> {
|
) -> Result<Json<Webhook>> {
|
||||||
let data = data.into_inner();
|
let data = data.into_inner().into_inner();
|
||||||
data.validate().map_err(|error| {
|
|
||||||
create_error!(FailedValidation {
|
|
||||||
error: error.to_string()
|
|
||||||
})
|
|
||||||
})?;
|
|
||||||
|
|
||||||
let mut webhook = webhook_id.as_webhook(db).await?;
|
let mut webhook = webhook_id.as_webhook(db).await?;
|
||||||
webhook.assert_token(&token)?;
|
webhook.assert_token(&token)?;
|
||||||
|
|||||||
@@ -5,10 +5,9 @@ use revolt_database::{
|
|||||||
};
|
};
|
||||||
use revolt_models::v0;
|
use revolt_models::v0;
|
||||||
use revolt_permissions::{ChannelPermission, PermissionValue};
|
use revolt_permissions::{ChannelPermission, PermissionValue};
|
||||||
use revolt_result::{create_error, Result};
|
use revolt_result::Result;
|
||||||
use rocket::{serde::json::Json, State};
|
use crate::util::json::{Json, Validate};
|
||||||
|
use rocket::State;
|
||||||
use validator::Validate;
|
|
||||||
|
|
||||||
/// # Executes a webhook
|
/// # Executes a webhook
|
||||||
///
|
///
|
||||||
@@ -20,15 +19,10 @@ pub async fn webhook_execute(
|
|||||||
amqp: &State<AMQP>,
|
amqp: &State<AMQP>,
|
||||||
webhook_id: Reference<'_>,
|
webhook_id: Reference<'_>,
|
||||||
token: String,
|
token: String,
|
||||||
data: Json<v0::DataMessageSend>,
|
data: Validate<Json<v0::DataMessageSend>>,
|
||||||
idempotency: IdempotencyKey,
|
idempotency: IdempotencyKey,
|
||||||
) -> Result<Json<v0::Message>> {
|
) -> Result<Json<v0::Message>> {
|
||||||
let data = data.into_inner();
|
let data = data.into_inner().into_inner();
|
||||||
data.validate().map_err(|error| {
|
|
||||||
create_error!(FailedValidation {
|
|
||||||
error: error.to_string()
|
|
||||||
})
|
|
||||||
})?;
|
|
||||||
|
|
||||||
let webhook = webhook_id.as_webhook(db).await?;
|
let webhook = webhook_id.as_webhook(db).await?;
|
||||||
webhook.assert_token(&token)?;
|
webhook.assert_token(&token)?;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
use revolt_database::{util::reference::Reference, Database, Message, AMQP};
|
use revolt_database::{util::reference::Reference, Database, Message, AMQP};
|
||||||
use revolt_models::v0::{MessageAuthor, SendableEmbed, Webhook};
|
use revolt_models::v0::{MessageAuthor, SendableEmbed, Webhook};
|
||||||
use revolt_result::{create_error, Error, Result};
|
use revolt_result::{create_error, Error, Result, ToRevoltError};
|
||||||
use revolt_rocket_okapi::{
|
use revolt_rocket_okapi::{
|
||||||
gen::OpenApiGenerator,
|
gen::OpenApiGenerator,
|
||||||
request::{OpenApiFromRequest, RequestHeaderInput},
|
request::{OpenApiFromRequest, RequestHeaderInput},
|
||||||
@@ -1061,11 +1061,13 @@ pub async fn webhook_execute_github(
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
sendable_embed.validate().map_err(|error| {
|
sendable_embed.validate()
|
||||||
create_error!(FailedValidation {
|
.capture_error()
|
||||||
error: error.to_string()
|
.map_err(|error| {
|
||||||
})
|
create_error!(FailedValidation {
|
||||||
})?;
|
error: error.to_string()
|
||||||
|
})
|
||||||
|
})?;
|
||||||
|
|
||||||
let message_id = Ulid::new().to_string();
|
let message_id = Ulid::new().to_string();
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,8 @@ use revolt_database::{
|
|||||||
use revolt_models::v0::{ResponseWebhook, Webhook};
|
use revolt_models::v0::{ResponseWebhook, Webhook};
|
||||||
use revolt_permissions::{calculate_channel_permissions, ChannelPermission};
|
use revolt_permissions::{calculate_channel_permissions, ChannelPermission};
|
||||||
use revolt_result::Result;
|
use revolt_result::Result;
|
||||||
use rocket::{serde::json::Json, State};
|
use rocket::State;
|
||||||
|
use crate::util::json::Json;
|
||||||
|
|
||||||
/// # Gets a webhook
|
/// # Gets a webhook
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
use revolt_database::{util::reference::Reference, Database};
|
use revolt_database::{util::reference::Reference, Database};
|
||||||
use revolt_models::v0::Webhook;
|
use revolt_models::v0::Webhook;
|
||||||
use revolt_result::Result;
|
use revolt_result::Result;
|
||||||
use rocket::{serde::json::Json, State};
|
use rocket::State;
|
||||||
|
use crate::util::json::Json;
|
||||||
|
|
||||||
/// # Gets a webhook
|
/// # Gets a webhook
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -2,16 +2,11 @@ use std::fmt::Debug;
|
|||||||
|
|
||||||
use revolt_rocket_okapi::{
|
use revolt_rocket_okapi::{
|
||||||
r#gen::OpenApiGenerator,
|
r#gen::OpenApiGenerator,
|
||||||
response::OpenApiResponderInner,
|
|
||||||
revolt_okapi::openapi3::Responses,
|
|
||||||
util::add_schema_response,
|
|
||||||
request::OpenApiFromData,
|
request::OpenApiFromData,
|
||||||
revolt_okapi::{
|
response::OpenApiResponderInner,
|
||||||
openapi3::{MediaType, RequestBody},
|
revolt_okapi::openapi3::{RequestBody, Responses}, util::add_schema_response
|
||||||
Map,
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
use rocket::data::{Data, FromData, Limits, Outcome};
|
use rocket::{data::{Data, FromData, Limits, Outcome}};
|
||||||
use rocket::response::{self, Responder, content};
|
use rocket::response::{self, Responder, content};
|
||||||
use rocket::request::{local_cache, Request};
|
use rocket::request::{local_cache, Request};
|
||||||
use schemars::JsonSchema;
|
use schemars::JsonSchema;
|
||||||
@@ -21,27 +16,6 @@ use revolt_result::{create_error, Error, ToRevoltError};
|
|||||||
// A lot of this code is modified versions of rocket::serde::json so we can store
|
// A lot of this code is modified versions of rocket::serde::json so we can store
|
||||||
// the error so it can be passed to the error catcher.
|
// the error so it can be passed to the error catcher.
|
||||||
|
|
||||||
macro_rules! fn_request_body {
|
|
||||||
($gen:ident, $ty:path, $mime_type:expr) => {{
|
|
||||||
let schema = $gen.json_schema::<$ty>();
|
|
||||||
Ok(RequestBody {
|
|
||||||
content: {
|
|
||||||
let mut map = Map::new();
|
|
||||||
map.insert(
|
|
||||||
$mime_type.to_owned(),
|
|
||||||
MediaType {
|
|
||||||
schema: Some(schema),
|
|
||||||
..MediaType::default()
|
|
||||||
},
|
|
||||||
);
|
|
||||||
map
|
|
||||||
},
|
|
||||||
required: true,
|
|
||||||
..revolt_rocket_okapi::revolt_okapi::openapi3::RequestBody::default()
|
|
||||||
})
|
|
||||||
}};
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct Json<T>(pub T);
|
pub struct Json<T>(pub T);
|
||||||
|
|
||||||
@@ -107,11 +81,11 @@ impl<'r, T: Serialize> Responder<'r, 'static> for Json<T> {
|
|||||||
|
|
||||||
impl<'r, T: JsonSchema + Deserialize<'r> + Debug> OpenApiFromData<'r> for Json<T> {
|
impl<'r, T: JsonSchema + Deserialize<'r> + Debug> OpenApiFromData<'r> for Json<T> {
|
||||||
fn request_body(gen: &mut OpenApiGenerator) -> revolt_rocket_okapi::Result<RequestBody> {
|
fn request_body(gen: &mut OpenApiGenerator) -> revolt_rocket_okapi::Result<RequestBody> {
|
||||||
fn_request_body!(gen, T, "application/json")
|
crate::fn_request_body!(gen, T, "application/json")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: Serialize + JsonSchema + Send> OpenApiResponderInner for Json<T> {
|
impl<T: JsonSchema + Serialize> OpenApiResponderInner for Json<T> {
|
||||||
fn responses(gen: &mut OpenApiGenerator) -> revolt_rocket_okapi::Result<Responses> {
|
fn responses(gen: &mut OpenApiGenerator) -> revolt_rocket_okapi::Result<Responses> {
|
||||||
let mut responses = Responses::default();
|
let mut responses = Responses::default();
|
||||||
let schema = gen.json_schema::<T>();
|
let schema = gen.json_schema::<T>();
|
||||||
@@ -125,52 +99,3 @@ impl<T: validator::Validate> validator::Validate for Json<T> {
|
|||||||
self.0.validate()
|
self.0.validate()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct Validate<T>(pub T);
|
|
||||||
|
|
||||||
impl<T> Validate<Json<T>> {
|
|
||||||
pub fn into_inner(self) -> T {
|
|
||||||
self.0.0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[async_trait]
|
|
||||||
impl<'r, T: validator::Validate + Deserialize<'r> + Debug> FromData<'r> for Validate<Json<T>> {
|
|
||||||
type Error = Error;
|
|
||||||
|
|
||||||
async fn from_data(req: &'r Request<'_>, data: Data<'r>) -> Outcome<'r, Self> {
|
|
||||||
<Json::<T> as FromData<'r>>::from_data(req, data).await.and_then(|inner| {
|
|
||||||
if let Err(e) = inner.validate() {
|
|
||||||
let error = create_error!(FailedValidation { error: e.to_string() });
|
|
||||||
req.local_cache(|| Some(error.clone()));
|
|
||||||
|
|
||||||
return Outcome::Error((error.rocket_status(), error))
|
|
||||||
};
|
|
||||||
|
|
||||||
Outcome::Success(Self(inner))
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'r, T: JsonSchema + Deserialize<'r> + validator::Validate + Debug> OpenApiFromData<'r> for Validate<Json<T>> {
|
|
||||||
fn request_body(gen: &mut OpenApiGenerator) -> revolt_rocket_okapi::Result<RequestBody> {
|
|
||||||
fn_request_body!(gen, T, "application/json")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<T: Serialize + JsonSchema + Send> OpenApiResponderInner for Validate<Json<T>> {
|
|
||||||
fn responses(gen: &mut OpenApiGenerator) -> revolt_rocket_okapi::Result<Responses> {
|
|
||||||
let mut responses = Responses::default();
|
|
||||||
let schema = gen.json_schema::<T>();
|
|
||||||
add_schema_response(&mut responses, 200, "application/json", schema)?;
|
|
||||||
Ok(responses)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<T> std::ops::Deref for Validate<T> {
|
|
||||||
type Target = T;
|
|
||||||
|
|
||||||
fn deref(&self) -> &Self::Target {
|
|
||||||
&self.0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
27
crates/delta/src/util/json/mod.rs
Normal file
27
crates/delta/src/util/json/mod.rs
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
pub mod json;
|
||||||
|
pub mod validator;
|
||||||
|
|
||||||
|
pub use json::Json;
|
||||||
|
pub use validator::Validate;
|
||||||
|
|
||||||
|
#[macro_export]
|
||||||
|
macro_rules! fn_request_body {
|
||||||
|
($gen:ident, $ty:path, $mime_type:expr) => {{
|
||||||
|
let schema = $gen.json_schema::<$ty>();
|
||||||
|
Ok(revolt_rocket_okapi::revolt_okapi::openapi3::RequestBody {
|
||||||
|
content: {
|
||||||
|
let mut map = revolt_rocket_okapi::revolt_okapi::Map::new();
|
||||||
|
map.insert(
|
||||||
|
$mime_type.to_owned(),
|
||||||
|
revolt_rocket_okapi::revolt_okapi::openapi3::MediaType {
|
||||||
|
schema: Some(schema),
|
||||||
|
..Default::default()
|
||||||
|
},
|
||||||
|
);
|
||||||
|
map
|
||||||
|
},
|
||||||
|
required: true,
|
||||||
|
..Default::default()
|
||||||
|
})
|
||||||
|
}};
|
||||||
|
}
|
||||||
87
crates/delta/src/util/json/validator.rs
Normal file
87
crates/delta/src/util/json/validator.rs
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
use revolt_rocket_okapi::{
|
||||||
|
r#gen::OpenApiGenerator,
|
||||||
|
request::OpenApiFromData,
|
||||||
|
response::OpenApiResponderInner,
|
||||||
|
revolt_okapi::{openapi3::{RequestBody, Responses}},
|
||||||
|
};
|
||||||
|
use rocket::{data::{Data, FromData, Outcome}, form};
|
||||||
|
use rocket::request::Request;
|
||||||
|
use schemars::JsonSchema;
|
||||||
|
use revolt_result::{create_error, Error};
|
||||||
|
|
||||||
|
pub struct Validate<T>(pub T);
|
||||||
|
|
||||||
|
impl<T> Validate<T> {
|
||||||
|
pub fn into_inner(self) -> T {
|
||||||
|
self.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[async_trait]
|
||||||
|
impl<'r, T: FromData<'r, Error = Error> + validator::Validate> FromData<'r> for Validate<T> {
|
||||||
|
type Error = Error;
|
||||||
|
|
||||||
|
async fn from_data(req: &'r Request<'_>, data: Data<'r>) -> Outcome<'r, Self> {
|
||||||
|
T::from_data(req, data).await.and_then(|inner| {
|
||||||
|
if let Err(e) = inner.validate() {
|
||||||
|
let error = create_error!(FailedValidation { error: e.to_string() });
|
||||||
|
req.local_cache(|| Some(error.clone()));
|
||||||
|
|
||||||
|
return Outcome::Error((error.rocket_status(), error))
|
||||||
|
};
|
||||||
|
|
||||||
|
Outcome::Success(Self(inner))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[async_trait]
|
||||||
|
impl<'r, T: form::FromForm<'r> + JsonSchema> form::FromForm<'r> for Validate<T> {
|
||||||
|
type Context = T::Context;
|
||||||
|
|
||||||
|
fn init(opts: form::Options) -> Self::Context {
|
||||||
|
<T as form::FromForm<'r>>::init(opts)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn push_value(ctxt: &mut Self::Context, field: form::ValueField<'r>) {
|
||||||
|
<T as form::FromForm<'r>>::push_value(ctxt, field);
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn push_data(ctxt: &mut Self::Context, field: form::DataField<'r, '_>) {
|
||||||
|
<T as form::FromForm<'r>>::push_data(ctxt, field).await;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn finalize(ctxt: Self::Context) -> form::Result<'r, Self> {
|
||||||
|
<T as form::FromForm<'r>>::finalize(ctxt).map(Self)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'r, T: FromData<'r, Error = Error> + OpenApiFromData<'r> + validator::Validate> OpenApiFromData<'r> for Validate<T> {
|
||||||
|
fn request_body(gen: &mut OpenApiGenerator) -> revolt_rocket_okapi::Result<RequestBody> {
|
||||||
|
T::request_body(gen)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: JsonSchema> JsonSchema for Validate<T> {
|
||||||
|
fn schema_name() -> String {
|
||||||
|
T::schema_name()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn json_schema(generator: &mut schemars::r#gen::SchemaGenerator) -> schemars::schema::Schema {
|
||||||
|
T::json_schema(generator)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: OpenApiResponderInner> OpenApiResponderInner for Validate<T> {
|
||||||
|
fn responses(gen: &mut OpenApiGenerator) -> revolt_rocket_okapi::Result<Responses> {
|
||||||
|
T::responses(gen)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T> std::ops::Deref for Validate<T> {
|
||||||
|
type Target = T;
|
||||||
|
|
||||||
|
fn deref(&self) -> &Self::Target {
|
||||||
|
&self.0
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,7 +8,7 @@ use rocket::fairing::{Fairing, Info, Kind};
|
|||||||
use rocket::http::uri::Origin;
|
use rocket::http::uri::Origin;
|
||||||
use rocket::http::{Method, Status};
|
use rocket::http::{Method, Status};
|
||||||
use rocket::request::{FromRequest, Outcome};
|
use rocket::request::{FromRequest, Outcome};
|
||||||
use rocket::serde::json::Json;
|
use crate::util::json::Json;
|
||||||
use rocket::{Data, Request, Response};
|
use rocket::{Data, Request, Response};
|
||||||
|
|
||||||
use revolt_rocket_okapi::gen::OpenApiGenerator;
|
use revolt_rocket_okapi::gen::OpenApiGenerator;
|
||||||
|
|||||||
Reference in New Issue
Block a user