diff --git a/src/routes/channels/group_add_member.rs b/src/routes/channels/group_add_member.rs index 81478430..1bb6ef1a 100644 --- a/src/routes/channels/group_add_member.rs +++ b/src/routes/channels/group_add_member.rs @@ -1,11 +1,23 @@ -use revolt_quark::{EmptyResponse, Result}; +use revolt_quark::{Error, EmptyResponse, Result, models::{User, Channel}, Ref, Db, perms, ChannelPermission}; use mongodb::bson::doc; #[put("//recipients/")] pub async fn req( - /*user: UserRef, target: Ref, member: Ref*/ target: String, - member: String, + db: &Db, + user: User, target: Ref, member: Ref ) -> Result { - todo!() + 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 }) + } + + match channel { + Channel::Group { id, .. } => { + let user = member.as_user(db).await?; + db.add_user_to_group(&id, &user.id).await?; + Ok(EmptyResponse) + } + _ => Err(Error::InvalidOperation) + } } diff --git a/src/routes/channels/group_remove_member.rs b/src/routes/channels/group_remove_member.rs index d0f90448..e6a90232 100644 --- a/src/routes/channels/group_remove_member.rs +++ b/src/routes/channels/group_remove_member.rs @@ -1,11 +1,32 @@ -use revolt_quark::{EmptyResponse, Result}; +use revolt_quark::{Error, EmptyResponse, Result, Ref, Db, models::{Channel, User}}; use mongodb::bson::doc; #[delete("//recipients/")] pub async fn req( - /*user: UserRef, target: Ref, member: Ref*/ target: String, - member: String, + db: &Db, + user: User, target: Ref, member: Ref ) -> Result { - todo!() + let channel = target.as_channel(db).await?; + + match channel { + Channel::Group { id, owner, recipients, .. } => { + if user.id != owner { + return Err(Error::MissingPermission { permission: 0 }) + } + + let member = member.as_user(db).await?; + if user.id == member.id { + return Err(Error::CannotRemoveYourself); + } + + if !recipients.iter().any(|x| *x == member.id) { + return Err(Error::NotInGroup); + } + + db.remove_user_from_group(&id, &member.id).await?; + Ok(EmptyResponse) + } + _ => Err(Error::InvalidOperation) + } } diff --git a/src/routes/channels/voice_join.rs b/src/routes/channels/voice_join.rs index 0354d658..048c567e 100644 --- a/src/routes/channels/voice_join.rs +++ b/src/routes/channels/voice_join.rs @@ -1,4 +1,4 @@ -use revolt_quark::{Error, Result}; +use revolt_quark::{Result, models::User, Ref}; use rocket::serde::json::Value; use serde::{Deserialize, Serialize}; @@ -8,7 +8,7 @@ struct CreateUserResponse { token: String, } -#[post("//join_call")] -pub async fn req(/*user: UserRef, target: Ref,*/ target: String) -> Result { +#[post("/<_target>/join_call")] +pub async fn req(_user: User, _target: Ref) -> Result { todo!() }