diff --git a/Cargo.lock b/Cargo.lock index 156acf75..15ca9fac 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1613,11 +1613,12 @@ dependencies = [ [[package]] name = "iso8601-timestamp" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368d05885f276773b79b4578869a60ab91e880415d17fb2a8d193aea74188a29" +checksum = "3bd7663ae5b511b3d13c7d374dbe73b03da3da8e66b83950390173bc7c7325cc" dependencies = [ "generic-array 0.14.5", + "schemars", "serde", "time 0.3.17", ] @@ -2882,7 +2883,7 @@ dependencies = [ "authifier", "bson", "futures", - "iso8601-timestamp 0.2.10", + "iso8601-timestamp 0.2.11", "log", "mongodb", "nanoid", @@ -2948,6 +2949,7 @@ dependencies = [ name = "revolt-models" version = "0.6.5" dependencies = [ + "iso8601-timestamp 0.2.11", "revolt-permissions", "revolt_optional_struct", "schemars", diff --git a/crates/core/database/src/util/bridge/v0.rs b/crates/core/database/src/util/bridge/v0.rs index 15ae06bd..af251351 100644 --- a/crates/core/database/src/util/bridge/v0.rs +++ b/crates/core/database/src/util/bridge/v0.rs @@ -226,6 +226,28 @@ impl From for Metadata { } } +impl From for Member { + fn from(value: crate::Member) -> Self { + Member { + id: value.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 { + server: value.server, + user: value.user, + } + } +} + impl From for Server { fn from(value: crate::Server) -> Self { Server { diff --git a/crates/core/models/Cargo.toml b/crates/core/models/Cargo.toml index 35717d32..486c6535 100644 --- a/crates/core/models/Cargo.toml +++ b/crates/core/models/Cargo.toml @@ -3,18 +3,18 @@ name = "revolt-models" version = "0.6.5" edition = "2021" license = "AGPL-3.0-or-later" -authors = [ "Paul Makles " ] +authors = ["Paul Makles "] description = "Revolt Backend: API Models" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [features] -serde = [ "dep:serde", "revolt-permissions/serde" ] -schemas = [ "dep:schemars", "revolt-permissions/schemas" ] -validator = [ "dep:validator" ] -partials = [ "dep:revolt_optional_struct", "serde", "schemas" ] +serde = ["dep:serde", "revolt-permissions/serde"] +schemas = ["dep:schemars", "revolt-permissions/schemas"] +validator = ["dep:validator"] +partials = ["dep:revolt_optional_struct", "serde", "schemas"] -default = [ "serde", "partials" ] +default = ["serde", "partials"] [dependencies] # Core @@ -23,6 +23,7 @@ revolt-permissions = { version = "0.6.5", path = "../permissions" } # Serialisation revolt_optional_struct = { version = "0.2.0", optional = true } serde = { version = "1", features = ["derive"], optional = true } +iso8601-timestamp = { version = "0.2.11", features = ["schema", "bson"] } # Spec Generation schemars = { version = "0.8.8", optional = true } diff --git a/crates/core/models/src/v0/mod.rs b/crates/core/models/src/v0/mod.rs index 675bf0c0..46380a21 100644 --- a/crates/core/models/src/v0/mod.rs +++ b/crates/core/models/src/v0/mod.rs @@ -2,6 +2,7 @@ mod bots; mod channel_webhooks; mod channels; mod files; +mod server_members; mod servers; mod users; @@ -9,5 +10,6 @@ pub use bots::*; pub use channel_webhooks::*; pub use channels::*; pub use files::*; +pub use server_members::*; pub use servers::*; pub use users::*; diff --git a/crates/core/models/src/v0/server_members.rs b/crates/core/models/src/v0/server_members.rs new file mode 100644 index 00000000..60a46144 --- /dev/null +++ b/crates/core/models/src/v0/server_members.rs @@ -0,0 +1,42 @@ +use super::File; + +use iso8601_timestamp::Timestamp; + +auto_derived!( + /// Server Member + pub struct Member { + /// Unique member id + #[cfg_attr(feature = "serde", serde(rename = "_id"))] + pub id: MemberCompositeKey, + + /// Time at which this user joined the server + #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] + pub joined_at: Option, + + /// Member's nickname + #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] + pub nickname: Option, + /// Avatar attachment + #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] + pub avatar: Option, + + /// Member's roles + #[cfg_attr( + feature = "serde", + serde(skip_serializing_if = "Vec::is_empty", default) + )] + pub roles: Vec, + /// Timestamp this member is timed out until + #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] + pub timeout: Option, + } + + /// Composite primary key consisting of server and user id + #[derive(Hash, Default)] + pub struct MemberCompositeKey { + /// Server Id + pub server: String, + /// User Id + pub user: String, + } +);