From d87d608d9edfdf7181ed08b9b32e949ecfb72476 Mon Sep 17 00:00:00 2001 From: Paul Makles Date: Thu, 3 Aug 2023 18:27:13 +0100 Subject: [PATCH] chore(core): flesh out implementations for channels / servers --- crates/core/database/src/events/client.rs | 10 +- .../database/src/models/channels/model.rs | 32 ++++++- .../core/database/src/models/servers/model.rs | 30 +++--- crates/core/database/src/util/bridge/v0.rs | 92 +++++++++++++++++++ crates/core/models/src/v0/server_members.rs | 22 ++++- crates/core/models/src/v0/servers.rs | 44 ++++++--- 6 files changed, 193 insertions(+), 37 deletions(-) diff --git a/crates/core/database/src/events/client.rs b/crates/core/database/src/events/client.rs index 49c4fc79..376b9fe3 100644 --- a/crates/core/database/src/events/client.rs +++ b/crates/core/database/src/events/client.rs @@ -2,8 +2,9 @@ use authifier::AuthifierEvent; use serde::{Deserialize, Serialize}; use revolt_models::v0::{ - Channel, Emoji, FieldsChannel, FieldsWebhook, PartialChannel, PartialWebhook, UserSettings, - Webhook, + Channel, Emoji, FieldsChannel, FieldsMember, FieldsRole, FieldsServer, FieldsWebhook, + MemberCompositeKey, PartialChannel, PartialMember, PartialRole, PartialServer, PartialWebhook, + Server, UserSettings, Webhook, }; use revolt_result::Error; @@ -102,8 +103,7 @@ pub enum EventV1 { }, /// Bulk delete messages - BulkMessageDelete { channel: String, ids: Vec }, - + BulkMessageDelete { channel: String, ids: Vec },*/ /// New server ServerCreate { id: String, @@ -145,7 +145,7 @@ pub enum EventV1 { /// Server role deleted ServerRoleDelete { id: String, role_id: String }, - /// Update existing user + /*/// Update existing user UserUpdate { id: String, data: PartialUser, diff --git a/crates/core/database/src/models/channels/model.rs b/crates/core/database/src/models/channels/model.rs index 9da02b7a..2323020f 100644 --- a/crates/core/database/src/models/channels/model.rs +++ b/crates/core/database/src/models/channels/model.rs @@ -169,6 +169,19 @@ impl Channel { pub async fn create(&self, db: &Database) -> Result<()> { db.insert_channel(self).await?; + let event = EventV1::ChannelCreate(self.clone().into()); + match self { + Self::SavedMessages { user, .. } => event.private(user.clone()).await, + Self::DirectMessage { recipients, .. } | Self::Group { recipients, .. } => { + for recipient in recipients { + event.clone().private(recipient.clone()).await; + } + } + Self::TextChannel { server, .. } | Self::VoiceChannel { server, .. } => { + event.p(server.clone()).await; + } + } + Ok(()) } @@ -293,7 +306,7 @@ impl Channel { } /// Update channel data - pub async fn update<'a>( + pub async fn update( &mut self, db: &Database, partial: PartialChannel, @@ -305,8 +318,19 @@ impl Channel { self.apply_options(partial.clone()); - db.update_channel(&self.id(), &partial, remove.clone()) - .await?; + let id = self.id().to_string(); + db.update_channel(&id, &partial, remove.clone()).await?; + + EventV1::ChannelUpdate { + id: id.clone(), + data: partial.into(), + clear: remove.into_iter().map(|v| v.into()).collect(), + } + .p(match self { + Self::TextChannel { server, .. } | Self::VoiceChannel { server, .. } => server.clone(), + _ => id, + }) + .await; Ok(()) } @@ -514,6 +538,8 @@ impl Channel { /// Delete a channel pub async fn delete(&self, db: &Database) -> Result<()> { + let id = self.id().to_string(); + EventV1::ChannelDelete { id: id.clone() }.p(id).await; db.delete_channel(self).await } } diff --git a/crates/core/database/src/models/servers/model.rs b/crates/core/database/src/models/servers/model.rs index a650509d..d3c48f4d 100644 --- a/crates/core/database/src/models/servers/model.rs +++ b/crates/core/database/src/models/servers/model.rs @@ -4,7 +4,7 @@ use revolt_permissions::OverrideField; use revolt_result::Result; use ulid::Ulid; -use crate::{Database, File}; +use crate::{events::client::EventV1, Database, File}; auto_derived_partial!( /// Server @@ -149,24 +149,24 @@ impl Server { db.update_server(&self.id, &partial, remove.clone()).await?; - /* // TODO: EventV1::ServerUpdate { + EventV1::ServerUpdate { id: self.id.clone(), - data: partial, - clear: remove, + data: partial.into(), + clear: remove.into_iter().map(|v| v.into()).collect(), } .p(self.id.clone()) - .await; */ + .await; Ok(()) } /// Delete a server pub async fn delete(self, db: &Database) -> Result<()> { - /* // TODO: EventV1::ServerDelete { + EventV1::ServerDelete { id: self.id.clone(), } .p(self.id.clone()) - .await; */ + .await; db.delete_server(&self.id).await } @@ -364,14 +364,14 @@ impl Role { let role_id = Ulid::new().to_string(); db.insert_role(server_id, &role_id, self).await?; - /* // TODO: EventV1::ServerRoleUpdate { + EventV1::ServerRoleUpdate { id: server_id.to_string(), role_id: role_id.to_string(), - data: self.clone().into_optional(), + data: self.clone().into_optional().into(), clear: vec![], } .p(server_id.to_string()) - .await; */ + .await; Ok(role_id) } @@ -394,14 +394,14 @@ impl Role { db.update_role(server_id, role_id, &partial, remove.clone()) .await?; - /* // TODO: EventV1::ServerRoleUpdate { + EventV1::ServerRoleUpdate { id: server_id.to_string(), role_id: role_id.to_string(), - data: partial, + data: partial.into(), clear: vec![], } .p(server_id.to_string()) - .await; */ + .await; Ok(()) } @@ -415,12 +415,12 @@ impl Role { /// Delete a role pub async fn delete(self, db: &Database, server_id: &str, role_id: &str) -> Result<()> { - /* // TODO: EventV1::ServerRoleDelete { + EventV1::ServerRoleDelete { id: server_id.to_string(), role_id: role_id.to_string(), } .p(server_id.to_string()) - .await; */ + .await; db.delete_role(server_id, role_id).await } diff --git a/crates/core/database/src/util/bridge/v0.rs b/crates/core/database/src/util/bridge/v0.rs index c51e77ca..9eb6b01c 100644 --- a/crates/core/database/src/util/bridge/v0.rs +++ b/crates/core/database/src/util/bridge/v0.rs @@ -316,6 +316,19 @@ impl From for Member { } } +impl From for PartialMember { + fn from(value: crate::PartialMember) -> Self { + PartialMember { + id: value.id.map(|id| id.into()), + joined_at: value.joined_at, + nickname: value.nickname, + avatar: value.avatar.map(|f| f.into()), + roles: value.roles, + timeout: value.timeout, + } + } +} + impl From for MemberCompositeKey { fn from(value: crate::MemberCompositeKey) -> Self { MemberCompositeKey { @@ -325,6 +338,27 @@ impl From for MemberCompositeKey { } } +impl From for FieldsMember { + fn from(value: crate::FieldsMember) -> Self { + match value { + crate::FieldsMember::Avatar => FieldsMember::Avatar, + crate::FieldsMember::Nickname => FieldsMember::Nickname, + crate::FieldsMember::Roles => FieldsMember::Roles, + crate::FieldsMember::Timeout => FieldsMember::Timeout, + } + } +} + +impl From for RemovalIntention { + fn from(value: crate::RemovalIntention) -> Self { + match value { + crate::RemovalIntention::Ban => RemovalIntention::Ban, + crate::RemovalIntention::Kick => RemovalIntention::Kick, + crate::RemovalIntention::Leave => RemovalIntention::Leave, + } + } +} + impl From for Server { fn from(value: crate::Server) -> Self { Server { @@ -353,6 +387,44 @@ impl From for Server { } } +impl From for PartialServer { + fn from(value: crate::PartialServer) -> Self { + PartialServer { + id: value.id, + owner: value.owner, + name: value.name, + description: value.description, + channels: value.channels, + categories: value + .categories + .map(|categories| categories.into_iter().map(|v| v.into()).collect()), + system_messages: value.system_messages.map(|v| v.into()), + roles: value + .roles + .map(|roles| roles.into_iter().map(|(k, v)| (k, v.into())).collect()), + default_permissions: value.default_permissions, + icon: value.icon.map(|f| f.into()), + banner: value.banner.map(|f| f.into()), + flags: value.flags.map(|v| v as u32), + nsfw: value.nsfw, + analytics: value.analytics, + discoverable: value.discoverable, + } + } +} + +impl From for FieldsServer { + fn from(value: crate::FieldsServer) -> Self { + match value { + crate::FieldsServer::Banner => FieldsServer::Banner, + crate::FieldsServer::Categories => FieldsServer::Categories, + crate::FieldsServer::Description => FieldsServer::Description, + crate::FieldsServer::Icon => FieldsServer::Icon, + crate::FieldsServer::SystemMessages => FieldsServer::SystemMessages, + } + } +} + impl From for Category { fn from(value: crate::Category) -> Self { Category { @@ -386,6 +458,26 @@ impl From for Role { } } +impl From for PartialRole { + fn from(value: crate::PartialRole) -> Self { + PartialRole { + name: value.name, + permissions: value.permissions, + colour: value.colour, + hoist: value.hoist, + rank: value.rank, + } + } +} + +impl From for FieldsRole { + fn from(value: crate::FieldsRole) -> Self { + match value { + crate::FieldsRole::Colour => FieldsRole::Colour, + } + } +} + impl crate::User { pub async fn into

(self, perspective: P) -> User where diff --git a/crates/core/models/src/v0/server_members.rs b/crates/core/models/src/v0/server_members.rs index 60a46144..bb91ad26 100644 --- a/crates/core/models/src/v0/server_members.rs +++ b/crates/core/models/src/v0/server_members.rs @@ -2,7 +2,7 @@ use super::File; use iso8601_timestamp::Timestamp; -auto_derived!( +auto_derived_partial!( /// Server Member pub struct Member { /// Unique member id @@ -29,8 +29,11 @@ auto_derived!( /// Timestamp this member is timed out until #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] pub timeout: Option, - } + }, + "PartialMember" +); +auto_derived!( /// Composite primary key consisting of server and user id #[derive(Hash, Default)] pub struct MemberCompositeKey { @@ -39,4 +42,19 @@ auto_derived!( /// User Id pub user: String, } + + /// Optional fields on server member object + pub enum FieldsMember { + Nickname, + Avatar, + Roles, + Timeout, + } + + /// Member removal intention + pub enum RemovalIntention { + Leave, + Kick, + Ban, + } ); diff --git a/crates/core/models/src/v0/servers.rs b/crates/core/models/src/v0/servers.rs index 11a63cf1..a32c20e7 100644 --- a/crates/core/models/src/v0/servers.rs +++ b/crates/core/models/src/v0/servers.rs @@ -3,7 +3,7 @@ use super::File; use revolt_permissions::OverrideField; use std::collections::HashMap; -auto_derived!( +auto_derived_partial!( /// Server pub struct Server { /// Unique Id @@ -72,18 +72,11 @@ auto_derived!( serde(skip_serializing_if = "crate::if_false", default) )] pub discoverable: bool, - } - - /// Channel category - pub struct Category { - /// Unique ID for this category - pub id: String, - /// Title for this category - pub title: String, - /// Channels in this category - pub channels: Vec, - } + }, + "PartialServer" +); +auto_derived_partial!( /// Role pub struct Role { /// Role name @@ -104,6 +97,33 @@ auto_derived!( /// Ranking of this role #[cfg_attr(feature = "serde", serde(default))] pub rank: i64, + }, + "PartialRole" +); + +auto_derived!( + /// Optional fields on server object + pub enum FieldsServer { + Description, + Categories, + SystemMessages, + Icon, + Banner, + } + + /// Optional fields on server object + pub enum FieldsRole { + Colour, + } + + /// Channel category + pub struct Category { + /// Unique ID for this category + pub id: String, + /// Title for this category + pub title: String, + /// Channels in this category + pub channels: Vec, } /// System message channel assignments