From 27b469929915b157448af17dc36af9bb7112324b Mon Sep 17 00:00:00 2001 From: Paul Makles Date: Tue, 3 Jan 2023 21:04:04 +0000 Subject: [PATCH 01/10] fix: unify foreign user fetch into one method --- .../src/routes/servers/member_fetch_all.rs | 15 ++------------- .../quark/src/impl/generic/channels/message.rs | 2 +- crates/quark/src/impl/generic/users/user.rs | 17 +++++++++++++++++ 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/crates/delta/src/routes/servers/member_fetch_all.rs b/crates/delta/src/routes/servers/member_fetch_all.rs index aa397a13..9ab8870b 100644 --- a/crates/delta/src/routes/servers/member_fetch_all.rs +++ b/crates/delta/src/routes/servers/member_fetch_all.rs @@ -1,8 +1,6 @@ use revolt_quark::{ models::{Member, User}, - perms, - presence::presence_filter_online, - Db, Ref, Result, + perms, Db, Ref, Result, }; use rocket::serde::json::Json; @@ -47,16 +45,7 @@ pub async fn req( user_ids.push(member.id.user.clone()); } - let online_ids = presence_filter_online(&user_ids).await; - let mut users = db - .fetch_users(&user_ids) - .await? - .into_iter() - .map(|mut user| { - user.online = Some(online_ids.contains(&user.id)); - user.foreign() - }) - .collect::>(); + let mut users = User::fetch_foreign_users(db, &user_ids).await?; // Ensure the lists match up exactly. members.sort_by(|a, b| a.id.user.cmp(&b.id.user)); diff --git a/crates/quark/src/impl/generic/channels/message.rs b/crates/quark/src/impl/generic/channels/message.rs index 20318da6..9b876c79 100644 --- a/crates/quark/src/impl/generic/channels/message.rs +++ b/crates/quark/src/impl/generic/channels/message.rs @@ -383,7 +383,7 @@ impl BulkMessageResponse { ) -> Result { if let Some(true) = include_users { let user_ids = messages.get_user_ids(); - let users = db.fetch_users(&user_ids).await?; + let users = User::fetch_foreign_users(db, &user_ids).await?; Ok(match channel { Channel::TextChannel { server, .. } | Channel::VoiceChannel { server, .. } => { diff --git a/crates/quark/src/impl/generic/users/user.rs b/crates/quark/src/impl/generic/users/user.rs index 1fea5b90..76d2603b 100644 --- a/crates/quark/src/impl/generic/users/user.rs +++ b/crates/quark/src/impl/generic/users/user.rs @@ -4,6 +4,7 @@ use crate::models::user::{ }; use crate::permissions::defn::UserPerms; use crate::permissions::r#impl::user::get_relationship; +use crate::presence::presence_filter_online; use crate::{perms, Database, Error, Result}; use futures::try_join; @@ -67,6 +68,7 @@ impl User { } /// Mutate the user object to remove redundant information + #[must_use] pub fn foreign(mut self) -> User { self.profile = None; self.relations = None; @@ -94,6 +96,21 @@ impl User { self } + /// Fetch foreign users by a list of IDs + pub async fn fetch_foreign_users(db: &Database, user_ids: &[String]) -> Result> { + let online_ids = presence_filter_online(user_ids).await; + + Ok(db + .fetch_users(user_ids) + .await? + .into_iter() + .map(|mut user| { + user.online = Some(online_ids.contains(&user.id)); + user.foreign() + }) + .collect::>()) + } + /// Mutate the user object to include relationship (if it does not already exist) #[must_use] pub fn with_relationship(self, perspective: &User) -> User { From c5b823ad133cf195e4e9dbdf8a4397d453a2de98 Mon Sep 17 00:00:00 2001 From: Paul Makles Date: Tue, 3 Jan 2023 21:06:43 +0000 Subject: [PATCH 02/10] chore: clippy warnings --- crates/delta/src/routes/push/subscribe.rs | 2 +- crates/delta/src/routes/push/unsubscribe.rs | 2 +- crates/quark/src/models/channels/channel.rs | 2 +- crates/quark/src/models/servers/server.rs | 4 ++-- crates/quark/src/models/servers/server_member.rs | 2 +- crates/quark/src/models/users/bot.rs | 2 +- crates/quark/src/models/users/user.rs | 6 +++--- crates/quark/src/presence/mod.rs | 2 +- crates/quark/src/presence/operations.rs | 2 +- 9 files changed, 12 insertions(+), 12 deletions(-) diff --git a/crates/delta/src/routes/push/subscribe.rs b/crates/delta/src/routes/push/subscribe.rs index 098c119d..30740449 100644 --- a/crates/delta/src/routes/push/subscribe.rs +++ b/crates/delta/src/routes/push/subscribe.rs @@ -22,7 +22,7 @@ pub async fn req( ) -> Result { session.subscription = Some(data.into_inner()); session - .save(&rauth) + .save(rauth) .await .map(|_| EmptyResponse) .map_err(|_| Error::DatabaseError { diff --git a/crates/delta/src/routes/push/unsubscribe.rs b/crates/delta/src/routes/push/unsubscribe.rs index 117173e6..440ace0f 100644 --- a/crates/delta/src/routes/push/unsubscribe.rs +++ b/crates/delta/src/routes/push/unsubscribe.rs @@ -13,7 +13,7 @@ use rocket::State; pub async fn req(rauth: &State, mut session: Session) -> Result { session.subscription = None; session - .save(&rauth) + .save(rauth) .await .map(|_| EmptyResponse) .map_err(|_| Error::DatabaseError { diff --git a/crates/quark/src/models/channels/channel.rs b/crates/quark/src/models/channels/channel.rs index a8fa3740..62b05db0 100644 --- a/crates/quark/src/models/channels/channel.rs +++ b/crates/quark/src/models/channels/channel.rs @@ -161,7 +161,7 @@ pub struct PartialChannel { } /// Optional fields on channel object -#[derive(Serialize, Deserialize, JsonSchema, Debug, PartialEq, Clone)] +#[derive(Serialize, Deserialize, JsonSchema, Debug, PartialEq, Eq, Clone)] pub enum FieldsChannel { Description, Icon, diff --git a/crates/quark/src/models/servers/server.rs b/crates/quark/src/models/servers/server.rs index 2f3ce468..0df877b3 100644 --- a/crates/quark/src/models/servers/server.rs +++ b/crates/quark/src/models/servers/server.rs @@ -134,7 +134,7 @@ pub struct Server { } /// Optional fields on server object -#[derive(Serialize, Deserialize, JsonSchema, Debug, PartialEq, Clone)] +#[derive(Serialize, Deserialize, JsonSchema, Debug, PartialEq, Eq, Clone)] pub enum FieldsServer { Description, Categories, @@ -144,7 +144,7 @@ pub enum FieldsServer { } /// Optional fields on server object -#[derive(Serialize, Deserialize, JsonSchema, Debug, PartialEq, Clone)] +#[derive(Serialize, Deserialize, JsonSchema, Debug, PartialEq, Eq, Clone)] pub enum FieldsRole { Colour, } diff --git a/crates/quark/src/models/servers/server_member.rs b/crates/quark/src/models/servers/server_member.rs index 904ed690..23b802f3 100644 --- a/crates/quark/src/models/servers/server_member.rs +++ b/crates/quark/src/models/servers/server_member.rs @@ -42,7 +42,7 @@ pub struct Member { } /// Optional fields on server member object -#[derive(Serialize, Deserialize, JsonSchema, Debug, PartialEq, Clone)] +#[derive(Serialize, Deserialize, JsonSchema, Debug, PartialEq, Eq, Clone)] pub enum FieldsMember { Nickname, Avatar, diff --git a/crates/quark/src/models/users/bot.rs b/crates/quark/src/models/users/bot.rs index fd438d98..9fccb30d 100644 --- a/crates/quark/src/models/users/bot.rs +++ b/crates/quark/src/models/users/bot.rs @@ -56,7 +56,7 @@ pub struct Bot { } /// Optional fields on bot object -#[derive(Serialize, Deserialize, JsonSchema, Debug, PartialEq)] +#[derive(Serialize, Deserialize, JsonSchema, Debug, PartialEq, Eq)] pub enum FieldsBot { Token, InteractionsURL, diff --git a/crates/quark/src/models/users/user.rs b/crates/quark/src/models/users/user.rs index db745a0b..185bf286 100644 --- a/crates/quark/src/models/users/user.rs +++ b/crates/quark/src/models/users/user.rs @@ -10,7 +10,7 @@ pub fn if_false(t: &bool) -> bool { } /// User's relationship with another user (or themselves) -#[derive(Serialize, Deserialize, JsonSchema, Debug, Clone, PartialEq)] +#[derive(Serialize, Deserialize, JsonSchema, Debug, Clone, PartialEq, Eq)] pub enum RelationshipStatus { None, User, @@ -30,7 +30,7 @@ pub struct Relationship { } /// Presence status -#[derive(Serialize, Deserialize, JsonSchema, Debug, Clone, PartialEq)] +#[derive(Serialize, Deserialize, JsonSchema, Debug, Clone, PartialEq, Eq)] pub enum Presence { /// User is online Online, @@ -163,7 +163,7 @@ pub struct User { } /// Optional fields on user object -#[derive(Serialize, Deserialize, JsonSchema, Debug, PartialEq, Clone)] +#[derive(Serialize, Deserialize, JsonSchema, Debug, PartialEq, Eq, Clone)] pub enum FieldsUser { Avatar, StatusText, diff --git a/crates/quark/src/presence/mod.rs b/crates/quark/src/presence/mod.rs index 301cd010..2f301f84 100644 --- a/crates/quark/src/presence/mod.rs +++ b/crates/quark/src/presence/mod.rs @@ -147,7 +147,7 @@ pub async fn presence_clear_region(region_id: Option<&str>) { // also send out any relevant events. for session in sessions { let parts = session.split(':').collect::>(); - if let (Some(user_id), Some(session_id)) = (parts.get(0), parts.get(1)) { + if let (Some(user_id), Some(session_id)) = (parts.first(), parts.get(1)) { if let Ok(session_id) = session_id.parse() { presence_delete_session_internal(user_id, session_id, true).await; } diff --git a/crates/quark/src/presence/operations.rs b/crates/quark/src/presence/operations.rs index 4431b2f4..b97b65c7 100644 --- a/crates/quark/src/presence/operations.rs +++ b/crates/quark/src/presence/operations.rs @@ -53,5 +53,5 @@ pub async fn __get_set_sessions(conn: &mut Conn, region_id: &str) -> Vec /// Delete region session set pub async fn __delete_set_sessions(conn: &mut Conn, region_id: &str) { - let _: () = conn.del(region_id).await.unwrap(); + conn.del::<_, ()>(region_id).await.unwrap(); } From 117958d8cda3d8b784b74f6678716b3aa093789b Mon Sep 17 00:00:00 2001 From: Paul Makles Date: Sat, 14 Jan 2023 15:42:06 +0000 Subject: [PATCH 03/10] feat: include build information in root api call --- Cargo.lock | 183 +++++++++++++++++++++++++++----- crates/delta/Cargo.toml | 3 + crates/delta/build.rs | 16 +++ crates/delta/src/routes/root.rs | 24 +++++ 4 files changed, 199 insertions(+), 27 deletions(-) create mode 100644 crates/delta/build.rs diff --git a/Cargo.lock b/Cargo.lock index 7cc1c122..d74da317 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -81,6 +81,12 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "anyhow" +version = "1.0.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cb2f989d18dd141ab8ae82f64d1a8cdd37e0840f73a406896cf5e99502fab61" + [[package]] name = "arrayref" version = "0.3.6" @@ -517,6 +523,9 @@ name = "cc" version = "1.0.73" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" +dependencies = [ + "jobserver", +] [[package]] name = "cfg-if" @@ -606,7 +615,7 @@ dependencies = [ "rand 0.8.5", "sha2", "subtle", - "time 0.3.9", + "time 0.3.17", "version_check", ] @@ -875,6 +884,26 @@ dependencies = [ "syn 1.0.96", ] +[[package]] +name = "enum-iterator" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91a4ec26efacf4aeff80887a175a419493cb6f8b5480d26387eb0bd038976187" +dependencies = [ + "enum-iterator-derive", +] + +[[package]] +name = "enum-iterator-derive" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "828de45d0ca18782232dfb8f3ea9cc428e8ced380eb26a520baaacfc70de39ce" +dependencies = [ + "proc-macro2", + "quote 1.0.18", + "syn 1.0.96", +] + [[package]] name = "env_logger" version = "0.7.1" @@ -1138,6 +1167,18 @@ dependencies = [ "wasi 0.10.0+wasi-snapshot-preview1", ] +[[package]] +name = "getset" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e45727250e75cc04ff2846a66397da8ef2b3db8e40e0cef4df67950a07621eb9" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote 1.0.18", + "syn 1.0.96", +] + [[package]] name = "ghash" version = "0.4.4" @@ -1154,6 +1195,19 @@ version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78cc372d058dcf6d5ecd98510e7fbc9e5aec4d21de70f65fea8fecebcd881bd4" +[[package]] +name = "git2" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2994bee4a3a6a51eb90c218523be382fd7ea09b16380b9312e9dbe955ff7c7d1" +dependencies = [ + "bitflags", + "libc", + "libgit2-sys", + "log", + "url", +] + [[package]] name = "glob" version = "0.3.0" @@ -1514,7 +1568,7 @@ dependencies = [ "generic-array 0.14.5", "schemars", "serde", - "time 0.3.9", + "time 0.3.17", ] [[package]] @@ -1529,6 +1583,15 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" +[[package]] +name = "jobserver" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "068b1ee6743e4d11fb9c6a1e6064b3693a1b600e7f5f5988047d98b3dc9fb90b" +dependencies = [ + "libc", +] + [[package]] name = "js-sys" version = "0.3.57" @@ -1590,6 +1653,30 @@ version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" +[[package]] +name = "libgit2-sys" +version = "0.14.1+1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a07fb2692bc3593bda59de45a502bb3071659f2c515e28c71e728306b038e17" +dependencies = [ + "cc", + "libc", + "libz-sys", + "pkg-config", +] + +[[package]] +name = "libz-sys" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9702761c3935f8cc2f101793272e202c72b99da8f4224a19ddcf1279a6450bbf" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "linked-hash-map" version = "0.5.4" @@ -1914,6 +2001,15 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "ntapi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc51db7b362b205941f71232e56c625156eb9a929f8cf74a428fd5bc094a4afc" +dependencies = [ + "winapi 0.3.9", +] + [[package]] name = "num-integer" version = "0.1.45" @@ -1964,15 +2060,6 @@ dependencies = [ "syn 1.0.96", ] -[[package]] -name = "num_threads" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" -dependencies = [ - "libc", -] - [[package]] name = "object" version = "0.28.4" @@ -2765,6 +2852,7 @@ dependencies = [ "ulid 0.4.1", "url", "validator 0.14.0", + "vergen", ] [[package]] @@ -2881,7 +2969,7 @@ dependencies = [ "serde_json", "state", "tempfile", - "time 0.3.9", + "time 0.3.17", "tokio 1.18.2", "tokio-stream", "tokio-util 0.7.2", @@ -2953,7 +3041,7 @@ dependencies = [ "smallvec", "stable-pattern", "state", - "time 0.3.9", + "time 0.3.17", "tokio 1.18.2", "uncased", ] @@ -3069,9 +3157,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.6" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2cc38e8fa666e2de3c4aba7edeb5ffc5246c1c2ed0e3d17e560aeeba736b23f" +checksum = "5583e89e108996506031660fe09baa5011b9dd0341b89029313006d1fb508d70" [[package]] name = "ryu" @@ -3261,7 +3349,7 @@ dependencies = [ "serde", "serde_json", "thiserror", - "time 0.3.9", + "time 0.3.17", "url", "uuid", ] @@ -3545,6 +3633,20 @@ dependencies = [ "unicode-xid 0.0.4", ] +[[package]] +name = "sysinfo" +version = "0.27.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c215311383d25d03753375c53ab9fad8fc0cf46953c409211e065edeabf577ee" +dependencies = [ + "cfg-if 1.0.0", + "core-foundation-sys", + "libc", + "ntapi", + "once_cell", + "winapi 0.3.9", +] + [[package]] name = "take_mut" version = "0.2.2" @@ -3576,18 +3678,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.31" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a" +checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.31" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a" +checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" dependencies = [ "proc-macro2", "quote 1.0.18", @@ -3616,21 +3718,30 @@ dependencies = [ [[package]] name = "time" -version = "0.3.9" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2702e08a7a860f005826c6815dcac101b19b5eb330c27fe4a5928fec1d20ddd" +checksum = "a561bf4617eebd33bca6434b988f39ed798e527f51a1e797d0ee4f61c0a38376" dependencies = [ "itoa 1.0.2", - "libc", - "num_threads", + "serde", + "time-core", "time-macros", ] [[package]] -name = "time-macros" -version = "0.2.4" +name = "time-core" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42657b1a6f4d817cda8e7a0ace261fe0cc946cf3a80314390b22cc61ae080792" +checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" + +[[package]] +name = "time-macros" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d967f99f534ca7e495c575c62638eebc2898a8c84c119b89e250477bc4ba16b2" +dependencies = [ + "time-core", +] [[package]] name = "tinyvec" @@ -4204,6 +4315,24 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" +[[package]] +name = "vergen" +version = "7.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "571b69f690c855821462709b6f41d42ceccc316fbd17b60bd06d06928cfe6a99" +dependencies = [ + "anyhow", + "cfg-if 1.0.0", + "enum-iterator", + "getset", + "git2", + "rustc_version 0.4.0", + "rustversion", + "sysinfo", + "thiserror", + "time 0.3.17", +] + [[package]] name = "version_check" version = "0.9.4" diff --git a/crates/delta/Cargo.toml b/crates/delta/Cargo.toml index fbb163d4..c59b7b50 100644 --- a/crates/delta/Cargo.toml +++ b/crates/delta/Cargo.toml @@ -61,3 +61,6 @@ rocket_okapi = { git = "https://github.com/insertish/okapi", rev = "a1048d0c8cd7 # quark revolt-quark = { path = "../quark" } + +[build-dependencies] +vergen = "7.5.0" diff --git a/crates/delta/build.rs b/crates/delta/build.rs new file mode 100644 index 00000000..e71dcd55 --- /dev/null +++ b/crates/delta/build.rs @@ -0,0 +1,16 @@ +use vergen::{vergen, Config}; + +use std::process::Command; + +fn main() { + if let Ok(output) = Command::new("git") + .args(["config", "--get", "remote.origin.url"]) + .output() + { + if let Ok(git_origin) = String::from_utf8(output.stdout) { + println!("cargo:rustc-env=GIT_ORIGIN_URL={}", git_origin); + } + } + + vergen(Config::default()).unwrap(); +} diff --git a/crates/delta/src/routes/root.rs b/crates/delta/src/routes/root.rs index 90d174e6..e44ae638 100644 --- a/crates/delta/src/routes/root.rs +++ b/crates/delta/src/routes/root.rs @@ -54,6 +54,21 @@ pub struct RevoltFeatures { pub voso: VoiceFeature, } +/// # Build Information +#[derive(Serialize, JsonSchema, Debug)] +pub struct BuildInformation { + /// Commit Hash + pub commit_sha: String, + /// Commit Timestamp + pub commit_timestamp: String, + /// Git Semver + pub semver: String, + /// Git Origin URL + pub origin_url: String, + /// Build Timestamp + pub timestamp: String, +} + /// # Server Configuration #[derive(Serialize, JsonSchema, Debug)] pub struct RevoltConfig { @@ -67,6 +82,8 @@ pub struct RevoltConfig { pub app: String, /// Web Push VAPID public key pub vapid: String, + /// Build information + pub build: BuildInformation, } /// # Query Node @@ -101,6 +118,13 @@ pub async fn root() -> Result> { ws: EXTERNAL_WS_URL.to_string(), app: APP_URL.to_string(), vapid: VAPID_PUBLIC_KEY.to_string(), + build: BuildInformation { + commit_sha: env!("VERGEN_GIT_SHA").to_string(), + commit_timestamp: env!("VERGEN_GIT_COMMIT_TIMESTAMP").to_string(), + semver: env!("VERGEN_GIT_SEMVER").to_string(), + origin_url: env!("GIT_ORIGIN_URL", "").to_string(), + timestamp: env!("VERGEN_BUILD_TIMESTAMP").to_string(), + }, })) } From 0cebb69e02a19ffa7140cb1fd5d5315b50a3e5e3 Mon Sep 17 00:00:00 2001 From: Paul Makles Date: Sat, 14 Jan 2023 15:42:30 +0000 Subject: [PATCH 04/10] feat: automate generating OpenAPI specification --- .github/workflows/rust.yaml | 49 +++++++++++++++++++++++++++++++------ docker-compose.db.yml | 9 +++++++ 2 files changed, 51 insertions(+), 7 deletions(-) create mode 100644 docker-compose.db.yml diff --git a/.github/workflows/rust.yaml b/.github/workflows/rust.yaml index 4386b19f..88afedb0 100644 --- a/.github/workflows/rust.yaml +++ b/.github/workflows/rust.yaml @@ -1,10 +1,10 @@ -name: Rust build and test +name: Rust build, test, and generate specification on: push: - branches: [ master ] + branches: [master] pull_request: - branches: [ master ] + branches: [master] env: CARGO_TERM_COLOR: always @@ -18,16 +18,51 @@ jobs: - name: Install latest nightly uses: actions-rs/toolchain@v1 with: - toolchain: nightly - override: true - components: rustfmt, clippy + toolchain: nightly + override: true + components: rustfmt, clippy - name: Run cargo build uses: actions-rs/cargo@v1 with: command: build - + - name: Run cargo test uses: actions-rs/cargo@v1 with: command: test + + - name: Copy .env.example + run: | + cp .env.example .env + + - name: Run services in background + run: | + docker-compose up -d -f docker-compose.db.yml + + - name: Start API in background + run: | + cargo run --bin revolt-delta & + + - name: Wait for API to go up + uses: nev7n/wait_for_response@v1 + with: + url: "http://localhost:8000/" + + - name: Checkout API repository + uses: actions/checkout@v3 + with: + repository: revoltchat/api + path: api + + - name: Download OpenAPI specification + run: curl http://localhost:8000/openapi.json -o api/OpenAPI.json + + - name: Commit changes + uses: EndBug/add-and-commit@v4 + with: + cwd: "api" + add: "*.json" + message: "chore: generate OpenAPI specification" + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/docker-compose.db.yml b/docker-compose.db.yml new file mode 100644 index 00000000..4801e7d4 --- /dev/null +++ b/docker-compose.db.yml @@ -0,0 +1,9 @@ +version: "3.3" +services: + # MongoDB + database: + image: mongo + ports: + - "27017:27017" + volumes: + - ./.data/db:/data/db From 32d3683013b42f253566481c702e1636759fec22 Mon Sep 17 00:00:00 2001 From: Paul Makles Date: Sat, 14 Jan 2023 15:53:09 +0000 Subject: [PATCH 05/10] fix(ci): re-order docker-compose arguments chore(ci): prevent running gen on PR --- .github/workflows/rust.yaml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/workflows/rust.yaml b/.github/workflows/rust.yaml index 88afedb0..08abe127 100644 --- a/.github/workflows/rust.yaml +++ b/.github/workflows/rust.yaml @@ -33,32 +33,39 @@ jobs: command: test - name: Copy .env.example + if: github.event_name != 'pull_request' run: | cp .env.example .env - name: Run services in background + if: github.event_name != 'pull_request' run: | - docker-compose up -d -f docker-compose.db.yml + docker-compose -f docker-compose.db.yml up -d - name: Start API in background + if: github.event_name != 'pull_request' run: | cargo run --bin revolt-delta & - name: Wait for API to go up + if: github.event_name != 'pull_request' uses: nev7n/wait_for_response@v1 with: url: "http://localhost:8000/" - name: Checkout API repository + if: github.event_name != 'pull_request' uses: actions/checkout@v3 with: repository: revoltchat/api path: api - name: Download OpenAPI specification + if: github.event_name != 'pull_request' run: curl http://localhost:8000/openapi.json -o api/OpenAPI.json - name: Commit changes + if: github.event_name != 'pull_request' uses: EndBug/add-and-commit@v4 with: cwd: "api" From fc32996b51f5bf983fdd20d08028938841b10d3f Mon Sep 17 00:00:00 2001 From: ToastXC <100072983+toastxc@users.noreply.github.com> Date: Thu, 19 Jan 2023 02:16:27 +0800 Subject: [PATCH 06/10] chore: remove clippy warnings (#213) --- crates/quark/src/events/impl.rs | 6 +----- crates/quark/src/permissions/defn/mod.rs | 2 +- crates/quark/src/presence/mod.rs | 4 ++-- crates/quark/src/tasks/process_embeds.rs | 2 +- 4 files changed, 5 insertions(+), 9 deletions(-) diff --git a/crates/quark/src/events/impl.rs b/crates/quark/src/events/impl.rs index 0dd41e16..6da72a77 100644 --- a/crates/quark/src/events/impl.rs +++ b/crates/quark/src/events/impl.rs @@ -23,11 +23,7 @@ impl Cache { pub async fn can_view_channel(&self, db: &Database, channel: &Channel) -> bool { match &channel { Channel::TextChannel { server, .. } | Channel::VoiceChannel { server, .. } => { - let member = self - .members - .iter() - .map(|(_, x)| x) - .find(|x| &x.id.server == server); + let member = self.members.values().find(|x| &x.id.server == server); let server = self.servers.get(server); let mut perms = perms(self.users.get(&self.user_id).unwrap()).channel(channel); diff --git a/crates/quark/src/permissions/defn/mod.rs b/crates/quark/src/permissions/defn/mod.rs index 6f46254f..a665b903 100644 --- a/crates/quark/src/permissions/defn/mod.rs +++ b/crates/quark/src/permissions/defn/mod.rs @@ -97,7 +97,7 @@ impl From for PermissionValue { impl From for PermissionValue { fn from(v: u64) -> Self { - Self(v as u64) + Self(v) } } diff --git a/crates/quark/src/presence/mod.rs b/crates/quark/src/presence/mod.rs index 2f301f84..73c14b6a 100644 --- a/crates/quark/src/presence/mod.rs +++ b/crates/quark/src/presence/mod.rs @@ -35,7 +35,7 @@ pub async fn presence_create_session(user_id: &str, flags: u8) -> (bool, u8) { __set_key_presence_entry(&mut conn, user_id, entry).await; // Add to region set in case of failure. - __add_to_set_sessions(&mut conn, &*REGION_KEY, user_id, session_id).await; + __add_to_set_sessions(&mut conn, ®ION_KEY, user_id, session_id).await; (was_empty, session_id) } @@ -74,7 +74,7 @@ async fn presence_delete_session_internal( // Remove from region set. if !skip_region { - __remove_from_set_sessions(&mut conn, &*REGION_KEY, user_id, session_id).await; + __remove_from_set_sessions(&mut conn, ®ION_KEY, user_id, session_id).await; } } diff --git a/crates/quark/src/tasks/process_embeds.rs b/crates/quark/src/tasks/process_embeds.rs index 5514c25c..11c37215 100644 --- a/crates/quark/src/tasks/process_embeds.rs +++ b/crates/quark/src/tasks/process_embeds.rs @@ -38,7 +38,7 @@ pub async fn queue(channel: String, id: String, content: String) { pub async fn worker(db: Database) { loop { let task = Q.pop().await; - if let Ok(embeds) = Embed::generate(task.content, &*JANUARY_URL, *MAX_EMBED_COUNT).await { + if let Ok(embeds) = Embed::generate(task.content, &JANUARY_URL, *MAX_EMBED_COUNT).await { if let Err(err) = Message::append( &db, task.id, From ce6b454874ef0cf4fe4e372b7fa16b35321113da Mon Sep 17 00:00:00 2001 From: Lea Date: Wed, 23 Nov 2022 22:49:14 +0100 Subject: [PATCH 07/10] fix: raise masquerade avatar URL length limit --- crates/quark/src/models/channels/message.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/quark/src/models/channels/message.rs b/crates/quark/src/models/channels/message.rs index af66c473..ee9e61cf 100644 --- a/crates/quark/src/models/channels/message.rs +++ b/crates/quark/src/models/channels/message.rs @@ -81,7 +81,7 @@ pub struct Masquerade { pub name: Option, /// Replace the avatar shown on this message (URL to image file) #[serde(skip_serializing_if = "Option::is_none")] - #[validate(length(min = 1, max = 128))] + #[validate(length(min = 1, max = 256))] pub avatar: Option, /// Replace the display role colour shown on this message /// From 4a7917e9ea1bd22b5f0e33aadf3d5ca46dfed049 Mon Sep 17 00:00:00 2001 From: Sophie L Date: Fri, 2 Sep 2022 17:18:44 +0100 Subject: [PATCH 08/10] feat: enable reactions by default in servers/DMs --- crates/quark/src/permissions/defn/permission.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/crates/quark/src/permissions/defn/permission.rs b/crates/quark/src/permissions/defn/permission.rs index 215710ad..2ebb0257 100644 --- a/crates/quark/src/permissions/defn/permission.rs +++ b/crates/quark/src/permissions/defn/permission.rs @@ -24,7 +24,7 @@ pub enum Permission { /// Manage server customisation (includes emoji) ManageCustomisation = 1 << 4, - // % 1 bits reserved + // % 1 bit reserved // * Member permissions /// Kick other members below their ranking @@ -109,10 +109,11 @@ lazy_static! { + Permission::Connect + Permission::Speak; pub static ref DEFAULT_PERMISSION_SAVED_MESSAGES: u64 = Permission::GrantAllSafe as u64; - pub static ref DEFAULT_PERMISSION_DIRECT_MESSAGE: u64 = - *DEFAULT_PERMISSION + Permission::ManageChannel; + pub static ref DEFAULT_PERMISSION_DIRECT_MESSAGE: u64 = *DEFAULT_PERMISSION + + Permission::ManageChannel + + Permission::React; pub static ref DEFAULT_PERMISSION_SERVER: u64 = - *DEFAULT_PERMISSION + Permission::ChangeNickname + Permission::ChangeAvatar; + *DEFAULT_PERMISSION + Permission::React + Permission::ChangeNickname + Permission::ChangeAvatar; } bitfield! { From 94b04729343979b5539faa60abdbf27d1f052e59 Mon Sep 17 00:00:00 2001 From: Ryan <38785445+ryanalexander@users.noreply.github.com> Date: Thu, 19 Jan 2023 04:17:59 +1000 Subject: [PATCH 09/10] feat: pass server flags with invite data (#203) --- crates/delta/src/routes/invites/invite_fetch.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/crates/delta/src/routes/invites/invite_fetch.rs b/crates/delta/src/routes/invites/invite_fetch.rs index e931b66d..8eb3b439 100644 --- a/crates/delta/src/routes/invites/invite_fetch.rs +++ b/crates/delta/src/routes/invites/invite_fetch.rs @@ -23,6 +23,9 @@ pub enum InviteResponse { /// Attachment for server banner #[serde(skip_serializing_if = "Option::is_none")] server_banner: Option, + /// Enum of server flags + #[serde(skip_serializing_if = "Option::is_none")] + server_flags: Option, /// Id of server channel channel_id: String, /// Name of server channel @@ -94,6 +97,7 @@ pub async fn req(db: &Db, target: Ref) -> Result> { server_name: server.name, server_icon: server.icon, server_banner: server.banner, + server_flags: server.flags, channel_id: id, channel_name: name, channel_description: description, From d9d2735efae31b4bf3732ca524cd6e4a398bcee6 Mon Sep 17 00:00:00 2001 From: Paul Makles Date: Wed, 18 Jan 2023 18:26:00 +0000 Subject: [PATCH 10/10] fix(ratelimiter): re-calculate reset time closes #204 Co-authored-by: TheBobBobs <84781603+TheBobBobs@users.noreply.github.com> --- crates/quark/src/web/ratelimiter.rs | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/crates/quark/src/web/ratelimiter.rs b/crates/quark/src/web/ratelimiter.rs index f7e0dd62..d77701db 100644 --- a/crates/quark/src/web/ratelimiter.rs +++ b/crates/quark/src/web/ratelimiter.rs @@ -51,7 +51,7 @@ impl Entry { } /// Deduct one unit from the bucket and save - pub fn deduct(mut self, key: u64) { + pub fn deduct(mut self) { let current_time = now().as_millis(); if current_time > self.reset { self.used = 1; @@ -59,7 +59,10 @@ impl Entry { } else { self.used += 1; } + } + /// Save information + pub fn save(self, key: u64) { MAP.insert(key, self); } @@ -189,10 +192,12 @@ impl Ratelimiter { let entry = Entry::from(key); let remaining = entry.get_remaining(limit); - let reset = entry.left_until_reset(); - if remaining > 0 { - entry.deduct(key); + entry.deduct(); + + let reset = entry.left_until_reset(); + entry.save(key); + Ok(Ratelimiter { key, limit, @@ -200,7 +205,7 @@ impl Ratelimiter { reset, }) } else { - Err(reset) + Err(entry.left_until_reset()) } } }