diff --git a/crates/core/database/src/models/users/model.rs b/crates/core/database/src/models/users/model.rs index b5cd7379..59a79c54 100644 --- a/crates/core/database/src/models/users/model.rs +++ b/crates/core/database/src/models/users/model.rs @@ -348,19 +348,6 @@ impl User { } } - /// Check whether a username is already in use by another user - #[allow(dead_code)] - async fn is_username_taken(db: &Database, username: &str) -> Result { - match db.fetch_user_by_username(username).await { - Ok(_) => Ok(true), - Err(Error { - error_type: ErrorType::NotFound, - .. - }) => Ok(false), - Err(error) => Err(error), - } - } - /// Set a relationship to another user pub async fn set_relationship( &mut self, diff --git a/crates/core/database/src/models/users/ops.rs b/crates/core/database/src/models/users/ops.rs index a07ceb87..58247d26 100644 --- a/crates/core/database/src/models/users/ops.rs +++ b/crates/core/database/src/models/users/ops.rs @@ -14,7 +14,7 @@ pub trait AbstractUsers: Sync + Send { async fn fetch_user(&self, id: &str) -> Result; /// Fetch a user from the database by their username - async fn fetch_user_by_username(&self, username: &str) -> Result; + async fn fetch_user_by_username(&self, username: &str, discriminator: &str) -> Result; /// Fetch a user from the database by their session token async fn fetch_user_by_token(&self, token: &str) -> Result; diff --git a/crates/core/database/src/models/users/ops/mongodb.rs b/crates/core/database/src/models/users/ops/mongodb.rs index 9212c806..7105c94b 100644 --- a/crates/core/database/src/models/users/ops/mongodb.rs +++ b/crates/core/database/src/models/users/ops/mongodb.rs @@ -25,13 +25,14 @@ impl AbstractUsers for MongoDb { } /// Fetch a user from the database by their username - async fn fetch_user_by_username(&self, username: &str) -> Result { + async fn fetch_user_by_username(&self, username: &str, discriminator: &str) -> Result { query!( self, find_one_with_options, COL, doc! { - "username": username + "username": username, + "discriminator": discriminator }, FindOneOptions::builder() .collation( diff --git a/crates/core/database/src/models/users/ops/reference.rs b/crates/core/database/src/models/users/ops/reference.rs index 6b8dce31..4c2d4e7d 100644 --- a/crates/core/database/src/models/users/ops/reference.rs +++ b/crates/core/database/src/models/users/ops/reference.rs @@ -28,12 +28,14 @@ impl AbstractUsers for ReferenceDb { } /// Fetch a user from the database by their username - async fn fetch_user_by_username(&self, username: &str) -> Result { + async fn fetch_user_by_username(&self, username: &str, discriminator: &str) -> Result { let users = self.users.lock().await; let lowercase = username.to_lowercase(); users .values() - .find(|user| user.username.to_lowercase() == lowercase) + .find(|user| { + user.username.to_lowercase() == lowercase && user.discriminator == discriminator + }) .cloned() .ok_or_else(|| create_error!(NotFound)) } diff --git a/crates/core/models/src/v0/users.rs b/crates/core/models/src/v0/users.rs index 07959ccf..a90bbed4 100644 --- a/crates/core/models/src/v0/users.rs +++ b/crates/core/models/src/v0/users.rs @@ -188,6 +188,12 @@ auto_derived!( #[cfg_attr(feature = "serde", serde(rename = "owner"))] pub owner_id: String, } + + /// User lookup information + pub struct DataSendFriendRequest { + /// Username and discriminator combo separated by # + pub username: String, + } ); pub trait CheckRelationship { diff --git a/crates/delta/src/routes/users/add_friend.rs b/crates/delta/src/routes/users/add_friend.rs index 9d4b178c..f544c766 100644 --- a/crates/delta/src/routes/users/add_friend.rs +++ b/crates/delta/src/routes/users/add_friend.rs @@ -1,6 +1,7 @@ -use revolt_quark::models::User; -use revolt_quark::{Database, Error, Ref, Result}; - +use revolt_database::util::reference::Reference; +use revolt_database::{Database, User}; +use revolt_models::v0; +use revolt_result::{create_error, Result}; use rocket::serde::json::Json; use rocket::State; @@ -9,13 +10,17 @@ use rocket::State; /// Accept another user's friend request. #[openapi(tag = "Relationships")] #[put("//friend")] -pub async fn req(db: &State, user: User, target: Ref) -> Result> { +pub async fn add( + db: &State, + mut user: User, + target: Reference, +) -> Result> { let mut target = target.as_user(db).await?; if user.bot.is_some() || target.bot.is_some() { - return Err(Error::IsBot); + return Err(create_error!(IsBot)); } user.add_friend(db, &mut target).await?; - Ok(Json(target.with_auto_perspective(db, &user).await)) + Ok(Json(target.into(db, &user).await)) } diff --git a/crates/delta/src/routes/users/block_user.rs b/crates/delta/src/routes/users/block_user.rs index dd171fd7..0e6498aa 100644 --- a/crates/delta/src/routes/users/block_user.rs +++ b/crates/delta/src/routes/users/block_user.rs @@ -1,6 +1,7 @@ -use revolt_quark::models::User; -use revolt_quark::{Database, Result}; - +use revolt_database::util::reference::Reference; +use revolt_database::{Database, User}; +use revolt_models::v0; +use revolt_result::Result; use rocket::serde::json::Json; use rocket::State; @@ -9,8 +10,13 @@ use rocket::State; /// Block another user by their id. #[openapi(tag = "Relationships")] #[put("//block")] -pub async fn req(db: &State, user: User, target: String) -> Result> { - let mut target = db.fetch_user(&target).await?; +pub async fn block( + db: &State, + mut user: User, + target: Reference, +) -> Result> { + let mut target = target.as_user(db).await?; + user.block_user(db, &mut target).await?; - Ok(Json(target.with_auto_perspective(db, &user).await)) + Ok(Json(target.into(db, &user).await)) } diff --git a/crates/delta/src/routes/users/change_username.rs b/crates/delta/src/routes/users/change_username.rs index 8d469f4c..aab3da85 100644 --- a/crates/delta/src/routes/users/change_username.rs +++ b/crates/delta/src/routes/users/change_username.rs @@ -1,6 +1,9 @@ +use authifier::models::Account; use once_cell::sync::Lazy; use regex::Regex; -use revolt_quark::{authifier::models::Account, models::User, Database, Error, Result}; +use revolt_database::{Database, User}; +use revolt_models::v0; +use revolt_result::{create_error, Result}; use rocket::{serde::json::Json, State}; use serde::{Deserialize, Serialize}; use validator::Validate; @@ -32,15 +35,18 @@ pub async fn req( account: Account, mut user: User, data: Json, -) -> Result> { +) -> Result> { let data = data.into_inner(); - data.validate() - .map_err(|error| Error::FailedValidation { error })?; + data.validate().map_err(|error| { + create_error!(FailedValidation { + error: error.to_string() + }) + })?; account .verify_password(&data.password) - .map_err(|_| Error::InvalidCredentials)?; + .map_err(|_| create_error!(InvalidCredentials))?; user.update_username(db, data.username).await?; - Ok(Json(user.foreign())) + Ok(Json(user.into(db, None).await)) } diff --git a/crates/delta/src/routes/users/mod.rs b/crates/delta/src/routes/users/mod.rs index 28e8ee0b..5292fe52 100644 --- a/crates/delta/src/routes/users/mod.rs +++ b/crates/delta/src/routes/users/mod.rs @@ -32,10 +32,10 @@ pub fn routes() -> (Vec, OpenApi) { open_dm::req, // Relationships find_mutual::req, - add_friend::req, - remove_friend::req, - block_user::req, - unblock_user::req, - send_friend_request::req, + add_friend::add, + remove_friend::remove, + block_user::block, + unblock_user::unblock, + send_friend_request::send_friend_request, ] } diff --git a/crates/delta/src/routes/users/remove_friend.rs b/crates/delta/src/routes/users/remove_friend.rs index b0bb6f23..6ae38eeb 100644 --- a/crates/delta/src/routes/users/remove_friend.rs +++ b/crates/delta/src/routes/users/remove_friend.rs @@ -1,6 +1,7 @@ -use revolt_quark::models::User; -use revolt_quark::{Database, Error, Result}; - +use revolt_database::util::reference::Reference; +use revolt_database::{Database, User}; +use revolt_models::v0; +use revolt_result::{create_error, Result}; use rocket::serde::json::Json; use rocket::State; @@ -9,13 +10,17 @@ use rocket::State; /// Denies another user's friend request or removes an existing friend. #[openapi(tag = "Relationships")] #[delete("//friend")] -pub async fn req(db: &State, user: User, target: String) -> Result> { - let mut target = db.fetch_user(&target).await?; +pub async fn remove( + db: &State, + mut user: User, + target: Reference, +) -> Result> { + let mut target = target.as_user(db).await?; if user.bot.is_some() || target.bot.is_some() { - return Err(Error::IsBot); + return Err(create_error!(IsBot)); } user.remove_friend(db, &mut target).await?; - Ok(Json(target.with_auto_perspective(db, &user).await)) + Ok(Json(target.into(db, &user).await)) } diff --git a/crates/delta/src/routes/users/send_friend_request.rs b/crates/delta/src/routes/users/send_friend_request.rs index 156532aa..552219f2 100644 --- a/crates/delta/src/routes/users/send_friend_request.rs +++ b/crates/delta/src/routes/users/send_friend_request.rs @@ -1,37 +1,30 @@ -use revolt_quark::models::User; -use revolt_quark::{Database, Error, Result}; - +use revolt_database::util::reference::Reference; +use revolt_database::{Database, User}; +use revolt_models::v0; +use revolt_result::{create_error, Result}; use rocket::serde::json::Json; use rocket::State; -use serde::{Deserialize, Serialize}; - -/// # User Lookup Information -#[derive(Serialize, Deserialize, JsonSchema)] -pub struct DataSendFriendRequest { - /// Username and discriminator combo separated by # - username: String, -} /// # Send Friend Request /// /// Send a friend request to another user. #[openapi(tag = "Relationships")] #[post("/friend", data = "")] -pub async fn req( +pub async fn send_friend_request( db: &State, - user: User, - data: Json, -) -> Result> { + mut user: User, + data: Json, +) -> Result> { if let Some((username, discriminator)) = data.username.split_once('#') { let mut target = db.fetch_user_by_username(username, discriminator).await?; if user.bot.is_some() || target.bot.is_some() { - return Err(Error::IsBot); + return Err(create_error!(IsBot)); } user.add_friend(db, &mut target).await?; - Ok(Json(target.with_auto_perspective(db, &user).await)) + Ok(Json(target.into(db, &user).await)) } else { - Err(Error::InvalidProperty) + Err(create_error!(InvalidProperty)) } } diff --git a/crates/delta/src/routes/users/unblock_user.rs b/crates/delta/src/routes/users/unblock_user.rs index e7733191..d379c665 100644 --- a/crates/delta/src/routes/users/unblock_user.rs +++ b/crates/delta/src/routes/users/unblock_user.rs @@ -1,6 +1,7 @@ -use revolt_quark::models::User; -use revolt_quark::{Database, Result}; - +use revolt_database::util::reference::Reference; +use revolt_database::{Database, User}; +use revolt_models::v0; +use revolt_result::Result; use rocket::serde::json::Json; use rocket::State; @@ -9,8 +10,13 @@ use rocket::State; /// Unblock another user by their id. #[openapi(tag = "Relationships")] #[delete("//block")] -pub async fn req(db: &State, user: User, target: String) -> Result> { - let mut target = db.fetch_user(&target).await?; +pub async fn unblock( + db: &State, + mut user: User, + target: Reference, +) -> Result> { + let mut target = target.as_user(db).await?; + user.unblock_user(db, &mut target).await?; - Ok(Json(target.with_auto_perspective(db, &user).await)) + Ok(Json(target.into(db, &user).await)) }