From 489c2bdd874aed781752ffedec32fe2d8507ea22 Mon Sep 17 00:00:00 2001 From: Paul Makles Date: Sat, 19 Feb 2022 19:49:10 +0000 Subject: [PATCH] feat: rewrite requests to include events --- src/routes/channels/channel_ack.rs | 3 +- src/routes/channels/channel_delete.rs | 61 ++++--------------- src/routes/channels/channel_edit.rs | 3 +- src/routes/channels/group_add_member.rs | 12 ++-- src/routes/channels/group_create.rs | 2 +- src/routes/channels/group_remove_member.rs | 15 +++-- src/routes/channels/message_delete.rs | 2 +- src/routes/channels/message_edit.rs | 6 +- src/routes/channels/message_send.rs | 2 +- src/routes/channels/permissions_set.rs | 18 +++--- .../channels/permissions_set_default.rs | 52 ++++++++-------- src/routes/servers/channel_create.rs | 25 ++++---- src/routes/servers/member_edit.rs | 17 +----- src/routes/servers/member_remove.rs | 2 +- src/routes/servers/permissions_set.rs | 33 +++++----- src/routes/servers/permissions_set_default.rs | 36 +++++------ src/routes/servers/roles_create.rs | 27 ++++---- src/routes/servers/roles_delete.rs | 12 ++-- src/routes/servers/roles_edit.rs | 14 ++--- src/routes/servers/server_create.rs | 6 +- src/routes/servers/server_delete.rs | 7 +-- src/routes/servers/server_edit.rs | 32 ++-------- src/routes/sync/set_settings.rs | 5 +- src/routes/users/edit_user.rs | 5 +- src/routes/users/open_dm.rs | 2 +- 25 files changed, 159 insertions(+), 240 deletions(-) diff --git a/src/routes/channels/channel_ack.rs b/src/routes/channels/channel_ack.rs index 34a131d7..138813af 100644 --- a/src/routes/channels/channel_ack.rs +++ b/src/routes/channels/channel_ack.rs @@ -12,7 +12,8 @@ pub async fn req(db: &Db, user: User, target: Ref, message: Ref) -> Result Result { return Err(Error::NotFound); } - match channel { + match &channel { Channel::SavedMessages { .. } => Err(Error::NoEffect), - Channel::DirectMessage { id, .. } => { - db.update_channel( - &id, + Channel::DirectMessage { id, .. } => db + .update_channel( + id, &PartialChannel { active: Some(false), ..Default::default() }, vec![], ) - .await?; - - Ok(EmptyResponse) - } - Channel::Group { - id, - owner, - recipients, - .. - } => { - 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?; - } else { - db.delete_channel(&id).await?; - return Ok(EmptyResponse); - } - } - - db.remove_user_from_group(&id, &user.id).await?; - - /*ClientboundNotification::ChannelGroupLeave { - id: id.clone(), - user: user.id.clone(), - } - .publish(id.clone()); - - Content::SystemMessage(SystemMessage::UserLeft { id: user.id }) - .send_as_system(&target) - .await - .ok();*/ - - Ok(EmptyResponse) - } - Channel::TextChannel { id, .. } | Channel::VoiceChannel { id, .. } => { + .await + .map(|_| EmptyResponse), + Channel::Group { .. } => channel + .remove_user_from_group(db, &user.id) + .await + .map(|_| EmptyResponse), + Channel::TextChannel { .. } | Channel::VoiceChannel { .. } => { if perm.get_manage_channel() { - db.delete_channel(&id).await?; - Ok(EmptyResponse) + channel.delete(db).await.map(|_| EmptyResponse) } else { 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 604ecd08..922ba287 100644 --- a/src/routes/channels/channel_edit.rs +++ b/src/routes/channels/channel_edit.rs @@ -124,7 +124,8 @@ pub async fn req( partial.nsfw = Some(new_nsfw); } - db.update_channel(id, &partial, data.remove.unwrap_or_default()) + channel + .update(db, partial, data.remove.unwrap_or_default()) .await?; } _ => return Err(Error::InvalidOperation), diff --git a/src/routes/channels/group_add_member.rs b/src/routes/channels/group_add_member.rs index c3b8bd68..81c6ae8e 100644 --- a/src/routes/channels/group_add_member.rs +++ b/src/routes/channels/group_add_member.rs @@ -17,11 +17,13 @@ pub async fn req(db: &Db, user: User, target: Ref, member: Ref) -> Result { - let user = member.as_user(db).await?; - db.add_user_to_group(&id, &user.id).await?; - Ok(EmptyResponse) + match &channel { + Channel::Group { .. } => { + let member = member.as_user(db).await?; + channel + .add_user_to_group(db, &member.id, &user.id) + .await + .map(|_| EmptyResponse) } _ => Err(Error::InvalidOperation), } diff --git a/src/routes/channels/group_create.rs b/src/routes/channels/group_create.rs index 20a804c8..14d4e61f 100644 --- a/src/routes/channels/group_create.rs +++ b/src/routes/channels/group_create.rs @@ -64,6 +64,6 @@ pub async fn req(db: &Db, user: User, info: Json) -> Result> nsfw: info.nsfw.unwrap_or(false), }; - db.insert_channel(&group).await?; + group.create(db).await?; Ok(Json(group)) } diff --git a/src/routes/channels/group_remove_member.rs b/src/routes/channels/group_remove_member.rs index aebdc35e..146f179d 100644 --- a/src/routes/channels/group_remove_member.rs +++ b/src/routes/channels/group_remove_member.rs @@ -7,14 +7,11 @@ use revolt_quark::{ pub async fn req(db: &Db, user: User, target: Ref, member: Ref) -> Result { let channel = target.as_channel(db).await?; - match channel { + match &channel { Channel::Group { - id, - owner, - recipients, - .. + owner, recipients, .. } => { - if user.id != owner { + if &user.id != owner { return Err(Error::MissingPermission { permission: 0 }); } @@ -27,8 +24,10 @@ pub async fn req(db: &Db, user: User, target: Ref, member: Ref) -> Result Err(Error::InvalidOperation), } diff --git a/src/routes/channels/message_delete.rs b/src/routes/channels/message_delete.rs index 622a4da6..f77dc8bd 100644 --- a/src/routes/channels/message_delete.rs +++ b/src/routes/channels/message_delete.rs @@ -21,5 +21,5 @@ pub async fn req(db: &Db, user: User, target: Ref, msg: Ref) -> Result, -) -> Result { - let channel = target.as_channel(db).await?; +) -> Result> { + let mut channel = target.as_channel(db).await?; if !perms(&user) .channel(&channel) .calc_channel(db) @@ -31,13 +31,9 @@ pub async fn req( }); } - match channel { - Channel::TextChannel { id, .. } | Channel::VoiceChannel { id, .. } => { - db.set_channel_role_permission(&id, &role, data.permissions) - .await?; - } - _ => return Err(Error::InvalidOperation), - } + channel + .set_role_permission(db, &role, data.permissions) + .await?; - Ok(EmptyResponse) + Ok(Json(channel)) } diff --git a/src/routes/channels/permissions_set_default.rs b/src/routes/channels/permissions_set_default.rs index 6caa51ae..878e5eb0 100644 --- a/src/routes/channels/permissions_set_default.rs +++ b/src/routes/channels/permissions_set_default.rs @@ -3,7 +3,7 @@ use serde::{Deserialize, Serialize}; use revolt_quark::{ models::{channel::PartialChannel, Channel, User}, - perms, ChannelPermission, Db, EmptyResponse, Error, Ref, Result, + perms, ChannelPermission, Db, Error, Ref, Result, }; #[derive(Serialize, Deserialize)] @@ -12,8 +12,8 @@ pub struct Data { } #[put("//permissions/default", data = "", rank = 1)] -pub async fn req(db: &Db, user: User, target: Ref, data: Json) -> Result { - let channel = target.as_channel(db).await?; +pub async fn req(db: &Db, user: User, target: Ref, data: Json) -> Result> { + let mut channel = target.as_channel(db).await?; if !perms(&user) .channel(&channel) .calc_channel(db) @@ -25,31 +25,33 @@ pub async fn req(db: &Db, user: User, target: Ref, data: Json) -> Result { - db.update_channel( - &id, - &PartialChannel { - permissions: Some(data.permissions as i32), - ..Default::default() - }, - vec![], - ) - .await?; + match &channel { + Channel::Group { .. } => { + channel + .update( + db, + 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?; + Channel::TextChannel { .. } | Channel::VoiceChannel { .. } => { + channel + .update( + db, + PartialChannel { + default_permissions: Some(data.permissions as i32), + ..Default::default() + }, + vec![], + ) + .await?; } _ => return Err(Error::InvalidOperation), } - Ok(EmptyResponse) + Ok(Json(channel)) } diff --git a/src/routes/servers/channel_create.rs b/src/routes/servers/channel_create.rs index 0317e73a..1c470951 100644 --- a/src/routes/servers/channel_create.rs +++ b/src/routes/servers/channel_create.rs @@ -40,7 +40,7 @@ pub async fn req(db: &Db, user: User, target: Ref, info: Json) -> Result) -> Result) -> Result Result, -) -> Result { - let server = target.as_server(db).await?; +) -> Result> { + let mut server = target.as_server(db).await?; if !perms(&user) .server(&server) .calc_server(db) @@ -34,18 +37,16 @@ pub async fn req( // ! FIXME: calculate permission against role - if !server.roles.contains_key(&role_id) { - return Err(Error::NotFound); - } + server + .set_role_permission( + db, + &role_id, + &( + data.permissions.server as i32, + data.permissions.channel as i32, + ), + ) + .await?; - db.update_role_permission( - &server.id, - &role_id, - &( - data.permissions.server as i32, - data.permissions.channel as i32, - ), - ) - .await - .map(|_| EmptyResponse) + Ok(Json(server)) } diff --git a/src/routes/servers/permissions_set_default.rs b/src/routes/servers/permissions_set_default.rs index 024c6d9e..526f6000 100644 --- a/src/routes/servers/permissions_set_default.rs +++ b/src/routes/servers/permissions_set_default.rs @@ -2,8 +2,8 @@ use rocket::serde::json::Json; use serde::{Deserialize, Serialize}; use revolt_quark::{ - models::{server::PartialServer, User}, - perms, Db, EmptyResponse, Error, Ref, Result, + models::{server::PartialServer, Server, User}, + perms, Db, Error, Ref, Result, }; #[derive(Serialize, Deserialize)] @@ -18,10 +18,10 @@ pub struct Data { } #[put("//permissions/default", data = "", rank = 1)] -pub async fn req(db: &Db, user: User, target: Ref, data: Json) -> Result { +pub async fn req(db: &Db, user: User, target: Ref, data: Json) -> Result> { let data = data.into_inner(); - let server = target.as_server(db).await?; + let mut server = target.as_server(db).await?; if !perms(&user) .server(&server) .calc_server(db) @@ -31,17 +31,19 @@ pub async fn req(db: &Db, user: User, target: Ref, data: Json) -> Result) -> Result/roles/")] pub async fn req(db: &Db, user: User, target: Ref, role_id: String) -> Result { - let server = target.as_server(db).await?; + let mut server = target.as_server(db).await?; if !perms(&user) .server(&server) .calc_server(db) @@ -14,7 +14,11 @@ pub async fn req(db: &Db, user: User, target: Ref, role_id: String) -> Result) -> Result> }; db.insert_channel(&channel).await?; - db.insert_server(&server).await?; - db.insert_member(&member).await?; + + server.create(db).await?; + member.create(db).await?; + Ok(Json(server)) } diff --git a/src/routes/servers/server_delete.rs b/src/routes/servers/server_delete.rs index 005e2910..5c8d3208 100644 --- a/src/routes/servers/server_delete.rs +++ b/src/routes/servers/server_delete.rs @@ -6,10 +6,9 @@ pub async fn req(db: &Db, user: User, target: Ref) -> Result { let member = db.fetch_member(&target.id, &user.id).await?; if server.owner == user.id { - db.delete_server(&server.id).await?; + server.delete(db).await } else { - db.delete_member(&member.id).await?; + member.delete(db).await } - - Ok(EmptyResponse) + .map(|_| EmptyResponse) } diff --git a/src/routes/servers/server_edit.rs b/src/routes/servers/server_edit.rs index 97c8fb3e..1ba78886 100644 --- a/src/routes/servers/server_edit.rs +++ b/src/routes/servers/server_edit.rs @@ -109,10 +109,6 @@ pub async fn req(db: &Db, user: User, target: Ref, data: Json) -> Result) -> Result) -> Result, options: Options) -> Res settings.insert(key, (timestamp, data)); } - db.set_user_settings(&user.id, &settings) - .await - .map(|_| EmptyResponse) + settings.set(db, &user.id).await.map(|_| EmptyResponse) } diff --git a/src/routes/users/edit_user.rs b/src/routes/users/edit_user.rs index 4542f39b..9ab79ee6 100644 --- a/src/routes/users/edit_user.rs +++ b/src/routes/users/edit_user.rs @@ -72,7 +72,6 @@ pub async fn req(db: &State, mut user: User, data: Json) -> Resu // 2. Apply new avatar if let Some(avatar) = data.avatar { partial.avatar = Some(File::use_avatar(db, &avatar, &user.id).await?); - user.avatar = partial.avatar.clone(); } // 3. Apply new status @@ -87,7 +86,6 @@ pub async fn req(db: &State, mut user: User, data: Json) -> Resu } partial.status = Some(new_status); - user.status = partial.status.clone(); } // 4. Apply new profile @@ -102,10 +100,9 @@ pub async fn req(db: &State, mut user: User, data: Json) -> Resu } partial.profile = Some(new_profile); - user.profile = partial.profile.clone(); } - db.update_user(&user.id, &partial, data.remove.unwrap_or_default()) + user.update(db, partial, data.remove.unwrap_or_default()) .await?; Ok(Json(user.foreign())) diff --git a/src/routes/users/open_dm.rs b/src/routes/users/open_dm.rs index c285ff61..2277ff56 100644 --- a/src/routes/users/open_dm.rs +++ b/src/routes/users/open_dm.rs @@ -27,7 +27,7 @@ pub async fn req(db: &State, user: User, target: Ref) -> Result