From 88f811761b4055a3c85744bc9b52cdc5d82aea93 Mon Sep 17 00:00:00 2001 From: Paul Makles Date: Fri, 4 Feb 2022 21:50:30 +0000 Subject: [PATCH] feat: implement channel invites, perms, group create, members fetch chore: when you accidentally run fmt --- Cargo.lock | 1 + src/main.rs | 2 +- src/routes/bots/delete.rs | 4 +- src/routes/bots/edit.rs | 7 +- src/routes/bots/invite.rs | 11 ++- src/routes/bots/mod.rs | 8 +- src/routes/channels/channel_ack.rs | 5 +- src/routes/channels/channel_delete.rs | 40 ++++++---- src/routes/channels/channel_edit.rs | 76 +++++++++++++++---- src/routes/channels/channel_fetch.rs | 16 +++- src/routes/channels/group_add_member.rs | 5 +- src/routes/channels/group_create.rs | 55 ++++++++++++-- src/routes/channels/group_remove_member.rs | 5 +- src/routes/channels/invite_create.rs | 32 +++++--- src/routes/channels/members_fetch.rs | 31 +++++++- src/routes/channels/message_delete.rs | 5 +- src/routes/channels/message_edit.rs | 8 +- src/routes/channels/message_fetch.rs | 5 +- src/routes/channels/message_query.rs | 7 +- src/routes/channels/message_query_stale.rs | 5 +- src/routes/channels/message_search.rs | 5 +- src/routes/channels/message_send.rs | 14 ++-- src/routes/channels/mod.rs | 6 +- src/routes/channels/permissions_set.rs | 40 ++++++++-- .../channels/permissions_set_default.rs | 51 +++++++++++-- src/routes/invites/invite_fetch.rs | 2 +- src/routes/onboard/complete.rs | 15 ++-- src/routes/push/subscribe.rs | 3 +- src/routes/servers/ban_create.rs | 6 +- src/routes/servers/ban_list.rs | 10 +-- src/routes/servers/ban_remove.rs | 5 +- src/routes/servers/channel_create.rs | 7 +- src/routes/servers/member_edit.rs | 8 +- src/routes/servers/member_fetch.rs | 5 +- src/routes/servers/member_remove.rs | 5 +- src/routes/servers/mod.rs | 8 +- src/routes/servers/permissions_set.rs | 12 ++- src/routes/servers/permissions_set_default.rs | 11 ++- src/routes/servers/roles_create.rs | 13 ++-- src/routes/servers/roles_delete.rs | 5 +- src/routes/servers/roles_edit.rs | 6 +- src/routes/servers/server_create.rs | 4 +- src/routes/servers/server_edit.rs | 10 ++- src/routes/sync/set_settings.rs | 5 +- src/routes/users/add_friend.rs | 4 +- src/routes/users/block_user.rs | 4 +- src/routes/users/change_username.rs | 10 ++- src/routes/users/edit_user.rs | 20 +++-- src/routes/users/fetch_dms.rs | 7 +- src/routes/users/fetch_profile.rs | 14 +++- src/routes/users/fetch_self.rs | 22 +++--- src/routes/users/fetch_user.rs | 6 +- src/routes/users/find_mutual.rs | 11 ++- src/routes/users/get_default_avatar.rs | 18 +++-- src/routes/users/mod.rs | 2 +- src/routes/users/open_dm.rs | 19 +++-- src/routes/users/remove_friend.rs | 4 +- src/routes/users/unblock_user.rs | 4 +- src/util/mod.rs | 2 +- 59 files changed, 536 insertions(+), 195 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 40bc6452..c1b017ad 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2948,6 +2948,7 @@ dependencies = [ "lazy_static", "log", "mongodb 2.1.0", + "nanoid", "num_enum", "ops", "optional_struct", diff --git a/src/main.rs b/src/main.rs index 948dd5e0..3870e662 100644 --- a/src/main.rs +++ b/src/main.rs @@ -30,8 +30,8 @@ use rauth::{ logic::Auth, }; use revolt_quark::DatabaseInfo; -use std::str::FromStr; use rocket_cors::AllowedOrigins; +use std::str::FromStr; /*use util::variables::{ APP_URL, HCAPTCHA_KEY, INVITE_ONLY, SMTP_FROM, SMTP_HOST, SMTP_PASSWORD, SMTP_USERNAME, USE_EMAIL, USE_HCAPTCHA, diff --git a/src/routes/bots/delete.rs b/src/routes/bots/delete.rs index 105e2fb0..a7e719ee 100644 --- a/src/routes/bots/delete.rs +++ b/src/routes/bots/delete.rs @@ -1,7 +1,7 @@ -use revolt_quark::Result; use rauth::util::EmptyResponse; +use revolt_quark::Result; #[delete("/")] -pub async fn delete_bot(/*user: UserRef, target: Ref*/ target: String) -> Result { +pub async fn delete_bot(/*user: UserRef, target: Ref*/ target: String,) -> Result { todo!() } diff --git a/src/routes/bots/edit.rs b/src/routes/bots/edit.rs index b7f706d8..1acacadb 100644 --- a/src/routes/bots/edit.rs +++ b/src/routes/bots/edit.rs @@ -1,6 +1,6 @@ use crate::util::regex::RE_USERNAME; -use revolt_quark::{Result, models::bot::FieldsBot, EmptyResponse}; +use revolt_quark::{models::bot::FieldsBot, EmptyResponse, Result}; use mongodb::bson::doc; use rocket::serde::json::Json; @@ -19,6 +19,9 @@ pub struct Data { } #[patch("/", data = "")] -pub async fn edit_bot(/*user: UserRef, target: Ref,*/ target: String, data: Json) -> Result { +pub async fn edit_bot( + /*user: UserRef, target: Ref,*/ target: String, + data: Json, +) -> Result { todo!() } diff --git a/src/routes/bots/invite.rs b/src/routes/bots/invite.rs index 4146f0bb..608bcc8e 100644 --- a/src/routes/bots/invite.rs +++ b/src/routes/bots/invite.rs @@ -5,22 +5,25 @@ use serde::Deserialize; #[derive(Deserialize)] pub struct ServerId { - server: String + server: String, } #[derive(Deserialize)] pub struct GroupId { - group: String + group: String, } #[derive(Deserialize)] #[serde(untagged)] pub enum Destination { Server(ServerId), - Group(GroupId) + Group(GroupId), } #[post("//invite", data = "")] -pub async fn invite_bot(/*user: UserRef, target: Ref,*/ target: String, dest: Json) -> Result { +pub async fn invite_bot( + /*user: UserRef, target: Ref,*/ target: String, + dest: Json, +) -> Result { todo!() } diff --git a/src/routes/bots/mod.rs b/src/routes/bots/mod.rs index 4b91b3bb..e2affbc1 100644 --- a/src/routes/bots/mod.rs +++ b/src/routes/bots/mod.rs @@ -1,12 +1,12 @@ use rocket::Route; mod create; -mod invite; -mod fetch_public; +mod delete; +mod edit; mod fetch; mod fetch_owned; -mod edit; -mod delete; +mod fetch_public; +mod invite; pub fn routes() -> Vec { routes![ diff --git a/src/routes/channels/channel_ack.rs b/src/routes/channels/channel_ack.rs index 20df3575..81dafd6c 100644 --- a/src/routes/channels/channel_ack.rs +++ b/src/routes/channels/channel_ack.rs @@ -1,6 +1,9 @@ use revolt_quark::{EmptyResponse, Result}; #[put("//ack/")] -pub async fn req(/*user: UserRef, target: Ref, message: Ref*/ target: String, message: String) -> Result { +pub async fn req( + /*user: UserRef, target: Ref, message: Ref*/ target: String, + message: String, +) -> Result { todo!() } diff --git a/src/routes/channels/channel_delete.rs b/src/routes/channels/channel_delete.rs index ff3f72bf..c114d818 100644 --- a/src/routes/channels/channel_delete.rs +++ b/src/routes/channels/channel_delete.rs @@ -1,4 +1,7 @@ -use revolt_quark::{Error, EmptyResponse, Result, models::{User, Channel, channel::PartialChannel}, Ref, Db, perms, ChannelPermission}; +use revolt_quark::{ + models::{channel::PartialChannel, Channel, User}, + perms, ChannelPermission, Db, EmptyResponse, Error, Ref, Result, +}; use mongodb::bson::doc; @@ -8,16 +11,21 @@ pub async fn req(db: &Db, user: User, target: Ref) -> Result { let perm = perms(&user).channel(&channel).calc_channel(db).await; if !perm.get_view() { - return Err(Error::NotFound) + return Err(Error::NotFound); } match channel { Channel::SavedMessages { .. } => Err(Error::NoEffect), Channel::DirectMessage { id, .. } => { - db.update_channel(&id, &PartialChannel { - active: Some(false), - ..Default::default() - }, vec![]).await?; + db.update_channel( + &id, + &PartialChannel { + active: Some(false), + ..Default::default() + }, + vec![], + ) + .await?; Ok(EmptyResponse) } @@ -29,10 +37,15 @@ pub async fn req(db: &Db, user: User, target: Ref) -> Result { } => { if user.id == owner { if let Some(new_owner) = recipients.iter().find(|x| *x != &user.id) { - db.update_channel(&id, &PartialChannel { - owner: Some(new_owner.into()), - ..Default::default() - }, vec![]).await?; + db.update_channel( + &id, + &PartialChannel { + owner: Some(new_owner.into()), + ..Default::default() + }, + vec![], + ) + .await?; } else { db.delete_channel(&id).await?; return Ok(EmptyResponse); @@ -54,13 +67,14 @@ pub async fn req(db: &Db, user: User, target: Ref) -> Result { Ok(EmptyResponse) } - Channel::TextChannel { id, .. } | - Channel::VoiceChannel { id, .. } => { + Channel::TextChannel { id, .. } | Channel::VoiceChannel { id, .. } => { if perm.get_manage_channel() { db.delete_channel(&id).await?; Ok(EmptyResponse) } else { - Err(Error::MissingPermission { permission: ChannelPermission::ManageChannel as i32 }) + Err(Error::MissingPermission { + permission: ChannelPermission::ManageChannel as i32, + }) } } } diff --git a/src/routes/channels/channel_edit.rs b/src/routes/channels/channel_edit.rs index 2228866e..122090bb 100644 --- a/src/routes/channels/channel_edit.rs +++ b/src/routes/channels/channel_edit.rs @@ -1,4 +1,10 @@ -use revolt_quark::{Error, Result, models::{channel::{FieldsChannel, PartialChannel, Channel}, User, File}, Ref, Database, perms, ChannelPermission}; +use revolt_quark::{ + models::{ + channel::{Channel, FieldsChannel, PartialChannel}, + File, User, + }, + perms, ChannelPermission, Database, Error, Ref, Result, +}; use mongodb::bson::doc; use rocket::{serde::json::Json, State}; @@ -22,24 +28,63 @@ pub struct Data { } #[patch("/", data = "")] -pub async fn req(db: &State, user: User, target: Ref, data: Json) -> Result> { +pub async fn req( + db: &State, + user: User, + target: Ref, + data: Json, +) -> Result> { let data = data.into_inner(); - data.validate().map_err(|error| Error::FailedValidation { error })?; + data.validate() + .map_err(|error| Error::FailedValidation { error })?; let mut channel = target.as_channel(db).await?; - if !perms(&user).channel(&channel).calc_channel(db).await.get_manage_channel() { - return Err(Error::MissingPermission { permission: ChannelPermission::ManageChannel as i32 }) + if !perms(&user) + .channel(&channel) + .calc_channel(db) + .await + .get_manage_channel() + { + return Err(Error::MissingPermission { + permission: ChannelPermission::ManageChannel as i32, + }); } - if data.name.is_none() && data.description.is_none() && data.icon.is_none() && data.nsfw.is_none() && data.remove.is_none() { - return Ok(Json(channel)) + if data.name.is_none() + && data.description.is_none() + && data.icon.is_none() + && data.nsfw.is_none() + && data.remove.is_none() + { + return Ok(Json(channel)); } let mut partial: PartialChannel = Default::default(); match &mut channel { - Channel::Group { id, name, description, icon, nsfw, .. } - | Channel::TextChannel { id, name, description, icon, nsfw, .. } - | Channel::VoiceChannel { id, name, description, icon, nsfw, .. } => { + Channel::Group { + id, + name, + description, + icon, + nsfw, + .. + } + | Channel::TextChannel { + id, + name, + description, + icon, + nsfw, + .. + } + | Channel::VoiceChannel { + id, + name, + description, + icon, + nsfw, + .. + } => { if let Some(fields) = &data.remove { if fields.contains(&FieldsChannel::Icon) { if let Some(icon) = &icon { @@ -51,10 +96,10 @@ pub async fn req(db: &State, user: User, target: Ref, data: Json match field { FieldsChannel::Description => { description.take(); - }, + } FieldsChannel::Icon => { icon.take(); - }, + } _ => {} } } @@ -80,9 +125,10 @@ pub async fn req(db: &State, user: User, target: Ref, data: Json partial.nsfw = Some(new_nsfw); } - db.update_channel(id, &partial, data.remove.unwrap_or_default()).await?; - }, - _ => return Err(Error::InvalidOperation) + db.update_channel(id, &partial, data.remove.unwrap_or_default()) + .await?; + } + _ => return Err(Error::InvalidOperation), }; Ok(Json(channel)) diff --git a/src/routes/channels/channel_fetch.rs b/src/routes/channels/channel_fetch.rs index 066344bb..bce16ccd 100644 --- a/src/routes/channels/channel_fetch.rs +++ b/src/routes/channels/channel_fetch.rs @@ -1,4 +1,7 @@ -use revolt_quark::{Error, Result, models::{User, Channel}, Ref, Database, perms, ChannelPermission}; +use revolt_quark::{ + models::{Channel, User}, + perms, ChannelPermission, Database, Error, Ref, Result, +}; use rocket::{serde::json::Json, State}; @@ -6,9 +9,16 @@ use rocket::{serde::json::Json, State}; pub async fn req(db: &State, user: User, target: Ref) -> Result> { let target = target.as_channel(db).await?; - if perms(&user).channel(&target).calc_channel(db).await.get_view() { + if perms(&user) + .channel(&target) + .calc_channel(db) + .await + .get_view() + { Ok(Json(target)) } else { - Err(Error::MissingPermission { permission: ChannelPermission::View as i32 }) + Err(Error::MissingPermission { + permission: ChannelPermission::View as i32, + }) } } diff --git a/src/routes/channels/group_add_member.rs b/src/routes/channels/group_add_member.rs index 35bbfc77..81478430 100644 --- a/src/routes/channels/group_add_member.rs +++ b/src/routes/channels/group_add_member.rs @@ -3,6 +3,9 @@ use revolt_quark::{EmptyResponse, Result}; use mongodb::bson::doc; #[put("//recipients/")] -pub async fn req(/*user: UserRef, target: Ref, member: Ref*/ target: String, member: String) -> Result { +pub async fn req( + /*user: UserRef, target: Ref, member: Ref*/ target: String, + member: String, +) -> Result { todo!() } diff --git a/src/routes/channels/group_create.rs b/src/routes/channels/group_create.rs index caef99ec..6fccf6a2 100644 --- a/src/routes/channels/group_create.rs +++ b/src/routes/channels/group_create.rs @@ -1,8 +1,15 @@ -use revolt_quark::Result; +use std::{collections::HashSet, iter::FromIterator}; + +use revolt_quark::{ + get_relationship, + models::{user::RelationshipStatus, Channel, User}, + Db, Error, Result, +}; use mongodb::bson::doc; -use rocket::serde::json::{Json, Value}; +use rocket::serde::json::Json; use serde::{Deserialize, Serialize}; +use ulid::Ulid; use validator::Validate; #[derive(Validate, Serialize, Deserialize)] @@ -13,10 +20,48 @@ pub struct Data { description: Option, users: Vec, #[serde(skip_serializing_if = "Option::is_none")] - nsfw: Option + nsfw: Option, } #[post("/create", data = "")] -pub async fn req(/*_idempotency: IdempotencyKey, user: User,*/ info: Json) -> Result { - todo!(); +pub async fn req(db: &Db, user: User, info: Json) -> Result> { + let info = info.into_inner(); + info.validate() + .map_err(|error| Error::FailedValidation { error })?; + + let mut set: HashSet = HashSet::from_iter(info.users.into_iter()); + set.insert(user.id.clone()); + + // ! FIXME: un hard code this + if set.len() > 50 { + return Err(Error::GroupTooLarge { max: 50 }); + } + + for target in &set { + match get_relationship(&user, target) { + RelationshipStatus::Friend | RelationshipStatus::User => {} + _ => { + return Err(Error::NotFriends); + } + } + } + + let group = Channel::Group { + id: Ulid::new().to_string(), + + name: info.name, + owner: user.id, + description: info.description, + recipients: set.into_iter().collect::>(), + + icon: None, + last_message_id: None, + + permissions: None, + + nsfw: info.nsfw.unwrap_or(false), + }; + + db.insert_channel(&group).await?; + Ok(Json(group)) } diff --git a/src/routes/channels/group_remove_member.rs b/src/routes/channels/group_remove_member.rs index df746357..d0f90448 100644 --- a/src/routes/channels/group_remove_member.rs +++ b/src/routes/channels/group_remove_member.rs @@ -3,6 +3,9 @@ use revolt_quark::{EmptyResponse, Result}; use mongodb::bson::doc; #[delete("//recipients/")] -pub async fn req(/*user: UserRef, target: Ref, member: Ref*/ target: String, member: String) -> Result { +pub async fn req( + /*user: UserRef, target: Ref, member: Ref*/ target: String, + member: String, +) -> Result { todo!() } diff --git a/src/routes/channels/invite_create.rs b/src/routes/channels/invite_create.rs index 87b0c8ef..b2509752 100644 --- a/src/routes/channels/invite_create.rs +++ b/src/routes/channels/invite_create.rs @@ -1,17 +1,25 @@ -use revolt_quark::Result; +use revolt_quark::{ + models::{Invite, User}, + perms, ChannelPermission, Db, Error, Ref, Result, +}; use mongodb::bson::doc; -use rocket::serde::json::Value; - -lazy_static! { - static ref ALPHABET: [char; 54] = [ - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', - 'J', 'K', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', - 'e', 'f', 'g', 'h', 'j', 'k', 'm', 'n', 'p', 'q', 'r', 's', 't', 'v', 'w', 'x', 'y', 'z' - ]; -} +use rocket::serde::json::Json; #[post("//invites")] -pub async fn req(/*user: UserRef, target: Ref*/ target: String) -> Result { - todo!() +pub async fn req(db: &Db, user: User, target: Ref) -> Result> { + let channel = target.as_channel(db).await?; + + if !perms(&user) + .channel(&channel) + .calc_channel(db) + .await + .get_invite_others() + { + return Err(Error::MissingPermission { + permission: ChannelPermission::InviteOthers as i32, + }); + } + + Invite::create(db, &user, &channel).await.map(Json) } diff --git a/src/routes/channels/members_fetch.rs b/src/routes/channels/members_fetch.rs index 5c4a750f..c21f9985 100644 --- a/src/routes/channels/members_fetch.rs +++ b/src/routes/channels/members_fetch.rs @@ -1,8 +1,31 @@ -use revolt_quark::Result; +use revolt_quark::{ + models::{Channel, User}, + perms, Db, Error, Ref, Result, +}; -use rocket::serde::json::Value; +use rocket::serde::json::Json; #[get("//members")] -pub async fn req(/*user: UserRef, target: Ref*/ target: String) -> Result { - todo!() +pub async fn req(db: &Db, user: User, target: Ref) -> Result>> { + let channel = target.as_channel(db).await?; + if !perms(&user) + .channel(&channel) + .calc_channel(db) + .await + .get_view() + { + return Err(Error::NotFound); + } + + if let Channel::Group { recipients, .. } = channel { + Ok(Json( + db.fetch_users(&recipients) + .await? + .into_iter() + .map(|x| x.with_relationship(&user)) + .collect::>(), + )) + } else { + Err(Error::InvalidOperation) + } } diff --git a/src/routes/channels/message_delete.rs b/src/routes/channels/message_delete.rs index 09a21149..7bfbfd65 100644 --- a/src/routes/channels/message_delete.rs +++ b/src/routes/channels/message_delete.rs @@ -3,6 +3,9 @@ use revolt_quark::{EmptyResponse, Result}; use mongodb::bson::doc; #[delete("//messages/")] -pub async fn req(/*user: UserRef, target: Ref, msg: Ref*/ target: String, msg: String) -> Result { +pub async fn req( + /*user: UserRef, target: Ref, msg: Ref*/ target: String, + msg: String, +) -> Result { todo!() } diff --git a/src/routes/channels/message_edit.rs b/src/routes/channels/message_edit.rs index 62a22083..13e4d621 100644 --- a/src/routes/channels/message_edit.rs +++ b/src/routes/channels/message_edit.rs @@ -1,7 +1,7 @@ use revolt_quark::{EmptyResponse, Result}; use chrono::Utc; -use mongodb::bson::{Bson, Document, doc, to_document}; +use mongodb::bson::{doc, to_document, Bson, Document}; use rocket::serde::json::Json; use serde::{Deserialize, Serialize}; use validator::Validate; @@ -15,6 +15,10 @@ pub struct Data { } #[patch("//messages/", data = "")] -pub async fn req(/*user: UserRef, target: Ref, msg: Ref,*/ target: String, msg: String, edit: Json) -> Result { +pub async fn req( + /*user: UserRef, target: Ref, msg: Ref,*/ target: String, + msg: String, + edit: Json, +) -> Result { todo!() } diff --git a/src/routes/channels/message_fetch.rs b/src/routes/channels/message_fetch.rs index f705147c..47623a26 100644 --- a/src/routes/channels/message_fetch.rs +++ b/src/routes/channels/message_fetch.rs @@ -3,6 +3,9 @@ use revolt_quark::Result; use rocket::serde::json::Value; #[get("//messages/")] -pub async fn req(/*user: UserRef, target: Ref, msg: Ref*/ target: String, msg: String) -> Result { +pub async fn req( + /*user: UserRef, target: Ref, msg: Ref*/ target: String, + msg: String, +) -> Result { todo!() } diff --git a/src/routes/channels/message_query.rs b/src/routes/channels/message_query.rs index 47e12b44..1b1a824e 100644 --- a/src/routes/channels/message_query.rs +++ b/src/routes/channels/message_query.rs @@ -2,7 +2,7 @@ use std::collections::HashSet; use revolt_quark::{Error, Result}; -use futures::{StreamExt, try_join}; +use futures::{try_join, StreamExt}; use mongodb::{ bson::{doc, from_document}, options::FindOptions, @@ -35,6 +35,9 @@ pub struct Options { } #[get("//messages?")] -pub async fn req(/*user: UserRef, target: Ref,*/ target: String, options: Options) -> Result { +pub async fn req( + /*user: UserRef, target: Ref,*/ target: String, + options: Options, +) -> Result { todo!() } diff --git a/src/routes/channels/message_query_stale.rs b/src/routes/channels/message_query_stale.rs index 40c282cb..ad16747c 100644 --- a/src/routes/channels/message_query_stale.rs +++ b/src/routes/channels/message_query_stale.rs @@ -11,6 +11,9 @@ pub struct Options { } #[post("//messages/stale", data = "")] -pub async fn req(/*user: UserRef, target: Ref,*/ target: String, data: Json) -> Result { +pub async fn req( + /*user: UserRef, target: Ref,*/ target: String, + data: Json, +) -> Result { todo!() } diff --git a/src/routes/channels/message_search.rs b/src/routes/channels/message_search.rs index 5f3dcbaf..6b86804f 100644 --- a/src/routes/channels/message_search.rs +++ b/src/routes/channels/message_search.rs @@ -39,6 +39,9 @@ pub struct Options { } #[post("//search", data = "")] -pub async fn req(/*user: UserRef, target: Ref,*/ target: String, options: Json) -> Result { +pub async fn req( + /*user: UserRef, target: Ref,*/ target: String, + options: Json, +) -> Result { todo!() } diff --git a/src/routes/channels/message_send.rs b/src/routes/channels/message_send.rs index 23b885ac..27e85f43 100644 --- a/src/routes/channels/message_send.rs +++ b/src/routes/channels/message_send.rs @@ -1,4 +1,4 @@ -use revolt_quark::{Result, models::message::Masquerade}; +use revolt_quark::{models::message::Masquerade, Result}; use mongodb::bson::doc; use regex::Regex; @@ -9,7 +9,7 @@ use validator::Validate; #[derive(Serialize, Deserialize)] pub struct Reply { id: String, - mention: bool + mention: bool, } #[derive(Validate, Serialize, Deserialize, Clone, Debug)] @@ -21,7 +21,7 @@ pub struct SendableEmbed { #[validate(length(min = 1, max = 2000))] description: Option, media: Option, - colour: Option, + colour: Option, } #[derive(Validate, Serialize, Deserialize)] pub struct Data { @@ -34,7 +34,7 @@ pub struct Data { //#[validate] masquerade: Option, #[validate(length(min = 1, max = 10))] - embeds: Option> + embeds: Option>, } lazy_static! { @@ -43,6 +43,10 @@ lazy_static! { } #[post("//messages", data = "")] -pub async fn message_send(/*user: UserRef, _r: Ratelimiter, mut idempotency: IdempotencyKey, target: Ref,*/ target: String, message: Json) -> /*Result>*/ Result { +pub async fn message_send( + /*user: UserRef, _r: Ratelimiter, mut idempotency: IdempotencyKey, target: Ref,*/ + target: String, + message: Json, +) -> Result { todo!() } diff --git a/src/routes/channels/mod.rs b/src/routes/channels/mod.rs index 84918219..62dffe3f 100644 --- a/src/routes/channels/mod.rs +++ b/src/routes/channels/mod.rs @@ -4,21 +4,21 @@ mod channel_ack; mod channel_delete; mod channel_edit; mod channel_fetch; -mod members_fetch; mod group_add_member; mod group_create; mod group_remove_member; mod invite_create; -mod voice_join; +mod members_fetch; mod message_delete; mod message_edit; mod message_fetch; mod message_query; -mod message_search; mod message_query_stale; +mod message_search; mod message_send; mod permissions_set; mod permissions_set_default; +mod voice_join; pub fn routes() -> Vec { routes![ diff --git a/src/routes/channels/permissions_set.rs b/src/routes/channels/permissions_set.rs index 642cf954..c4a1c17c 100644 --- a/src/routes/channels/permissions_set.rs +++ b/src/routes/channels/permissions_set.rs @@ -1,16 +1,44 @@ use mongodb::bson::doc; use rocket::serde::json::Json; -use serde::{Serialize, Deserialize}; -use validator::Contains; +use serde::{Deserialize, Serialize}; -use revolt_quark::{EmptyResponse, Result}; +use revolt_quark::{ + models::{Channel, User}, + perms, ChannelPermission, Db, EmptyResponse, Error, Ref, Result, +}; #[derive(Serialize, Deserialize)] pub struct Data { - permissions: u32 + permissions: u32, } #[put("//permissions/", data = "", rank = 2)] -pub async fn req(/*user: UserRef, target: Ref,*/ target: String, role: String, data: Json) -> Result { - todo!() +pub async fn req( + db: &Db, + user: User, + target: Ref, + role: String, + data: Json, +) -> Result { + let channel = target.as_channel(db).await?; + if !perms(&user) + .channel(&channel) + .calc_channel(db) + .await + .get_manage_channel() + { + return Err(Error::MissingPermission { + permission: ChannelPermission::ManageChannel as i32, + }); + } + + match channel { + Channel::TextChannel { id, .. } | Channel::VoiceChannel { id, .. } => { + db.set_channel_role_permission(&id, &role, data.permissions) + .await?; + } + _ => return Err(Error::InvalidOperation), + } + + Ok(EmptyResponse) } diff --git a/src/routes/channels/permissions_set_default.rs b/src/routes/channels/permissions_set_default.rs index 73b00e92..8b70869e 100644 --- a/src/routes/channels/permissions_set_default.rs +++ b/src/routes/channels/permissions_set_default.rs @@ -1,15 +1,56 @@ use mongodb::bson::doc; use rocket::serde::json::Json; -use serde::{Serialize, Deserialize}; +use serde::{Deserialize, Serialize}; -use revolt_quark::{EmptyResponse, Result}; +use revolt_quark::{ + models::{channel::PartialChannel, Channel, User}, + perms, ChannelPermission, Db, EmptyResponse, Error, Ref, Result, +}; #[derive(Serialize, Deserialize)] pub struct Data { - permissions: u32 + permissions: u32, } #[put("//permissions/default", data = "", rank = 1)] -pub async fn req(/*user: UserRef, target: Ref,*/ target: String, data: Json) -> Result { - todo!() +pub async fn req(db: &Db, user: User, target: Ref, data: Json) -> Result { + let channel = target.as_channel(db).await?; + if !perms(&user) + .channel(&channel) + .calc_channel(db) + .await + .get_manage_channel() + { + return Err(Error::MissingPermission { + permission: ChannelPermission::ManageChannel as i32, + }); + } + + match channel { + Channel::Group { id, .. } => { + db.update_channel( + &id, + &PartialChannel { + permissions: Some(data.permissions as i32), + ..Default::default() + }, + vec![], + ) + .await?; + } + Channel::TextChannel { id, .. } | Channel::VoiceChannel { id, .. } => { + db.update_channel( + &id, + &PartialChannel { + default_permissions: Some(data.permissions as i32), + ..Default::default() + }, + vec![], + ) + .await?; + } + _ => return Err(Error::InvalidOperation), + } + + Ok(EmptyResponse) } diff --git a/src/routes/invites/invite_fetch.rs b/src/routes/invites/invite_fetch.rs index fdb64a25..2fc12883 100644 --- a/src/routes/invites/invite_fetch.rs +++ b/src/routes/invites/invite_fetch.rs @@ -1,5 +1,5 @@ -use revolt_quark::Result; use revolt_quark::models::File; +use revolt_quark::Result; use rocket::serde::json::Value; use serde::Serialize; diff --git a/src/routes/onboard/complete.rs b/src/routes/onboard/complete.rs index bc0fabef..25fc13bc 100644 --- a/src/routes/onboard/complete.rs +++ b/src/routes/onboard/complete.rs @@ -1,5 +1,5 @@ -use revolt_quark::{EmptyResponse, Error, Result, models::User, Database}; use crate::util::regex::RE_USERNAME; +use revolt_quark::{models::User, Database, EmptyResponse, Error, Result}; use mongodb::bson::doc; use rauth::entities::Session; @@ -14,9 +14,14 @@ pub struct Data { } #[post("/complete", data = "")] -pub async fn req(db: &State, session: Session, user: Option, data: Json) -> Result { +pub async fn req( + db: &State, + session: Session, + user: Option, + data: Json, +) -> Result { if user.is_some() { - return Err(Error::AlreadyOnboarded) + return Err(Error::AlreadyOnboarded); } let data = data.into_inner(); @@ -33,7 +38,5 @@ pub async fn req(db: &State, session: Session, user: Option, dat ..Default::default() }; - db.insert_user(&user) - .await - .map(|_| EmptyResponse) + db.insert_user(&user).await.map(|_| EmptyResponse) } diff --git a/src/routes/push/subscribe.rs b/src/routes/push/subscribe.rs index 3c44bfc0..aa582858 100644 --- a/src/routes/push/subscribe.rs +++ b/src/routes/push/subscribe.rs @@ -5,6 +5,7 @@ use rauth::entities::{Model, Session, WebPushSubscription}; use rocket::serde::json::Json; #[post("/subscribe"/*, data = ""*/)] -pub async fn req(/*mut session: Session, data: Json*/) -> Result { +pub async fn req(/*mut session: Session, data: Json*/) -> Result +{ todo!() } diff --git a/src/routes/servers/ban_create.rs b/src/routes/servers/ban_create.rs index 0177dc58..5cc8e75e 100644 --- a/src/routes/servers/ban_create.rs +++ b/src/routes/servers/ban_create.rs @@ -12,6 +12,10 @@ pub struct Data { } #[put("//bans/", data = "")] -pub async fn req(/*user: UserRef, server: Ref, target: Ref,*/ server: String, target: String, data: Json) -> Result { +pub async fn req( + /*user: UserRef, server: Ref, target: Ref,*/ server: String, + target: String, + data: Json, +) -> Result { todo!() } diff --git a/src/routes/servers/ban_list.rs b/src/routes/servers/ban_list.rs index 993fb252..252b4536 100644 --- a/src/routes/servers/ban_list.rs +++ b/src/routes/servers/ban_list.rs @@ -1,17 +1,17 @@ -use revolt_quark::{Error, Result}; use revolt_quark::models::File; +use revolt_quark::{Error, Result}; use futures::StreamExt; -use mongodb::options::FindOptions; -use serde::{Serialize, Deserialize}; -use rocket::serde::json::Value; use mongodb::bson::{doc, from_document}; +use mongodb::options::FindOptions; +use rocket::serde::json::Value; +use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize)] struct BannedUser { _id: String, username: String, - avatar: Option + avatar: Option, } #[get("//bans")] diff --git a/src/routes/servers/ban_remove.rs b/src/routes/servers/ban_remove.rs index b9757c30..2ed8642c 100644 --- a/src/routes/servers/ban_remove.rs +++ b/src/routes/servers/ban_remove.rs @@ -3,6 +3,9 @@ use revolt_quark::{EmptyResponse, Result}; use mongodb::bson::doc; #[delete("//bans/")] -pub async fn req(/*user: UserRef, server: Ref, target: Ref*/ server: String, target: String) -> Result { +pub async fn req( + /*user: UserRef, server: Ref, target: Ref*/ server: String, + target: String, +) -> Result { todo!() } diff --git a/src/routes/servers/channel_create.rs b/src/routes/servers/channel_create.rs index e74bdecf..338bb47c 100644 --- a/src/routes/servers/channel_create.rs +++ b/src/routes/servers/channel_create.rs @@ -11,7 +11,7 @@ use validator::Validate; #[derive(Serialize, Deserialize)] enum ChannelType { Text, - Voice + Voice, } impl Default for ChannelType { @@ -33,6 +33,9 @@ pub struct Data { } #[post("//channels", data = "")] -pub async fn req(/*_idempotency: IdempotencyKey, user: User, target: Ref,*/ target: String, info: Json) -> Result { +pub async fn req( + /*_idempotency: IdempotencyKey, user: User, target: Ref,*/ target: String, + info: Json, +) -> Result { todo!() } diff --git a/src/routes/servers/member_edit.rs b/src/routes/servers/member_edit.rs index 71f42271..9e0914fd 100644 --- a/src/routes/servers/member_edit.rs +++ b/src/routes/servers/member_edit.rs @@ -1,4 +1,4 @@ -use revolt_quark::{EmptyResponse, Result, models::server_member::FieldsMember}; +use revolt_quark::{models::server_member::FieldsMember, EmptyResponse, Result}; use rocket::serde::json::Json; use serde::{Deserialize, Serialize}; @@ -14,6 +14,10 @@ pub struct Data { } #[patch("//members/", data = "")] -pub async fn req(/*user: UserRef, server: Ref,*/ server: String, target: String, data: Json) -> Result { +pub async fn req( + /*user: UserRef, server: Ref,*/ server: String, + target: String, + data: Json, +) -> Result { todo!() } diff --git a/src/routes/servers/member_fetch.rs b/src/routes/servers/member_fetch.rs index dbcc3b33..045d8e82 100644 --- a/src/routes/servers/member_fetch.rs +++ b/src/routes/servers/member_fetch.rs @@ -4,6 +4,9 @@ use mongodb::bson::doc; use rocket::serde::json::Value; #[get("//members/")] -pub async fn req(/*user: UserRef, target: Ref,*/ target: String, member: String) -> Result { +pub async fn req( + /*user: UserRef, target: Ref,*/ target: String, + member: String, +) -> Result { todo!() } diff --git a/src/routes/servers/member_remove.rs b/src/routes/servers/member_remove.rs index 884f4525..bc3a114f 100644 --- a/src/routes/servers/member_remove.rs +++ b/src/routes/servers/member_remove.rs @@ -3,6 +3,9 @@ use revolt_quark::{EmptyResponse, Result}; use mongodb::bson::doc; #[delete("//members/")] -pub async fn req(/*user: UserRef, target: Ref,*/ target: String, member: String) -> Result { +pub async fn req( + /*user: UserRef, target: Ref,*/ target: String, + member: String, +) -> Result { todo!() } diff --git a/src/routes/servers/mod.rs b/src/routes/servers/mod.rs index 4c455d9f..56a16a57 100644 --- a/src/routes/servers/mod.rs +++ b/src/routes/servers/mod.rs @@ -1,10 +1,10 @@ use rocket::Route; +mod server_ack; mod server_create; mod server_delete; mod server_edit; mod server_fetch; -mod server_ack; mod channel_create; @@ -19,11 +19,11 @@ mod ban_remove; mod invites_fetch; -mod roles_create; -mod roles_edit; -mod roles_delete; mod permissions_set; mod permissions_set_default; +mod roles_create; +mod roles_delete; +mod roles_edit; pub fn routes() -> Vec { routes![ diff --git a/src/routes/servers/permissions_set.rs b/src/routes/servers/permissions_set.rs index 6ed51459..df0b3950 100644 --- a/src/routes/servers/permissions_set.rs +++ b/src/routes/servers/permissions_set.rs @@ -1,21 +1,25 @@ use mongodb::bson::doc; use rocket::serde::json::Json; -use serde::{Serialize, Deserialize}; +use serde::{Deserialize, Serialize}; use revolt_quark::{EmptyResponse, Result}; #[derive(Serialize, Deserialize)] pub struct Values { server: u32, - channel: u32 + channel: u32, } #[derive(Serialize, Deserialize)] pub struct Data { - permissions: Values + permissions: Values, } #[put("//permissions/", data = "", rank = 2)] -pub async fn req(/*user: UserRef, target: Ref,*/ target: String, role_id: String, data: Json) -> Result { +pub async fn req( + /*user: UserRef, target: Ref,*/ target: String, + role_id: String, + data: Json, +) -> Result { todo!() } diff --git a/src/routes/servers/permissions_set_default.rs b/src/routes/servers/permissions_set_default.rs index 8f54def5..8db31493 100644 --- a/src/routes/servers/permissions_set_default.rs +++ b/src/routes/servers/permissions_set_default.rs @@ -1,21 +1,24 @@ use mongodb::bson::doc; use rocket::serde::json::Json; -use serde::{Serialize, Deserialize}; +use serde::{Deserialize, Serialize}; use revolt_quark::{EmptyResponse, Result}; #[derive(Serialize, Deserialize)] pub struct Values { server: u32, - channel: u32 + channel: u32, } #[derive(Serialize, Deserialize)] pub struct Data { - permissions: Values + permissions: Values, } #[put("//permissions/default", data = "", rank = 1)] -pub async fn req(/*user: UserRef, target: Ref,*/ target: String, data: Json) -> Result { +pub async fn req( + /*user: UserRef, target: Ref,*/ target: String, + data: Json, +) -> Result { todo!() } diff --git a/src/routes/servers/roles_create.rs b/src/routes/servers/roles_create.rs index 39bac660..b81420e4 100644 --- a/src/routes/servers/roles_create.rs +++ b/src/routes/servers/roles_create.rs @@ -1,18 +1,21 @@ use revolt_quark::{Error, Result}; -use ulid::Ulid; use mongodb::bson::doc; -use validator::Validate; -use serde::{Serialize, Deserialize}; use rocket::serde::json::{Json, Value}; +use serde::{Deserialize, Serialize}; +use ulid::Ulid; +use validator::Validate; #[derive(Validate, Serialize, Deserialize)] pub struct Data { #[validate(length(min = 1, max = 32))] - name: String + name: String, } #[post("//roles", data = "")] -pub async fn req(/*user: UserRef, target: Ref,*/ target: String, data: Json) -> Result { +pub async fn req( + /*user: UserRef, target: Ref,*/ target: String, + data: Json, +) -> Result { todo!() } diff --git a/src/routes/servers/roles_delete.rs b/src/routes/servers/roles_delete.rs index 04a3379c..520914fe 100644 --- a/src/routes/servers/roles_delete.rs +++ b/src/routes/servers/roles_delete.rs @@ -1,6 +1,9 @@ use revolt_quark::{EmptyResponse, Result}; #[delete("//roles/")] -pub async fn req(/*user: UserRef, target: Ref,*/ target: String, role_id: String) -> Result { +pub async fn req( + /*user: UserRef, target: Ref,*/ target: String, + role_id: String, +) -> Result { todo!() } diff --git a/src/routes/servers/roles_edit.rs b/src/routes/servers/roles_edit.rs index a2d40fd3..6a0201c7 100644 --- a/src/routes/servers/roles_edit.rs +++ b/src/routes/servers/roles_edit.rs @@ -17,6 +17,10 @@ pub struct Data { } #[patch("//roles/", data = "")] -pub async fn req(/*user: UserRef, target: Ref,*/ target: String, role_id: String, data: Json) -> Result { +pub async fn req( + /*user: UserRef, target: Ref,*/ target: String, + role_id: String, + data: Json, +) -> Result { todo!() } diff --git a/src/routes/servers/server_create.rs b/src/routes/servers/server_create.rs index 10c6f8f3..071d1cbb 100644 --- a/src/routes/servers/server_create.rs +++ b/src/routes/servers/server_create.rs @@ -15,10 +15,10 @@ pub struct Data { #[validate(length(min = 0, max = 1024))] description: Option, #[serde(skip_serializing_if = "Option::is_none")] - nsfw: Option + nsfw: Option, } #[post("/create", data = "")] -pub async fn req(/*_idempotency: IdempotencyKey, user: User,*/ info: Json) -> Result { +pub async fn req(/*_idempotency: IdempotencyKey, user: User,*/ info: Json,) -> Result { todo!() } diff --git a/src/routes/servers/server_edit.rs b/src/routes/servers/server_edit.rs index 386215e4..bf168010 100644 --- a/src/routes/servers/server_edit.rs +++ b/src/routes/servers/server_edit.rs @@ -1,4 +1,7 @@ -use revolt_quark::{EmptyResponse, Result, models::server::{FieldsServer, SystemMessageChannels, Category}}; +use revolt_quark::{ + models::server::{Category, FieldsServer, SystemMessageChannels}, + EmptyResponse, Result, +}; use rocket::serde::json::Json; use serde::{Deserialize, Serialize}; @@ -20,6 +23,9 @@ pub struct Data { } #[patch("/", data = "")] -pub async fn req(/*user: UserRef, target: Ref,*/ target: String, data: Json) -> Result { +pub async fn req( + /*user: UserRef, target: Ref,*/ target: String, + data: Json, +) -> Result { todo!() } diff --git a/src/routes/sync/set_settings.rs b/src/routes/sync/set_settings.rs index d8063cb3..9dee7548 100644 --- a/src/routes/sync/set_settings.rs +++ b/src/routes/sync/set_settings.rs @@ -16,6 +16,9 @@ pub struct Options { } #[post("/settings/set?", data = "")] -pub async fn req(/*user: UserRef,*/ data: Json, options: Options) -> Result { +pub async fn req( + /*user: UserRef,*/ data: Json, + options: Options, +) -> Result { todo!() } diff --git a/src/routes/users/add_friend.rs b/src/routes/users/add_friend.rs index 02d4a77a..df13e616 100644 --- a/src/routes/users/add_friend.rs +++ b/src/routes/users/add_friend.rs @@ -1,9 +1,9 @@ use revolt_quark::models::User; -use revolt_quark::{Result, Database}; +use revolt_quark::{Database, Result}; use mongodb::bson::doc; -use rocket::State; use rocket::serde::json::Json; +use rocket::State; #[put("//friend")] pub async fn req(db: &State, user: User, username: String) -> Result> { diff --git a/src/routes/users/block_user.rs b/src/routes/users/block_user.rs index cf624cd5..b4793a8b 100644 --- a/src/routes/users/block_user.rs +++ b/src/routes/users/block_user.rs @@ -1,9 +1,9 @@ use revolt_quark::models::User; -use revolt_quark::{Result, Database}; +use revolt_quark::{Database, Result}; use mongodb::bson::doc; -use rocket::State; use rocket::serde::json::Json; +use rocket::State; #[put("//block")] pub async fn req(db: &State, user: User, username: String) -> Result> { diff --git a/src/routes/users/change_username.rs b/src/routes/users/change_username.rs index 65169ed5..e44683b3 100644 --- a/src/routes/users/change_username.rs +++ b/src/routes/users/change_username.rs @@ -1,7 +1,7 @@ -use revolt_quark::{Error, EmptyResponse, Result, models::User, Database}; use crate::util::regex::RE_USERNAME; use mongodb::bson::doc; use rauth::entities::Account; +use revolt_quark::{models::User, Database, EmptyResponse, Error, Result}; use rocket::{serde::json::Json, State}; use serde::{Deserialize, Serialize}; use validator::Validate; @@ -22,6 +22,10 @@ pub async fn req( data: Json, ) -> Result { let data = data.into_inner(); - account.verify_password(&data.password).map_err(|_| Error::InvalidCredentials)?; - user.update_username(db, data.username).await.map(|_| EmptyResponse) + account + .verify_password(&data.password) + .map_err(|_| Error::InvalidCredentials)?; + user.update_username(db, data.username) + .await + .map(|_| EmptyResponse) } diff --git a/src/routes/users/edit_user.rs b/src/routes/users/edit_user.rs index b5734497..29542d3a 100644 --- a/src/routes/users/edit_user.rs +++ b/src/routes/users/edit_user.rs @@ -1,13 +1,13 @@ //! Edit currently authenticated user. +use revolt_quark::models::user::{FieldsUser, PartialUser, User}; use revolt_quark::models::File; -use revolt_quark::{Error, Result, Database}; -use revolt_quark::models::user::{FieldsUser, User, PartialUser}; +use revolt_quark::{Database, Error, Result}; use mongodb::bson::doc; use revolt_quark::models::user::UserStatus; -use rocket::State; use rocket::serde::json::Json; +use rocket::State; use serde::{Deserialize, Serialize}; use validator::Validate; @@ -36,10 +36,15 @@ pub struct Data { #[patch("/@me", data = "")] pub async fn req(db: &State, mut user: User, data: Json) -> Result> { let data = data.into_inner(); - data.validate().map_err(|error| Error::FailedValidation { error })?; + data.validate() + .map_err(|error| Error::FailedValidation { error })?; - if data.status.is_none() && data.profile.is_none() && data.avatar.is_none() && data.remove.is_none() { - return Ok(Json(user)) + if data.status.is_none() + && data.profile.is_none() + && data.avatar.is_none() + && data.remove.is_none() + { + return Ok(Json(user)); } if let Some(fields) = &data.remove { @@ -97,6 +102,7 @@ pub async fn req(db: &State, mut user: User, data: Json) -> Resu user.profile = partial.profile.clone(); } - db.update_user(&user.id, &partial, data.remove.unwrap_or_default()).await?; + db.update_user(&user.id, &partial, data.remove.unwrap_or_default()) + .await?; Ok(Json(user.foreign())) } diff --git a/src/routes/users/fetch_dms.rs b/src/routes/users/fetch_dms.rs index dce5f83a..29737c46 100644 --- a/src/routes/users/fetch_dms.rs +++ b/src/routes/users/fetch_dms.rs @@ -1,8 +1,11 @@ //! Fetch direct messages that the current user is involved in -//! +//! //! This includes group DMs and "active" 1:1 DMs. -use revolt_quark::{Result, models::{Channel, User}, Database}; +use revolt_quark::{ + models::{Channel, User}, + Database, Result, +}; use mongodb::bson::doc; use rocket::{serde::json::Json, State}; diff --git a/src/routes/users/fetch_profile.rs b/src/routes/users/fetch_profile.rs index aa25d293..818294c2 100644 --- a/src/routes/users/fetch_profile.rs +++ b/src/routes/users/fetch_profile.rs @@ -1,9 +1,12 @@ //! Fetch another user's profile -//! +//! //! Will fail if the authenticated user does not //! have permission to access the other user's profile. -use revolt_quark::{Ref, Result, Error, models::{User, user::UserProfile}, perms, Database}; +use revolt_quark::{ + models::{user::UserProfile, User}, + perms, Database, Error, Ref, Result, +}; use rocket::{serde::json::Json, State}; @@ -11,7 +14,12 @@ use rocket::{serde::json::Json, State}; pub async fn req(db: &State, user: User, target: Ref) -> Result> { let target = target.as_user(db).await?; - if perms(&user).user(&target).calc_user(db).await.get_view_profile() { + if perms(&user) + .user(&target) + .calc_user(db) + .await + .get_view_profile() + { Ok(Json(target.profile.unwrap_or_default())) } else { Err(Error::NotFound) diff --git a/src/routes/users/fetch_self.rs b/src/routes/users/fetch_self.rs index c683ffaa..daecd9b1 100755 --- a/src/routes/users/fetch_self.rs +++ b/src/routes/users/fetch_self.rs @@ -1,11 +1,11 @@ -//! Fetch the currently authenticated session's user account - -use revolt_quark::Result; -use revolt_quark::models::User; - -use rocket::serde::json::Json; - -#[get("/@me")] -pub async fn req(user: User) -> Result> { - Ok(Json(user.foreign())) -} +//! Fetch the currently authenticated session's user account + +use revolt_quark::models::User; +use revolt_quark::Result; + +use rocket::serde::json::Json; + +#[get("/@me")] +pub async fn req(user: User) -> Result> { + Ok(Json(user.foreign())) +} diff --git a/src/routes/users/fetch_user.rs b/src/routes/users/fetch_user.rs index 2422dd01..411c4745 100644 --- a/src/routes/users/fetch_user.rs +++ b/src/routes/users/fetch_user.rs @@ -1,16 +1,16 @@ //! Fetch another user -//! +//! //! Will fail if the authenticated user does not //! have permission to access the other user. -use revolt_quark::{Ref, Result, Error, models::User, perms, Database}; +use revolt_quark::{models::User, perms, Database, Error, Ref, Result}; use rocket::{serde::json::Json, State}; #[get("/")] pub async fn req(db: &State, user: User, target: Ref) -> Result> { let target = target.as_user(db).await?; - + let permissions = perms(&user).user(&target).calc_user(db).await; if permissions.get_access() { Ok(Json(target.with_perspective(&user, &permissions))) diff --git a/src/routes/users/find_mutual.rs b/src/routes/users/find_mutual.rs index 654b0345..59750ef6 100644 --- a/src/routes/users/find_mutual.rs +++ b/src/routes/users/find_mutual.rs @@ -2,16 +2,21 @@ //! authenticated user and the target user use revolt_quark::models::User; -use revolt_quark::{Error, Result, perms, Database, Ref}; +use revolt_quark::{perms, Database, Error, Ref, Result}; -use rocket::State; use rocket::serde::json::Value; +use rocket::State; #[get("//mutual")] pub async fn req(db: &State, user: User, target: Ref) -> Result { let target = target.as_user(db).await?; - if perms(&user).user(&target).calc_user(db).await.get_view_profile() { + if perms(&user) + .user(&target) + .calc_user(db) + .await + .get_view_profile() + { Ok(json!({ "users": db.fetch_mutual_user_ids(&user.id, &target.id).await?, "servers": db.fetch_mutual_server_ids(&user.id, &target.id).await? diff --git a/src/routes/users/get_default_avatar.rs b/src/routes/users/get_default_avatar.rs index b30c61ba..766e42f2 100644 --- a/src/routes/users/get_default_avatar.rs +++ b/src/routes/users/get_default_avatar.rs @@ -1,6 +1,6 @@ -use rocket::{Request, Response}; -use rocket::response::{self, Responder}; use rocket::fs::NamedFile; +use rocket::response::{self, Responder}; +use rocket::{Request, Response}; use std::path::Path; pub struct CachedFile(NamedFile); @@ -19,22 +19,28 @@ impl<'r> Responder<'r, 'static> for CachedFile { pub async fn req(target: String) -> Option { match target.chars().nth(25).unwrap() { '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' => { - NamedFile::open(Path::new("assets/user_red.png")).await.ok().map(CachedFile) + NamedFile::open(Path::new("assets/user_red.png")) + .await + .ok() + .map(CachedFile) } '8' | '9' | 'A' | 'C' | 'B' | 'D' | 'E' | 'F' => { NamedFile::open(Path::new("assets/user_green.png")) .await - .ok().map(CachedFile) + .ok() + .map(CachedFile) } 'G' | 'H' | 'J' | 'K' | 'M' | 'N' | 'P' | 'Q' => { NamedFile::open(Path::new("assets/user_blue.png")) .await - .ok().map(CachedFile) + .ok() + .map(CachedFile) } 'R' | 'S' | 'T' | 'V' | 'W' | 'X' | 'Y' | 'Z' => { NamedFile::open(Path::new("assets/user_yellow.png")) .await - .ok().map(CachedFile) + .ok() + .map(CachedFile) } _ => unreachable!(), } diff --git a/src/routes/users/mod.rs b/src/routes/users/mod.rs index 084267ab..1c34fe2c 100644 --- a/src/routes/users/mod.rs +++ b/src/routes/users/mod.rs @@ -6,13 +6,13 @@ mod change_username; mod edit_user; mod fetch_dms; mod fetch_profile; +mod fetch_self; mod fetch_user; mod find_mutual; mod get_default_avatar; mod open_dm; mod remove_friend; mod unblock_user; -mod fetch_self; pub fn routes() -> Vec { routes![ diff --git a/src/routes/users/open_dm.rs b/src/routes/users/open_dm.rs index 8f40d0e7..653acf78 100644 --- a/src/routes/users/open_dm.rs +++ b/src/routes/users/open_dm.rs @@ -1,9 +1,12 @@ //! Open a direct message with another user -use revolt_quark::{Error, Result, Ref, models::{User, Channel}, Database, perms, UserPermission}; +use revolt_quark::{ + models::{Channel, User}, + perms, Database, Error, Ref, Result, UserPermission, +}; use mongodb::bson::doc; -use rocket::{State, serde::json::Json}; +use rocket::{serde::json::Json, State}; use ulid::Ulid; #[get("//dm")] @@ -12,14 +15,16 @@ pub async fn req(db: &State, user: User, target: Ref) -> Result/friend")] pub async fn req(db: &State, user: User, username: String) -> Result> { diff --git a/src/routes/users/unblock_user.rs b/src/routes/users/unblock_user.rs index 704ccf1f..2e15eaf0 100644 --- a/src/routes/users/unblock_user.rs +++ b/src/routes/users/unblock_user.rs @@ -1,9 +1,9 @@ use revolt_quark::models::User; -use revolt_quark::{Result, Database}; +use revolt_quark::{Database, Result}; use mongodb::bson::doc; -use rocket::State; use rocket::serde::json::Json; +use rocket::State; #[delete("//block")] pub async fn req(db: &State, user: User, username: String) -> Result> { diff --git a/src/util/mod.rs b/src/util/mod.rs index 66938753..cf3e7364 100644 --- a/src/util/mod.rs +++ b/src/util/mod.rs @@ -2,4 +2,4 @@ // pub mod variables; // pub mod ratelimit; pub mod regex; -// pub mod idempotency; \ No newline at end of file +// pub mod idempotency;