From a558adb1b65483685ab7c89b7e9570bc1a4d5e2a Mon Sep 17 00:00:00 2001 From: IAmTomahawkx Date: Fri, 6 Dec 2024 20:53:14 -0800 Subject: [PATCH] feat: update to mongo 3.1, add member generator. --- Cargo.lock | 445 +++++++------- Cargo.toml | 2 + crates/bonfire/Cargo.toml | 2 +- crates/core/database/Cargo.toml | 4 +- crates/core/database/src/drivers/mongodb.rs | 18 +- .../models/admin_migrations/ops/mongodb.rs | 4 +- .../admin_migrations/ops/mongodb/init.rs | 342 +++++------ .../admin_migrations/ops/mongodb/scripts.rs | 571 ++++++++---------- .../src/models/channel_invites/ops/mongodb.rs | 9 +- .../src/models/channel_unreads/ops/mongodb.rs | 18 +- .../models/channel_webhooks/ops/mongodb.rs | 9 +- .../src/models/channels/ops/mongodb.rs | 44 +- .../database/src/models/emojis/ops/mongodb.rs | 1 - .../src/models/file_hashes/ops/mongodb.rs | 1 - .../database/src/models/files/ops/mongodb.rs | 5 - .../src/models/messages/ops/mongodb.rs | 22 +- .../models/ratelimit_events/ops/mongodb.rs | 15 +- .../database/src/models/server_members/ops.rs | 66 ++ .../src/models/server_members/ops/mongodb.rs | 82 +-- .../models/server_members/ops/reference.rs | 19 +- .../src/models/servers/ops/mongodb.rs | 45 +- .../src/models/user_settings/ops/mongodb.rs | 2 +- .../database/src/models/users/ops/mongodb.rs | 142 ++--- crates/daemons/pushd/Cargo.toml | 2 +- crates/delta/Cargo.toml | 4 +- 25 files changed, 896 insertions(+), 978 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a3a8571b2..b98d75016 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -352,21 +352,6 @@ dependencies = [ "wasm-bindgen-futures", ] -[[package]] -name = "async-std-resolver" -version = "0.21.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f2f8a4a203be3325981310ab243a28e6e4ea55b6519bffce05d41ab60e09ad8" -dependencies = [ - "async-std", - "async-trait", - "futures-io", - "futures-util", - "pin-utils", - "socket2 0.4.4", - "trust-dns-resolver", -] - [[package]] name = "async-stream" version = "0.3.3" @@ -447,9 +432,7 @@ dependencies = [ [[package]] name = "authifier" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ba4df3b5df5cf1a08d4af71c407fb56a675b6aaf4d1fec704da32595497d73d" +version = "1.0.10" dependencies = [ "async-std", "async-trait", @@ -588,7 +571,7 @@ dependencies = [ "percent-encoding", "pin-project-lite 0.2.13", "tracing", - "uuid 1.4.1", + "uuid", ] [[package]] @@ -894,7 +877,7 @@ dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", "aws-smithy-types", - "rustc_version 0.4.0", + "rustc_version", "tracing", ] @@ -1005,7 +988,7 @@ dependencies = [ "tempfile", "thiserror", "tokio 1.40.0", - "uuid 1.4.1", + "uuid", ] [[package]] @@ -1134,6 +1117,18 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c12d1856e42f0d817a835fe55853957c85c8c8a470114029143d3f12671446e" +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + [[package]] name = "blake2b_simd" version = "1.0.0" @@ -1191,21 +1186,23 @@ dependencies = [ [[package]] name = "bson" -version = "2.2.0" +version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f60a2c7c80a7850b56df4b8e98e8e4932c34877b8add4f13e8350499cc1e4572" +checksum = "068208f2b6fcfa27a7f1ee37488d2bb8ba2640f68f5475d08e1d9130696aba59" dependencies = [ - "ahash 0.7.6", + "ahash 0.8.11", "base64 0.13.0", - "chrono", + "bitvec", "hex", - "indexmap 1.9.3", - "lazy_static", + "indexmap 2.7.0", + "js-sys", + "once_cell", "rand 0.8.5", "serde", "serde_bytes", "serde_json", - "uuid 0.8.2", + "time", + "uuid", ] [[package]] @@ -1333,7 +1330,7 @@ checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" dependencies = [ "byteorder", "fnv", - "uuid 1.4.1", + "uuid", ] [[package]] @@ -1362,6 +1359,7 @@ dependencies = [ "iana-time-zone", "js-sys", "num-traits", + "serde", "wasm-bindgen", "windows-targets 0.52.6", ] @@ -1472,6 +1470,12 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + [[package]] name = "cookie" version = "0.18.1" @@ -1535,7 +1539,7 @@ version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3a47af21622d091a8f0fb295b88bc886ac74efcc613efc19f5d0b21de5c89e47" dependencies = [ - "rustc_version 0.4.0", + "rustc_version", ] [[package]] @@ -1845,7 +1849,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef552e6f588e446098f6ba40d89ac146c8c7b64aade83c051ee00bb5d2bc18d" dependencies = [ "serde", - "uuid 1.4.1", + "uuid", ] [[package]] @@ -1887,6 +1891,16 @@ dependencies = [ "synstructure", ] +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", + "serde", +] + [[package]] name = "derivative" version = "2.2.0" @@ -1904,8 +1918,10 @@ version = "0.99.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" dependencies = [ + "convert_case", "proc-macro2", "quote 1.0.37", + "rustc_version", "syn 2.0.76", ] @@ -2084,14 +2100,14 @@ dependencies = [ [[package]] name = "enum-as-inner" -version = "0.4.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21cdad81446a7f7dc43f6a77409efeb9733d2fa65553efef6018ef257c959b73" +checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" dependencies = [ - "heck 0.4.0", + "heck 0.5.0", "proc-macro2", "quote 1.0.37", - "syn 1.0.107", + "syn 2.0.76", ] [[package]] @@ -2383,7 +2399,7 @@ dependencies = [ "parking_lot", "rand 0.8.5", "redis-protocol", - "semver 1.0.23", + "semver", "socket2 0.5.5", "tokio 1.40.0", "tokio-stream", @@ -2398,6 +2414,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + [[package]] name = "futf" version = "0.1.5" @@ -2684,7 +2706,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.0.1", + "indexmap 2.7.0", "slab", "tokio 1.40.0", "tokio-util", @@ -2703,7 +2725,7 @@ dependencies = [ "futures-core", "futures-sink", "http 1.1.0", - "indexmap 2.0.1", + "indexmap 2.7.0", "slab", "tokio 1.40.0", "tokio-util", @@ -2768,6 +2790,12 @@ dependencies = [ "allocator-api2", ] +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" + [[package]] name = "headers" version = "0.4.0" @@ -2831,6 +2859,51 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "hickory-proto" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07698b8420e2f0d6447a436ba999ec85d8fbf2a398bbd737b82cac4a2e96e512" +dependencies = [ + "async-trait", + "cfg-if", + "data-encoding", + "enum-as-inner", + "futures-channel", + "futures-io", + "futures-util", + "idna 0.4.0", + "ipnet", + "once_cell", + "rand 0.8.5", + "thiserror", + "tinyvec", + "tokio 1.40.0", + "tracing", + "url", +] + +[[package]] +name = "hickory-resolver" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28757f23aa75c98f254cf0405e6d8c25b831b32921b050a66692427679b1f243" +dependencies = [ + "cfg-if", + "futures-util", + "hickory-proto", + "ipconfig", + "lru-cache", + "once_cell", + "parking_lot", + "rand 0.8.5", + "resolv-conf", + "smallvec", + "thiserror", + "tokio 1.40.0", + "tracing", +] + [[package]] name = "hkdf" version = "0.12.3" @@ -3143,6 +3216,16 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "idna" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "idna" version = "0.5.0" @@ -3223,12 +3306,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.0.1" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad227c3af19d4914570ad36d30409928b75967c298feb9ea1969db3a610bb14e" +checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" dependencies = [ "equivalent", - "hashbrown 0.14.0", + "hashbrown 0.15.2", "serde", ] @@ -4048,59 +4131,71 @@ dependencies = [ "once_cell", "parking_lot", "quanta", - "rustc_version 0.4.0", + "rustc_version", "smallvec", "tagptr", "thiserror", "triomphe", - "uuid 1.4.1", + "uuid", ] [[package]] name = "mongodb" -version = "2.2.2" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28f3943e379e9dcaaab9dc319c308a8caaf9e7ff083c6838dff740afbba59df7" +checksum = "c857d71f918b38221baf2fdff7207fec9984b4504901544772b1edf0302d669f" dependencies = [ - "async-std", - "async-std-resolver", "async-trait", "base64 0.13.0", "bitflags 1.3.2", "bson", "chrono", "derivative", + "derive_more", "futures-core", "futures-executor", + "futures-io", "futures-util", "hex", + "hickory-proto", + "hickory-resolver", "hmac", - "lazy_static", "md-5", - "os_info", + "mongodb-internal-macros", + "once_cell", "pbkdf2", "percent-encoding", "rand 0.8.5", "rustc_version_runtime", - "rustls 0.20.6", - "rustls-pemfile 0.3.0", + "rustls 0.21.12", + "rustls-pemfile 1.0.4", "serde", + "serde_bytes", "serde_with", "sha-1 0.10.0", "sha2", - "socket2 0.4.4", + "socket2 0.5.5", "stringprep", - "strsim 0.10.0", + "strsim 0.11.1", "take_mut", "thiserror", "tokio 1.40.0", - "tokio-rustls 0.23.4", + "tokio-rustls 0.24.1", "tokio-util", - "trust-dns-proto", - "trust-dns-resolver", "typed-builder", - "uuid 0.8.2", - "webpki-roots 0.22.3", + "uuid", + "webpki-roots 0.25.4", +] + +[[package]] +name = "mongodb-internal-macros" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a6dbc533e93429a71c44a14c04547ac783b56d3f22e6c4f12b1b994cf93844e" +dependencies = [ + "proc-macro2", + "quote 1.0.37", + "syn 2.0.76", ] [[package]] @@ -4165,7 +4260,7 @@ dependencies = [ "libloading", "neon-macros", "once_cell", - "semver 1.0.23", + "semver", "send_wrapper", "smallvec", ] @@ -4272,6 +4367,12 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + [[package]] name = "num-derive" version = "0.4.2" @@ -4549,9 +4650,9 @@ checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" [[package]] name = "pbkdf2" -version = "0.10.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271779f35b581956db91a3e55737327a03aa051e90b1c47aeb189508533adfd7" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" dependencies = [ "digest 0.10.7", ] @@ -4867,6 +4968,12 @@ dependencies = [ "universal-hash", ] +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "ppv-lite86" version = "0.2.16" @@ -5041,6 +5148,12 @@ version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fee2dce59f7a43418e3382c766554c614e06a552d53a8f07ef499ea4b332c0f" +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + [[package]] name = "rand" version = "0.6.5" @@ -5757,6 +5870,7 @@ version = "0.7.19" dependencies = [ "indexmap 1.9.3", "iso8601-timestamp 0.2.11", + "num_enum 0.6.1", "once_cell", "regex", "revolt-config", @@ -6013,7 +6127,7 @@ dependencies = [ "either", "figment", "futures", - "indexmap 2.0.1", + "indexmap 2.7.0", "log", "memchr", "multer", @@ -6039,9 +6153,7 @@ dependencies = [ [[package]] name = "rocket_authifier" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "810753b79106c44a4e76247fc7576b660663133a9e8f4b0afeb303589ec51d59" +version = "1.0.10" dependencies = [ "authifier", "iso8601-timestamp 0.1.10", @@ -6061,7 +6173,7 @@ checksum = "575d32d7ec1a9770108c879fc7c47815a80073f96ca07ff9525a94fcede1dd46" dependencies = [ "devise", "glob", - "indexmap 2.0.1", + "indexmap 2.7.0", "proc-macro2", "quote 1.0.37", "rocket_http", @@ -6108,7 +6220,7 @@ dependencies = [ "futures", "http 0.2.12", "hyper 0.14.30", - "indexmap 2.0.1", + "indexmap 2.7.0", "log", "memchr", "pear", @@ -6200,32 +6312,23 @@ version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" -[[package]] -name = "rustc_version" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -dependencies = [ - "semver 0.9.0", -] - [[package]] name = "rustc_version" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 1.0.23", + "semver", ] [[package]] name = "rustc_version_runtime" -version = "0.2.1" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d31b7153270ebf48bf91c65ae5b0c00e749c4cfad505f66530ac74950249582f" +checksum = "2dd18cd2bae1820af0b6ad5e54f4a51d0f3fcc53b05f845675074efcc7af071d" dependencies = [ - "rustc_version 0.2.3", - "semver 0.9.0", + "rustc_version", + "semver", ] [[package]] @@ -6241,18 +6344,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "rustls" -version = "0.20.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aab8ee6c7097ed6057f43c187a62418d0c05a4bd5f18b3571db50ee0f9ce033" -dependencies = [ - "log", - "ring 0.16.20", - "sct", - "webpki", -] - [[package]] name = "rustls" version = "0.21.12" @@ -6291,15 +6382,6 @@ dependencies = [ "security-framework", ] -[[package]] -name = "rustls-pemfile" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ee86d63972a7c661d1536fefe8c3c8407321c3df668891286de28abcd087360" -dependencies = [ - "base64 0.13.0", -] - [[package]] name = "rustls-pemfile" version = "1.0.4" @@ -6522,27 +6604,12 @@ dependencies = [ "smallvec", ] -[[package]] -name = "semver" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" -dependencies = [ - "semver-parser", -] - [[package]] name = "semver" version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" -[[package]] -name = "semver-parser" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" - [[package]] name = "send_wrapper" version = "0.6.0" @@ -6589,7 +6656,7 @@ dependencies = [ "hostname", "libc", "os_info", - "rustc_version 0.4.0", + "rustc_version", "sentry-core", "uname", ] @@ -6654,7 +6721,7 @@ dependencies = [ "thiserror", "time", "url", - "uuid 1.4.1", + "uuid", ] [[package]] @@ -6751,24 +6818,32 @@ dependencies = [ [[package]] name = "serde_with" -version = "1.14.0" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "678b5a069e50bf00ecd22d0cd8ddf7c236f68581b03db652061ed5eb13a312ff" +checksum = "8e28bdad6db2b8340e449f7108f020b3b092e8583a9e3fb82713e1d4e71fe817" dependencies = [ + "base64 0.22.1", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.7.0", "serde", + "serde_derive", + "serde_json", "serde_with_macros", + "time", ] [[package]] name = "serde_with_macros" -version = "1.5.2" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e182d6ec6f05393cc0e5ed1bf81ad6db3a8feedf8ee515ecdd369809bcce8082" +checksum = "9d846214a9854ef724f3da161b426242d8de7c1fc7de2f89bb1efcb154dca79d" dependencies = [ - "darling 0.13.4", + "darling 0.20.10", "proc-macro2", "quote 1.0.37", - "syn 1.0.107", + "syn 2.0.76", ] [[package]] @@ -7241,6 +7316,12 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "target-lexicon" version = "0.12.16" @@ -7322,13 +7403,16 @@ dependencies = [ [[package]] name = "time" -version = "0.3.17" +version = "0.3.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a561bf4617eebd33bca6434b988f39ed798e527f51a1e797d0ee4f61c0a38376" +checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" dependencies = [ + "deranged", "itoa", "libc", + "num-conv", "num_threads", + "powerfmt", "serde", "time-core", "time-macros", @@ -7336,16 +7420,17 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.0" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.6" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d967f99f534ca7e495c575c62638eebc2898a8c84c119b89e250477bc4ba16b2" +checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" dependencies = [ + "num-conv", "time-core", ] @@ -7440,17 +7525,6 @@ dependencies = [ "tokio 1.40.0", ] -[[package]] -name = "tokio-rustls" -version = "0.23.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" -dependencies = [ - "rustls 0.20.6", - "tokio 1.40.0", - "webpki", -] - [[package]] name = "tokio-rustls" version = "0.24.1" @@ -7534,7 +7608,7 @@ version = "0.22.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" dependencies = [ - "indexmap 2.0.1", + "indexmap 2.7.0", "serde", "serde_spanned", "toml_datetime", @@ -7675,51 +7749,6 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "859eb650cfee7434994602c3a68b25d77ad9e68c8a6cd491616ef86661382eb3" -[[package]] -name = "trust-dns-proto" -version = "0.21.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c31f240f59877c3d4bb3b3ea0ec5a6a0cff07323580ff8c7a605cd7d08b255d" -dependencies = [ - "async-trait", - "cfg-if", - "data-encoding", - "enum-as-inner", - "futures-channel", - "futures-io", - "futures-util", - "idna 0.2.3", - "ipnet", - "lazy_static", - "log", - "rand 0.8.5", - "smallvec", - "thiserror", - "tinyvec", - "tokio 1.40.0", - "url", -] - -[[package]] -name = "trust-dns-resolver" -version = "0.21.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4ba72c2ea84515690c9fcef4c6c660bb9df3036ed1051686de84605b74fd558" -dependencies = [ - "cfg-if", - "futures-util", - "ipconfig", - "lazy_static", - "log", - "lru-cache", - "parking_lot", - "resolv-conf", - "smallvec", - "thiserror", - "tokio 1.40.0", - "trust-dns-proto", -] - [[package]] name = "try-lock" version = "0.2.3" @@ -8032,7 +8061,7 @@ version = "4.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5afb1a60e207dca502682537fefcfd9921e71d0b83e9576060f09abc6efab23" dependencies = [ - "indexmap 2.0.1", + "indexmap 2.7.0", "serde", "serde_json", "utoipa-gen", @@ -8064,16 +8093,6 @@ dependencies = [ "utoipa", ] -[[package]] -name = "uuid" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" -dependencies = [ - "getrandom", - "serde", -] - [[package]] name = "uuid" version = "1.4.1" @@ -8181,7 +8200,7 @@ dependencies = [ "enum-iterator", "getset", "git2", - "rustc_version 0.4.0", + "rustc_version", "rustversion", "sysinfo", "thiserror", @@ -8347,24 +8366,11 @@ dependencies = [ "libwebp-sys", ] -[[package]] -name = "webpki" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" -dependencies = [ - "ring 0.16.20", - "untrusted 0.7.1", -] - [[package]] name = "webpki-roots" -version = "0.22.3" +version = "0.25.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d8de8415c823c8abd270ad483c6feeac771fad964890779f9a8cb24fbbc1bf" -dependencies = [ - "webpki", -] +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" [[package]] name = "webpki-roots" @@ -8664,6 +8670,15 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + [[package]] name = "xmlparser" version = "0.13.6" diff --git a/Cargo.toml b/Cargo.toml index 2779c26bb..7e2ded9d7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,3 +13,5 @@ members = [ [patch.crates-io] redis22 = { package = "redis", version = "0.22.3", git = "https://github.com/revoltchat/redis-rs", rev = "1a41faf356fd21aebba71cea7eb7eb2653e5f0ef" } redis23 = { package = "redis", version = "0.23.1", git = "https://github.com/revoltchat/redis-rs", rev = "f8ca28ab85da59d2ccde526b4d2fb390eff5a5f9" } +authifier = { package = "authifier", version = "1.0.10", path = "../authifier/crates/authifier" } +rocked_authifier = { package = "rocket_authifier", version = "1.0.10", path = "../authifier/crates/rocket_authifier" } diff --git a/crates/bonfire/Cargo.toml b/crates/bonfire/Cargo.toml index c91723b32..3cf0bdef4 100644 --- a/crates/bonfire/Cargo.toml +++ b/crates/bonfire/Cargo.toml @@ -36,7 +36,7 @@ async-std = { version = "1.8.0", features = [ ] } # core -authifier = { version = "1.0.9" } +authifier = { version = "1.0.10" } revolt-result = { path = "../core/result" } revolt-models = { path = "../core/models" } revolt-config = { path = "../core/config" } diff --git a/crates/core/database/Cargo.toml b/crates/core/database/Cargo.toml index 2be799feb..9ec40ca3e 100644 --- a/crates/core/database/Cargo.toml +++ b/crates/core/database/Cargo.toml @@ -64,7 +64,7 @@ redis-kiss = { version = "0.1.4" } # Database bson = { optional = true, version = "2.1.0" } -mongodb = { optional = true, version = "2.1.0", default-features = false } +mongodb = { optional = true, version = "3.1.0" } # Database Migration unicode-segmentation = "1.10.1" @@ -96,7 +96,7 @@ web-push = "0.10.0" revolt_a2 = { version = "0.10", default-features = false, features = ["ring"] } # Authifier -authifier = { version = "1.0.9", features = ["rocket_impl"] } +authifier = { version = "1.0.10", features = ["rocket_impl"] } # RabbitMQ amqprs = { version = "1.7.0" } diff --git a/crates/core/database/src/drivers/mongodb.rs b/crates/core/database/src/drivers/mongodb.rs index a4bbe56bd..64a2250bb 100644 --- a/crates/core/database/src/drivers/mongodb.rs +++ b/crates/core/database/src/drivers/mongodb.rs @@ -31,17 +31,17 @@ impl MongoDb { } /// Get a collection by its name - pub fn col(&self, collection: &str) -> mongodb::Collection { + pub fn col(&self, collection: &str) -> mongodb::Collection { self.db().collection(collection) } /// Insert one document into a collection - pub async fn insert_one( + pub async fn insert_one( &self, collection: &'static str, document: T, ) -> Result { - self.col::(collection).insert_one(document, None).await + self.col::(collection).insert_one(document).await } /// Count documents by projection @@ -51,7 +51,7 @@ impl MongoDb { projection: Document, ) -> Result { self.col::(collection) - .count_documents(projection, None) + .count_documents(projection) .await } @@ -67,7 +67,8 @@ impl MongoDb { { Ok(self .col::(collection) - .find(projection, options) + .find(projection) + .with_options(options) .await? .filter_map(|s| async { if cfg!(debug_assertions) { @@ -101,7 +102,8 @@ impl MongoDb { O: Into>, { self.col::(collection) - .find_one(projection, options) + .find_one(projection) + .with_options(options) .await } @@ -165,7 +167,7 @@ impl MongoDb { }; self.col::(collection) - .update_one(projection, query, None) + .update_one(projection, query) .await } @@ -200,7 +202,7 @@ impl MongoDb { projection: Document, ) -> Result { self.col::(collection) - .delete_one(projection, None) + .delete_one(projection) .await } diff --git a/crates/core/database/src/models/admin_migrations/ops/mongodb.rs b/crates/core/database/src/models/admin_migrations/ops/mongodb.rs index cdc684e93..703e378af 100644 --- a/crates/core/database/src/models/admin_migrations/ops/mongodb.rs +++ b/crates/core/database/src/models/admin_migrations/ops/mongodb.rs @@ -10,7 +10,7 @@ impl AbstractMigrations for MongoDb { #[cfg(test)] /// Drop the database async fn drop_database(&self) { - self.db().drop(None).await.ok(); + self.db().drop().await.ok(); } /// Migrate the database @@ -18,7 +18,7 @@ impl AbstractMigrations for MongoDb { info!("Migrating the database."); let list = self - .list_database_names(None, None) + .list_database_names() .await .expect("Failed to fetch database names."); diff --git a/crates/core/database/src/models/admin_migrations/ops/mongodb/init.rs b/crates/core/database/src/models/admin_migrations/ops/mongodb/init.rs index ab25819b5..00fe26b8b 100644 --- a/crates/core/database/src/models/admin_migrations/ops/mongodb/init.rs +++ b/crates/core/database/src/models/admin_migrations/ops/mongodb/init.rs @@ -8,278 +8,254 @@ pub async fn create_database(db: &MongoDb) { info!("Creating database."); let db = db.db(); - db.create_collection("accounts", None) + db.create_collection("accounts") .await .expect("Failed to create accounts collection."); - db.create_collection("users", None) + db.create_collection("users") .await .expect("Failed to create users collection."); - db.create_collection("channels", None) + db.create_collection("channels") .await .expect("Failed to create channels collection."); - db.create_collection("messages", None) + db.create_collection("messages") .await .expect("Failed to create messages collection."); - db.create_collection("servers", None) + db.create_collection("servers") .await .expect("Failed to create servers collection."); - db.create_collection("server_members", None) + db.create_collection("server_members") .await .expect("Failed to create server_members collection."); - db.create_collection("server_bans", None) + db.create_collection("server_bans") .await .expect("Failed to create server_bans collection."); - db.create_collection("channel_invites", None) + db.create_collection("channel_invites") .await .expect("Failed to create channel_invites collection."); - db.create_collection("channel_unreads", None) + db.create_collection("channel_unreads") .await .expect("Failed to create channel_unreads collection."); - db.create_collection("channel_webhooks", None) + db.create_collection("channel_webhooks") .await .expect("Failed to create channel_webhooks collection."); - db.create_collection("migrations", None) + db.create_collection("migrations") .await .expect("Failed to create migrations collection."); - db.create_collection("attachments", None) + db.create_collection("attachments") .await .expect("Failed to create attachments collection."); - db.create_collection("attachment_hashes", None) + db.create_collection("attachment_hashes") .await .expect("Failed to create attachment_hashes collection."); - db.create_collection("user_settings", None) + db.create_collection("user_settings") .await .expect("Failed to create user_settings collection."); - db.create_collection("safety_reports", None) + db.create_collection("safety_reports") .await .expect("Failed to create safety_reports collection."); - db.create_collection("safety_snapshots", None) + db.create_collection("safety_snapshots") .await .expect("Failed to create safety_snapshots collection."); - db.create_collection("safety_strikes", None) + db.create_collection("safety_strikes") .await .expect("Failed to create safety_strikes collection."); - db.create_collection("bots", None) + db.create_collection("bots") .await .expect("Failed to create bots collection."); - db.create_collection("ratelimit_events", None) + db.create_collection("ratelimit_events") .await .expect("Failed to create ratelimit_events collection."); - db.create_collection( - "pubsub", - CreateCollectionOptions::builder() - .capped(true) - .size(1_000_000) - .build(), - ) - .await - .expect("Failed to create pubsub collection."); + db.create_collection("pubsub") + .with_options( + CreateCollectionOptions::builder() + .capped(true) + .size(1_000_000) + .build(), + ) + .await + .expect("Failed to create pubsub collection."); - db.run_command( - doc! { - "createIndexes": "users", - "indexes": [ - { - "key": { - "username": 1_i32 - }, - "name": "username", - "unique": false, - "collation": { - "locale": "en", - "strength": 2_i32 - } + db.run_command(doc! { + "createIndexes": "users", + "indexes": [ + { + "key": { + "username": 1_i32 }, - { - "key": { - "username": 1_i32, - "discriminator": 1_i32 - }, - "name": "username_discriminator", - "unique": true, - "collation": { - "locale": "en", - "strength": 2_i32 - } + "name": "username", + "unique": false, + "collation": { + "locale": "en", + "strength": 2_i32 } - ] - }, - None, - ) + }, + { + "key": { + "username": 1_i32, + "discriminator": 1_i32 + }, + "name": "username_discriminator", + "unique": true, + "collation": { + "locale": "en", + "strength": 2_i32 + } + } + ] + }) .await .expect("Failed to create username index."); - db.run_command( - doc! { - "createIndexes": "messages", - "indexes": [ - { - "key": { - "content": "text" - }, - "name": "content" + db.run_command(doc! { + "createIndexes": "messages", + "indexes": [ + { + "key": { + "content": "text" }, - { - "key": { - "channel": 1_i32, - "_id": 1_i32 - }, - "name": "channel_id_compound" + "name": "content" + }, + { + "key": { + "channel": 1_i32, + "_id": 1_i32 }, - { - "key": { - "author": 1_i32 - }, - "name": "author" + "name": "channel_id_compound" + }, + { + "key": { + "author": 1_i32 }, - { - "key": { - "channel": 1_i32, - "pinned": 1_i32 - }, - "name": "channel_pinned_compound" + "name": "author" + }, + { + "key": { + "channel": 1_i32, + "pinned": 1_i32 }, - ] - }, - None, - ) + "name": "channel_pinned_compound" + }, + ] + }) .await .expect("Failed to create message index."); - db.run_command( - doc! { - "createIndexes": "channel_unreads", - "indexes": [ - { - "key": { - "_id.channel": 1_i32, - "_id.user": 1_i32, - }, - "name": "compound_id" + db.run_command(doc! { + "createIndexes": "channel_unreads", + "indexes": [ + { + "key": { + "_id.channel": 1_i32, + "_id.user": 1_i32, }, - { - "key": { - "_id.user": 1_i32, - }, - "name": "user_id" - } - ] - }, - None, - ) + "name": "compound_id" + }, + { + "key": { + "_id.user": 1_i32, + }, + "name": "user_id" + } + ] + }) .await .expect("Failed to create channel_unreads index."); - db.run_command( - doc! { - "createIndexes": "server_members", - "indexes": [ - { - "key": { - "_id.server": 1_i32, - "_id.user": 1_i32, - }, - "name": "compound_id" + db.run_command(doc! { + "createIndexes": "server_members", + "indexes": [ + { + "key": { + "_id.server": 1_i32, + "_id.user": 1_i32, }, - { - "key": { - "_id.user": 1_i32, - }, - "name": "user_id" - } - ] - }, - None, - ) + "name": "compound_id" + }, + { + "key": { + "_id.user": 1_i32, + }, + "name": "user_id" + } + ] + }) .await .expect("Failed to create server_members index."); - db.run_command( - doc! { - "createIndexes": "attachments", - "indexes": [ - { - "key": { - "hash": 1_i32 - }, - "name": "hash" + db.run_command(doc! { + "createIndexes": "attachments", + "indexes": [ + { + "key": { + "hash": 1_i32 }, - { - "key": { - "used_for.id": 1_i32 - }, - "name": "used_for_id" - } - ] - }, - None, - ) + "name": "hash" + }, + { + "key": { + "used_for.id": 1_i32 + }, + "name": "used_for_id" + } + ] + }) .await .expect("Failed to create attachments index."); - db.run_command( - doc! { - "createIndexes": "attachment_hashes", - "indexes": [ - { - "key": { - "processed_hash": 1_i32 - }, - "name": "processed_hash" - } - ] - }, - None, - ) + db.run_command(doc! { + "createIndexes": "attachment_hashes", + "indexes": [ + { + "key": { + "processed_hash": 1_i32 + }, + "name": "processed_hash" + } + ] + }) .await .expect("Failed to create attachment_hashes index."); db.collection("migrations") - .insert_one( - doc! { - "_id": 0_i32, - "revision": LATEST_REVISION - }, - None, - ) + .insert_one(doc! { + "_id": 0_i32, + "revision": LATEST_REVISION + }) .await .expect("Failed to save migration info."); - db.run_command( - doc! { - "createIndexes": "ratelimit_events", - "indexes": [ - { - "key": { - "_id": 1_i32, - "target_id": 1_i32, - "event_type": 1_i32, - }, - "name": "compound_key" - } - ] - }, - None, - ) + db.run_command(doc! { + "createIndexes": "ratelimit_events", + "indexes": [ + { + "key": { + "_id": 1_i32, + "target_id": 1_i32, + "event_type": 1_i32, + }, + "name": "compound_key" + } + ] + }) .await .expect("Failed to create ratelimit_events index."); diff --git a/crates/core/database/src/models/admin_migrations/ops/mongodb/scripts.rs b/crates/core/database/src/models/admin_migrations/ops/mongodb/scripts.rs index 7780037e3..d4cf934d7 100644 --- a/crates/core/database/src/models/admin_migrations/ops/mongodb/scripts.rs +++ b/crates/core/database/src/models/admin_migrations/ops/mongodb/scripts.rs @@ -26,7 +26,7 @@ pub const LATEST_REVISION: i32 = 31; pub async fn migrate_database(db: &MongoDb) { let migrations = db.col::("migrations"); let data = migrations - .find_one(None, None) + .find_one(Document::new()) .await .expect("Failed to fetch migration data."); @@ -46,7 +46,6 @@ pub async fn migrate_database(db: &MongoDb) { "revision": revision } }, - None, ) .await .expect("Failed to commit migration information."); @@ -74,7 +73,6 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { .update_many( doc! { "attachment": { "$exists": 1_i32 } }, doc! { "$set": { "attachment.tag": "attachments", "attachment.size": 0_i32 } }, - None, ) .await .expect("Failed to update messages."); @@ -83,7 +81,6 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { .update_many( doc! {}, doc! { "$set": { "tag": "attachments", "size": 0_i32 } }, - None, ) .await .expect("Failed to update attachments."); @@ -93,7 +90,7 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { info!("Running migration [revision 2 / 2021-05-08]: Add servers collection."); db.db() - .create_collection("servers", None) + .create_collection("servers") .await .expect("Failed to create servers collection."); } @@ -103,12 +100,12 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { let messages = db.col::("messages"); let mut cursor = messages - .find( - doc! { - "attachment": { - "$exists": 1_i32 - } - }, + .find(doc! { + "attachment": { + "$exists": 1_i32 + } + }) + .with_options( FindOptions::builder() .projection(doc! { "_id": 1_i32, @@ -128,19 +125,18 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { .update_one( doc! { "_id": id }, doc! { "$unset": { "attachment": 1_i32 }, "$set": { "attachments": attachments } }, - None, ) .await .unwrap(); } db.db() - .create_collection("channel_unreads", None) + .create_collection("channel_unreads") .await .expect("Failed to create channel_unreads collection."); db.db() - .create_collection("user_settings", None) + .create_collection("user_settings") .await .expect("Failed to create user_settings collection."); } @@ -149,17 +145,17 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { info!("Running migration [revision 4 / 2021-06-01]: Add more server collections."); db.db() - .create_collection("server_members", None) + .create_collection("server_members") .await .expect("Failed to create server_members collection."); db.db() - .create_collection("server_bans", None) + .create_collection("server_bans") .await .expect("Failed to create server_bans collection."); db.db() - .create_collection("channel_invites", None) + .create_collection("channel_invites") .await .expect("Failed to create channel_invites collection."); } @@ -182,7 +178,6 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { doc! { "$set": to_document(&server).unwrap() }, - None, ) .await .expect("Failed to migrate servers."); @@ -192,20 +187,17 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { info!("Running migration [revision 6 / 2021-07-09]: Add message text index."); db.db() - .run_command( - doc! { - "createIndexes": "messages", - "indexes": [ - { - "key": { - "content": "text" - }, - "name": "content" - } - ] - }, - None, - ) + .run_command(doc! { + "createIndexes": "messages", + "indexes": [ + { + "key": { + "content": "text" + }, + "name": "content" + } + ] + }) .await .expect("Failed to create message index."); } @@ -214,7 +206,7 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { info!("Running migration [revision 7 / 2021-08-11]: Add message text index."); db.db() - .create_collection("bots", None) + .create_collection("bots") .await .expect("Failed to create bots collection."); } @@ -223,22 +215,15 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { info!("Running migration [revision 8 / 2021-09-10]: Update to Authifier version 1."); db.db() - .run_command( - doc! { - "dropIndexes": "accounts", - "index": ["email", "email_normalised"] - }, - None, - ) + .run_command(doc! { + "dropIndexes": "accounts", + "index": ["email", "email_normalised"] + }) .await .expect("Failed to delete legacy account indexes."); let col = db.col::("sessions"); - let mut cursor = db - .col::("accounts") - .find(doc! {}, None) - .await - .unwrap(); + let mut cursor = db.col::("accounts").find(doc! {}).await.unwrap(); while let Some(doc) = cursor.next().await { if let Ok(account) = doc { @@ -267,7 +252,7 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { doc.insert("subscription", sub); } - col.insert_one(doc, None).await.ok(); + col.insert_one(doc).await.ok(); } } else { info!("Account doesn't have any sessions!"); @@ -288,7 +273,6 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { } } }, - None, ) .await .unwrap(); @@ -297,11 +281,7 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { if revision <= 9 { info!("Running migration [revision 9 / 2021-09-14]: Switch from last_message to last_message_id."); - let mut cursor = db - .col::("channels") - .find(doc! {}, None) - .await - .unwrap(); + let mut cursor = db.col::("channels").find(doc! {}).await.unwrap(); while let Some(doc) = cursor.next().await { if let Ok(channel) = doc { @@ -340,7 +320,6 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { "last_message": 1_i32, } }, - None, ) .await .unwrap(); @@ -362,7 +341,6 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { "nonce": 1_i32, } }, - None, ) .await .unwrap(); @@ -375,7 +353,6 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { "nonce": 1_i32, } }, - None, ) .await .unwrap(); @@ -385,70 +362,61 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { info!("Running migration [revision 11 / 2021-11-14]: Add indexes to database."); db.db() - .run_command( - doc! { - "createIndexes": "messages", - "indexes": [ - { - "key": { - "channel": 1_i32 - }, - "name": "channel" - } - ] - }, - None, - ) + .run_command(doc! { + "createIndexes": "messages", + "indexes": [ + { + "key": { + "channel": 1_i32 + }, + "name": "channel" + } + ] + }) .await .expect("Failed to create message index."); db.db() - .run_command( - doc! { - "createIndexes": "channel_unreads", - "indexes": [ - { - "key": { - "_id.channel": 1_i32, - "_id.user": 1_i32, - }, - "name": "compound_id" + .run_command(doc! { + "createIndexes": "channel_unreads", + "indexes": [ + { + "key": { + "_id.channel": 1_i32, + "_id.user": 1_i32, }, - { - "key": { - "_id.user": 1_i32, - }, - "name": "user_id" - } - ] - }, - None, - ) + "name": "compound_id" + }, + { + "key": { + "_id.user": 1_i32, + }, + "name": "user_id" + } + ] + }) .await .expect("Failed to create channel_unreads index."); db.db() - .run_command( - doc! { - "createIndexes": "server_members", - "indexes": [ - { - "key": { - "_id.server": 1_i32, - "_id.user": 1_i32, - }, - "name": "compound_id" + .run_command(doc! { + "createIndexes": "server_members", + "indexes": [ + { + "key": { + "_id.server": 1_i32, + "_id.user": 1_i32, }, - { - "key": { - "_id.user": 1_i32, - }, - "name": "user_id" - } - ] - }, - None, - ) + "name": "compound_id" + }, + { + "key": { + "_id.user": 1_i32, + }, + "name": "user_id" + } + ] + }) .await .expect("Failed to create server_members index."); } @@ -457,21 +425,18 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { info!("Running migration [revision 12 / 2021-11-21]: Add indexes to database."); db.db() - .run_command( - doc! { - "createIndexes": "messages", - "indexes": [ - { - "key": { - "channel": 1_i32, - "_id": 1_i32 - }, - "name": "channel_id_compound" - } - ] - }, - None, - ) + .run_command(doc! { + "createIndexes": "messages", + "indexes": [ + { + "key": { + "channel": 1_i32, + "_id": 1_i32 + }, + "name": "channel_id_compound" + } + ] + }) .await .expect("Failed to create message index."); } @@ -485,7 +450,7 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { async_std::task::sleep(Duration::from_secs(10)).await; let servers = db.col::("servers"); - let mut cursor = servers.find(doc! {}, None).await.unwrap(); + let mut cursor = servers.find(doc! {}).await.unwrap(); while let Some(Ok(mut document)) = cursor.next().await { let id = document.get_str("_id").unwrap().to_string(); @@ -529,13 +494,13 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { } servers - .update_one(doc! { "_id": id }, doc! { "$set": update }, None) + .update_one(doc! { "_id": id }, doc! { "$set": update }) .await .unwrap(); } let channels = db.col::("channels"); - let mut cursor = channels.find(doc! {}, None).await.unwrap(); + let mut cursor = channels.find(doc! {}).await.unwrap(); while let Some(Ok(document)) = cursor.next().await { let id = document.get_str("_id").unwrap().to_string(); @@ -575,7 +540,7 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { } channels - .update_one(doc! { "_id": id }, update, None) + .update_one(doc! { "_id": id }, update) .await .unwrap(); } @@ -596,7 +561,6 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { "content": "system" } }, - None, ) .await .unwrap(); @@ -621,25 +585,22 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { .unwrap(); db.db() - .create_collection("emojis", None) + .create_collection("emojis") .await .expect("Failed to create emojis collection."); db.db() - .run_command( - doc! { - "createIndexes": "emojis", - "indexes": [ - { - "key": { - "parent.id": 1_i32, - }, - "name": "parent_id" - } - ] - }, - None, - ) + .run_command(doc! { + "createIndexes": "emojis", + "indexes": [ + { + "key": { + "parent.id": 1_i32, + }, + "name": "parent_id" + } + ] + }) .await .expect("Failed to create emoji parent index."); } @@ -652,10 +613,9 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { doc! {}, doc! { "$set": { - "joined_at": DateTime::now().to_rfc3339_string() + "joined_at": DateTime::now().try_to_rfc3339_string().expect("Failed to convert the date to rfc3339") } }, - None, ) .await .expect("Failed to update server members."); @@ -666,13 +626,10 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { if db .db() - .run_command( - doc! { - "dropIndexes": "messages", - "index": ["channel"] - }, - None, - ) + .run_command(doc! { + "dropIndexes": "messages", + "index": ["channel"] + }) .await .is_err() { @@ -680,20 +637,17 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { } db.db() - .run_command( - doc! { - "createIndexes": "messages", - "indexes": [ - { - "key": { - "author": 1_i32, - }, - "name": "author" - } - ] - }, - None, - ) + .run_command(doc! { + "createIndexes": "messages", + "indexes": [ + { + "key": { + "author": 1_i32, + }, + "name": "author" + } + ] + }) .await .expect("Failed to create messages author index."); } @@ -703,35 +657,26 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { "Running migration [revision 19 / 27-02-2023]: Create report / snapshot collections." ); - db.db() - .create_collection("safety_reports", None) - .await - .unwrap(); + db.db().create_collection("safety_reports").await.unwrap(); - db.db() - .create_collection("safety_snapshots", None) - .await - .unwrap(); + db.db().create_collection("safety_snapshots").await.unwrap(); } if revision <= 20 { info!("Running migration [revision 20 / 28-02-2023]: Add index `snapshot.report_id`."); db.db() - .run_command( - doc! { - "createIndexes": "safety_snapshots", - "indexes": [ - { - "key": { - "report_id": 1_i32 - }, - "name": "report_id" - } - ] - }, - None, - ) + .run_command(doc! { + "createIndexes": "safety_snapshots", + "indexes": [ + { + "key": { + "report_id": 1_i32 + }, + "name": "report_id" + } + ] + }) .await .expect("Failed to create safety snapshot index."); } @@ -739,10 +684,7 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { if revision <= 21 { info!("Running migration [revision 21 / 31-05-2023]: Add collection `safety_strikes`."); - db.db() - .create_collection("safety_strikes", None) - .await - .unwrap(); + db.db().create_collection("safety_strikes").await.unwrap(); } if revision <= 22 { @@ -756,7 +698,6 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { "moderator_id": "01EX2NCWQ0CHS3QJF0FEQS1GR4" } }, - None, ) .await .expect("Failed to update server members."); @@ -766,13 +707,10 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { info!("Running migration [revision 23 / 10-06-2023]: Generate discriminators for users."); db.db() - .run_command( - doc! { - "dropIndexes": "users", - "index": "username" - }, - None, - ) + .run_command(doc! { + "dropIndexes": "users", + "index": "username" + }) .await .expect("Failed to drop existing username index."); @@ -787,7 +725,7 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { let users: Vec = db .col::("users") - .find(doc! {}, None) + .find(doc! {}) .await .unwrap() .map(|doc| doc.expect("id and username")) @@ -839,7 +777,6 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { "discriminator": discriminator } }, - None, ) .await .unwrap(); @@ -887,7 +824,6 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { "display_name": &info.username } }, - None, ) .await .unwrap(); @@ -898,43 +834,37 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { if revision <= 24 { info!("Running migration [revision 24 / 09-06-2023]: Add collection `channel_webhooks` if not exists, update users index."); - db.db() - .create_collection("channel_webhooks", None) - .await - .ok(); + db.db().create_collection("channel_webhooks").await.ok(); db.db() - .run_command( - doc! { - "createIndexes": "users", - "indexes": [ - { - "key": { - "username": 1_i32 - }, - "name": "username", - "unique": false, - "collation": { - "locale": "en", - "strength": 2_i32 - } + .run_command(doc! { + "createIndexes": "users", + "indexes": [ + { + "key": { + "username": 1_i32 }, - { - "key": { - "username": 1_i32, - "discriminator": 1_i32 - }, - "name": "username_discriminator", - "unique": true, - "collation": { - "locale": "en", - "strength": 2_i32 - } + "name": "username", + "unique": false, + "collation": { + "locale": "en", + "strength": 2_i32 } - ] - }, - None, - ) + }, + { + "key": { + "username": 1_i32, + "discriminator": 1_i32 + }, + "name": "username_discriminator", + "unique": true, + "collation": { + "locale": "en", + "strength": 2_i32 + } + } + ] + }) .await .expect("Failed to create username index."); }; @@ -950,7 +880,6 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { "permissions": *DEFAULT_WEBHOOK_PERMISSIONS as i64 } }, - None, ) .await .expect("Failed to update webhooks."); @@ -959,28 +888,22 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { if revision <= 25 { info!("Running migration [revision 25 / 15-06-2023]: Add collection `ratelimit_events` with index."); - db.db() - .create_collection("ratelimit_events", None) - .await - .ok(); + db.db().create_collection("ratelimit_events").await.ok(); db.db() - .run_command( - doc! { - "createIndexes": "ratelimit_events", - "indexes": [ - { - "key": { - "_id": 1_i32, - "target_id": 1_i32, - "event_type": 1_i32, - }, - "name": "compound_key" - } - ] - }, - None, - ) + .run_command(doc! { + "createIndexes": "ratelimit_events", + "indexes": [ + { + "key": { + "_id": 1_i32, + "target_id": 1_i32, + "event_type": 1_i32, + }, + "name": "compound_key" + } + ] + }) .await .expect("Failed to create ratelimit_events index."); } @@ -1016,12 +939,9 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { let invites = db .db() .collection::("channel_invites") - .find( - doc! { - "type": { "$exists": false } - }, - None, - ) + .find(doc! { + "type": { "$exists": false } + }) .await .expect("failed to find invites") .filter_map(|s| async { s.ok() }) @@ -1055,18 +975,15 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { if !invites.is_empty() { db.db() .collection("channel_invites") - .insert_many(invites, None) + .insert_many(invites) .await .expect("failed to insert corrected invite"); db.db() .collection::("channel_invites") - .delete_many( - doc! { - "type": { "$exists": false } - }, - None, - ) + .delete_many(doc! { + "type": { "$exists": false } + }) .await .expect("failed to find invites"); } @@ -1076,21 +993,18 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { info!("Running migration [revision 27 / 21-07-2024]: create message pinned index."); db.db() - .run_command( - doc! { - "createIndexes": "messages", - "indexes": [ - { - "key": { - "channel": 1_i32, - "pinned": 1_i32 - }, - "name": "channel_pinned_compound" - } - ] - }, - None, - ) + .run_command(doc! { + "createIndexes": "messages", + "indexes": [ + { + "key": { + "channel": 1_i32, + "pinned": 1_i32 + }, + "name": "channel_pinned_compound" + } + ] + }) .await .expect("Failed to create message index."); } @@ -1098,44 +1012,35 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { if revision <= 28 { info!("Running migration [revision 28 / 10-09-2024]: Add support for new Autumn."); - db.db() - .create_collection("attachment_hashes", None) - .await - .ok(); + db.db().create_collection("attachment_hashes").await.ok(); db.db() - .run_command( - doc! { - "createIndexes": "attachments", - "indexes": [ - { - "key": { - "hash": 1_i32 - }, - "name": "hash" - } - ] - }, - None, - ) + .run_command(doc! { + "createIndexes": "attachments", + "indexes": [ + { + "key": { + "hash": 1_i32 + }, + "name": "hash" + } + ] + }) .await .expect("Failed to create attachments index."); db.db() - .run_command( - doc! { - "createIndexes": "attachment_hashes", - "indexes": [ - { - "key": { - "processed_hash": 1_i32 - }, - "name": "processed_hash" - } - ] - }, - None, - ) + .run_command(doc! { + "createIndexes": "attachment_hashes", + "indexes": [ + { + "key": { + "processed_hash": 1_i32 + }, + "name": "processed_hash" + } + ] + }) .await .expect("Failed to create attachment_hashes index."); } @@ -1146,20 +1051,17 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { info!("Running migration [revision 30 / 29-09-2024]: Add index for used_for.id to attachments."); db.db() - .run_command( - doc! { - "createIndexes": "attachments", - "indexes": [ - { - "key": { - "used_for.id": 1_i32 - }, - "name": "used_for_id" - } - ] - }, - None, - ) + .run_command(doc! { + "createIndexes": "attachments", + "indexes": [ + { + "key": { + "used_for.id": 1_i32 + }, + "name": "used_for_id" + } + ] + }) .await .expect("Failed to create attachments index."); } @@ -1176,7 +1078,7 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { let webhooks = db .db() .collection::("channel_webhooks") - .find(doc! {}, None) + .find(doc! {}) .await .expect("webhooks") .filter_map(|s| async { s.ok() }) @@ -1207,7 +1109,6 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { "creator_id": creator_id } }, - None, ) .await .expect("update webhook"); @@ -1218,7 +1119,7 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { }) => { db.db() .collection::("channel_webhooks") - .delete_one(doc! { "_id": webhook._id }, None) + .delete_one(doc! { "_id": webhook._id }) .await .expect("failed to delete invalid webhook"); } diff --git a/crates/core/database/src/models/channel_invites/ops/mongodb.rs b/crates/core/database/src/models/channel_invites/ops/mongodb.rs index f6d55fff3..d628be8e6 100644 --- a/crates/core/database/src/models/channel_invites/ops/mongodb.rs +++ b/crates/core/database/src/models/channel_invites/ops/mongodb.rs @@ -24,12 +24,9 @@ impl AbstractChannelInvites for MongoDb { async fn fetch_invites_for_server(&self, server_id: &str) -> Result> { Ok(self .col::(COL) - .find( - doc! { - "server": server_id, - }, - None, - ) + .find(doc! { + "server": server_id, + }) .await .map_err(|_| create_database_error!("find", COL))? .filter_map(|s| async { diff --git a/crates/core/database/src/models/channel_unreads/ops/mongodb.rs b/crates/core/database/src/models/channel_unreads/ops/mongodb.rs index c237afc65..2c90c42cf 100644 --- a/crates/core/database/src/models/channel_unreads/ops/mongodb.rs +++ b/crates/core/database/src/models/channel_unreads/ops/mongodb.rs @@ -37,6 +37,8 @@ impl AbstractChannelUnreads for MongoDb { "last_id": message_id } }, + ) + .with_options( FindOneAndUpdateOptions::builder() .upsert(true) .return_document(ReturnDocument::After) @@ -51,15 +53,12 @@ impl AbstractChannelUnreads for MongoDb { let current_time = Ulid::new().to_string(); self.col::(COL) - .delete_many( - doc! { - "_id.channel": { - "$in": channel_ids - }, - "_id.user": user_id + .delete_many(doc! { + "_id.channel": { + "$in": channel_ids }, - None, - ) + "_id.user": user_id + }) .await .map_err(|_| create_database_error!("delete_many", COL))?; @@ -77,7 +76,6 @@ impl AbstractChannelUnreads for MongoDb { } }) .collect::>(), - None, ) .await .map(|_| ()) @@ -104,8 +102,8 @@ impl AbstractChannelUnreads for MongoDb { } } }, - UpdateOptions::builder().upsert(true).build(), ) + .with_options(UpdateOptions::builder().upsert(true).build()) .await .map(|_| ()) .map_err(|_| create_database_error!("update_one", COL)) diff --git a/crates/core/database/src/models/channel_webhooks/ops/mongodb.rs b/crates/core/database/src/models/channel_webhooks/ops/mongodb.rs index 457e3b685..9e11d561a 100644 --- a/crates/core/database/src/models/channel_webhooks/ops/mongodb.rs +++ b/crates/core/database/src/models/channel_webhooks/ops/mongodb.rs @@ -24,12 +24,9 @@ impl AbstractWebhooks for MongoDb { async fn fetch_webhooks_for_channel(&self, channel_id: &str) -> Result> { Ok(self .col::(COL) - .find( - doc! { - "channel_id": channel_id, - }, - None, - ) + .find(doc! { + "channel_id": channel_id, + }) .await .map_err(|_| create_database_error!("find", COL))? .filter_map(|s| async { diff --git a/crates/core/database/src/models/channels/ops/mongodb.rs b/crates/core/database/src/models/channels/ops/mongodb.rs index 51c6b66e5..b247a6834 100644 --- a/crates/core/database/src/models/channels/ops/mongodb.rs +++ b/crates/core/database/src/models/channels/ops/mongodb.rs @@ -23,14 +23,11 @@ impl AbstractChannels for MongoDb { async fn fetch_channels<'a>(&self, ids: &'a [String]) -> Result> { Ok(self .col::(COL) - .find( - doc! { - "_id": { - "$in": ids - } - }, - None, - ) + .find(doc! { + "_id": { + "$in": ids + } + }) .await .map_err(|_| create_database_error!("fetch", "channels"))? .filter_map(|s| async { @@ -119,7 +116,6 @@ impl AbstractChannels for MongoDb { "recipients": user } }, - None, ) .await .map(|_| ()) @@ -141,7 +137,6 @@ impl AbstractChannels for MongoDb { "role_permissions.".to_owned() + role: permissions } }, - None, ) .await .map(|_| ()) @@ -179,7 +174,6 @@ impl AbstractChannels for MongoDb { "recipients": user } }, - None, ) .await .map(|_| ()) @@ -253,7 +247,6 @@ impl AbstractChannels for MongoDb { "_id": server.id }, update, - None, ) .await .map_err(|_| create_database_error!("update_one", "servers"))?; @@ -274,23 +267,17 @@ impl MongoDb { pub async fn delete_associated_channel_objects(&self, id: Bson) -> Result<()> { // Delete all invites to these channels. self.col::("channel_invites") - .delete_many( - doc! { - "channel": &id - }, - None, - ) + .delete_many(doc! { + "channel": &id + }) .await .map_err(|_| create_database_error!("delete_many", "channel_invites"))?; // Delete unread message objects on channels. self.col::("channel_unreads") - .delete_many( - doc! { - "_id.channel": &id - }, - None, - ) + .delete_many(doc! { + "_id.channel": &id + }) .await .map_err(|_| create_database_error!("delete_many", "channel_unreads")) .map(|_| ())?; @@ -299,12 +286,9 @@ impl MongoDb { // Delete all webhooks on this channel. self.col::("webhooks") - .delete_many( - doc! { - "channel": &id - }, - None, - ) + .delete_many(doc! { + "channel": &id + }) .await .map_err(|_| create_database_error!("delete_many", "webhooks")) .map(|_| ()) diff --git a/crates/core/database/src/models/emojis/ops/mongodb.rs b/crates/core/database/src/models/emojis/ops/mongodb.rs index 168d3db76..6dd3137b7 100644 --- a/crates/core/database/src/models/emojis/ops/mongodb.rs +++ b/crates/core/database/src/models/emojis/ops/mongodb.rs @@ -60,7 +60,6 @@ impl AbstractEmojis for MongoDb { } } }, - None, ) .await .map(|_| ()) diff --git a/crates/core/database/src/models/file_hashes/ops/mongodb.rs b/crates/core/database/src/models/file_hashes/ops/mongodb.rs index c55a06104..af35a7670 100644 --- a/crates/core/database/src/models/file_hashes/ops/mongodb.rs +++ b/crates/core/database/src/models/file_hashes/ops/mongodb.rs @@ -42,7 +42,6 @@ impl AbstractAttachmentHashes for MongoDb { "iv": nonce } }, - None, ) .await .map(|_| ()) diff --git a/crates/core/database/src/models/files/ops/mongodb.rs b/crates/core/database/src/models/files/ops/mongodb.rs index c2295cf3d..69e057a24 100644 --- a/crates/core/database/src/models/files/ops/mongodb.rs +++ b/crates/core/database/src/models/files/ops/mongodb.rs @@ -65,7 +65,6 @@ impl AbstractAttachments for MongoDb { "uploader_id": uploader_id } }, - None, ) .await .map_err(|_| create_database_error!("update_one", COL))?; @@ -85,7 +84,6 @@ impl AbstractAttachments for MongoDb { "reported": true } }, - None, ) .await .map(|_| ()) @@ -104,7 +102,6 @@ impl AbstractAttachments for MongoDb { "deleted": true } }, - None, ) .await .map(|_| ()) @@ -125,7 +122,6 @@ impl AbstractAttachments for MongoDb { "deleted": true } }, - None, ) .await .map(|_| ()) @@ -143,7 +139,6 @@ impl MongoDb { "deleted": true } }, - None, ) .await .map(|_| ()) diff --git a/crates/core/database/src/models/messages/ops/mongodb.rs b/crates/core/database/src/models/messages/ops/mongodb.rs index c10b07b0b..066fe83bb 100644 --- a/crates/core/database/src/models/messages/ops/mongodb.rs +++ b/crates/core/database/src/models/messages/ops/mongodb.rs @@ -228,7 +228,6 @@ impl AbstractMessages for MongoDb { "_id": id }, query, - None, ) .await .map(|_| ()) @@ -247,7 +246,6 @@ impl AbstractMessages for MongoDb { format!("reactions.{emoji}"): user } }, - None, ) .await .map(|_| ()) @@ -266,7 +264,6 @@ impl AbstractMessages for MongoDb { format!("reactions.{emoji}"): user } }, - None, ) .await .map(|_| ()) @@ -285,7 +282,6 @@ impl AbstractMessages for MongoDb { format!("reactions.{emoji}"): 1 } }, - None, ) .await .map(|_| ()) @@ -300,15 +296,12 @@ impl AbstractMessages for MongoDb { /// Delete messages from a channel by their ids and corresponding channel id async fn delete_messages(&self, channel: &str, ids: &[String]) -> Result<()> { self.col::(COL) - .delete_many( - doc! { - "channel": channel, - "_id": { - "$in": ids - } - }, - None, - ) + .delete_many(doc! { + "channel": channel, + "_id": { + "$in": ids + } + }) .await .map(|_| ()) .map_err(|_| create_database_error!("delete_many", COL)) @@ -362,7 +355,6 @@ impl MongoDb { "deleted": true } }, - None, ) .await .map_err(|_| create_database_error!("update_many", "attachments"))?; @@ -370,7 +362,7 @@ impl MongoDb { // And then delete said messages. self.col::(COL) - .delete_many(projection, None) + .delete_many(projection) .await .map(|_| ()) .map_err(|_| create_database_error!("delete_many", COL)) diff --git a/crates/core/database/src/models/ratelimit_events/ops/mongodb.rs b/crates/core/database/src/models/ratelimit_events/ops/mongodb.rs index ed6f0a1bf..29edd64d6 100644 --- a/crates/core/database/src/models/ratelimit_events/ops/mongodb.rs +++ b/crates/core/database/src/models/ratelimit_events/ops/mongodb.rs @@ -23,16 +23,13 @@ impl AbstractRatelimitEvents for MongoDb { count: usize, ) -> Result { self.col::(COL) - .count_documents( - doc! { - "_id": { - "$gte": Ulid::from_datetime(SystemTime::now() - period).to_string() - }, - "target_id": target_id, - "event_type": event_type.to_string() + .count_documents(doc! { + "_id": { + "$gte": Ulid::from_datetime(SystemTime::now() - period).to_string() }, - None, - ) + "target_id": target_id, + "event_type": event_type.to_string() + }) .await .map(|c| c as usize >= count) .map_err(|_| create_database_error!("count_documents", COL)) diff --git a/crates/core/database/src/models/server_members/ops.rs b/crates/core/database/src/models/server_members/ops.rs index 369f43e20..ed92eab6d 100644 --- a/crates/core/database/src/models/server_members/ops.rs +++ b/crates/core/database/src/models/server_members/ops.rs @@ -1,3 +1,4 @@ +use ::mongodb::SessionCursor; use revolt_result::Result; use crate::{FieldsMember, Member, MemberCompositeKey, PartialMember}; @@ -5,6 +6,65 @@ use crate::{FieldsMember, Member, MemberCompositeKey, PartialMember}; mod mongodb; mod reference; +pub enum ChunkedServerMembersGenerator { + #[cfg(feature = "mongodb")] + MongoDb { + session: ::mongodb::ClientSession, + cursor: Option>, + }, + + Reference { + offset: i32, + data: Option>, + }, +} + +impl ChunkedServerMembersGenerator { + #[cfg(feature = "mongodb")] + pub fn new_mongo(session: ::mongodb::ClientSession, cursor: SessionCursor) -> Self { + ChunkedServerMembersGenerator::MongoDb { + session, + cursor: Some(cursor), + } + } + + pub fn new_reference(data: Vec) -> Self { + ChunkedServerMembersGenerator::Reference { + offset: 0, + data: Some(data), + } + } + + pub async fn next(&mut self) -> Option { + match self { + #[cfg(feature = "mongodb")] + ChunkedServerMembersGenerator::MongoDb { session, cursor } => { + if let Some(cursor) = cursor { + let value = cursor.next(session).await; + value.map(|val| val.expect("Faild to fetch the next member")) + } else { + warn!("Attempted to access a (MongoDb) server member generator without first setting a cursor"); + None + } + } + ChunkedServerMembersGenerator::Reference { offset, data } => { + if let Some(data) = data { + if data.len() as i32 >= *offset { + None + } else { + let resp = &data[*offset as usize]; + *offset += 1; + Some(resp.clone()) + } + } else { + warn!("Attempted to access a (Reference) server member generator without first providing data"); + None + } + } + } + } +} + #[async_trait] pub trait AbstractServerMembers: Sync + Send { /// Insert a new server member into the database @@ -16,6 +76,12 @@ pub trait AbstractServerMembers: Sync + Send { /// Fetch all members in a server async fn fetch_all_members<'a>(&self, server_id: &str) -> Result>; + /// Fetch all members in a server as an iterator + async fn fetch_all_members_chunked( + &self, + server_id: &str, + ) -> Result; + /// Fetch all memberships for a user async fn fetch_all_memberships<'a>(&self, user_id: &str) -> Result>; diff --git a/crates/core/database/src/models/server_members/ops/mongodb.rs b/crates/core/database/src/models/server_members/ops/mongodb.rs index 8ab526790..f1c6b849e 100644 --- a/crates/core/database/src/models/server_members/ops/mongodb.rs +++ b/crates/core/database/src/models/server_members/ops/mongodb.rs @@ -1,10 +1,11 @@ use futures::StreamExt; +use mongodb::options::ReadConcern; use revolt_result::Result; use crate::{FieldsMember, Member, MemberCompositeKey, PartialMember}; use crate::{IntoDocumentPath, MongoDb}; -use super::AbstractServerMembers; +use super::{AbstractServerMembers, ChunkedServerMembersGenerator}; static COL: &str = "server_members"; @@ -33,12 +34,9 @@ impl AbstractServerMembers for MongoDb { async fn fetch_all_members<'a>(&self, server_id: &str) -> Result> { Ok(self .col::(COL) - .find( - doc! { - "_id.server": server_id - }, - None, - ) + .find(doc! { + "_id.server": server_id + }) .await .map_err(|_| create_database_error!("find", COL))? .filter_map(|s| async { @@ -52,16 +50,41 @@ impl AbstractServerMembers for MongoDb { .await) } + /// Fetch all members in a server as a generator + async fn fetch_all_members_chunked( + &self, + server_id: &str, + ) -> Result { + let mut session = self + .start_session() + .await + .map_err(|_| create_database_error!("start_session", COL))?; + + session + .start_transaction() + .read_concern(ReadConcern::snapshot()) + .await + .map_err(|_| create_database_error!("start_transaction", COL))?; + + let cursor = self + .col::(COL) + .find(doc! { + "_id.server": server_id + }) + .session(&mut session) + .await + .map_err(|_| create_database_error!("find", COL))?; + + Ok(ChunkedServerMembersGenerator::new_mongo(session, cursor)) + } + /// Fetch all memberships for a user async fn fetch_all_memberships<'a>(&self, user_id: &str) -> Result> { Ok(self .col::(COL) - .find( - doc! { - "_id.user": user_id - }, - None, - ) + .find(doc! { + "_id.user": user_id + }) .await .map_err(|_| create_database_error!("find", COL))? .filter_map(|s| async { @@ -79,15 +102,12 @@ impl AbstractServerMembers for MongoDb { async fn fetch_members<'a>(&self, server_id: &str, ids: &'a [String]) -> Result> { Ok(self .col::(COL) - .find( - doc! { - "_id.server": server_id, - "_id.user": { - "$in": ids - } - }, - None, - ) + .find(doc! { + "_id.server": server_id, + "_id.user": { + "$in": ids + } + }) .await .map_err(|_| create_database_error!("find", COL))? .filter_map(|s| async { @@ -104,12 +124,9 @@ impl AbstractServerMembers for MongoDb { /// Fetch member count of a server async fn fetch_member_count(&self, server_id: &str) -> Result { self.col::(COL) - .count_documents( - doc! { - "_id.server": server_id - }, - None, - ) + .count_documents(doc! { + "_id.server": server_id + }) .await .map(|c| c as usize) .map_err(|_| create_database_error!("count_documents", COL)) @@ -118,12 +135,9 @@ impl AbstractServerMembers for MongoDb { /// Fetch server count of a user async fn fetch_server_count(&self, user_id: &str) -> Result { self.col::(COL) - .count_documents( - doc! { - "_id.user": user_id - }, - None, - ) + .count_documents(doc! { + "_id.user": user_id + }) .await .map(|c| c as usize) .map_err(|_| create_database_error!("count_documents", COL)) diff --git a/crates/core/database/src/models/server_members/ops/reference.rs b/crates/core/database/src/models/server_members/ops/reference.rs index f038477ec..4e6bed242 100644 --- a/crates/core/database/src/models/server_members/ops/reference.rs +++ b/crates/core/database/src/models/server_members/ops/reference.rs @@ -3,7 +3,7 @@ use revolt_result::Result; use crate::ReferenceDb; use crate::{FieldsMember, Member, MemberCompositeKey, PartialMember}; -use super::AbstractServerMembers; +use super::{AbstractServerMembers, ChunkedServerMembersGenerator}; #[async_trait] impl AbstractServerMembers for ReferenceDb { @@ -40,6 +40,23 @@ impl AbstractServerMembers for ReferenceDb { .collect()) } + /// Fetch all members in a server as an iterator + async fn fetch_all_members_chunked( + &self, + server_id: &str, + ) -> Result { + let server_members = self.server_members.lock().await; + + let members = server_members + .clone() + .into_values() + .filter(move |member| member.id.server == server_id) + .collect(); + + // this is inefficient as shit but its the reference db so its fine + Ok(ChunkedServerMembersGenerator::new_reference(members)) + } + /// Fetch all memberships for a user async fn fetch_all_memberships<'a>(&self, user_id: &str) -> Result> { let server_members = self.server_members.lock().await; diff --git a/crates/core/database/src/models/servers/ops/mongodb.rs b/crates/core/database/src/models/servers/ops/mongodb.rs index e6bee03f2..958963c9c 100644 --- a/crates/core/database/src/models/servers/ops/mongodb.rs +++ b/crates/core/database/src/models/servers/ops/mongodb.rs @@ -25,14 +25,11 @@ impl AbstractServers for MongoDb { async fn fetch_servers<'a>(&self, ids: &'a [String]) -> Result> { Ok(self .col::(COL) - .find( - doc! { - "_id": { - "$in": ids - } - }, - None, - ) + .find(doc! { + "_id": { + "$in": ids + } + }) .await .map_err(|_| create_database_error!("find", "servers"))? .filter_map(|s| async { @@ -84,7 +81,6 @@ impl AbstractServers for MongoDb { .map_err(|_| create_database_error!("to_document", "role"))? } }, - None, ) .await .map(|_| ()) @@ -125,7 +121,6 @@ impl AbstractServers for MongoDb { "roles": &role_id } }, - None, ) .await .map_err(|_| create_database_error!("update_many", "server_members"))?; @@ -140,7 +135,6 @@ impl AbstractServers for MongoDb { "role_permissions.".to_owned() + role_id: 1_i32 } }, - None, ) .await .map_err(|_| create_database_error!("update_one", "channels"))?; @@ -155,7 +149,6 @@ impl AbstractServers for MongoDb { "roles.".to_owned() + role_id: 1_i32 } }, - None, ) .await .map(|_| ()) @@ -188,12 +181,9 @@ impl MongoDb { // Find all channels let channels: Vec = self .col::("channels") - .find( - doc! { - "server": server_id - }, - None, - ) + .find(doc! { + "server": server_id + }) .await .map_err(|_| create_database_error!("find", "channels"))? .filter_map(|s| async { @@ -225,19 +215,15 @@ impl MongoDb { } } }, - None, ) .await .map_err(|_| create_database_error!("update_many", "emojis"))?; // Delete all channels. self.col::("channels") - .delete_many( - doc! { - "server": &server_id - }, - None, - ) + .delete_many(doc! { + "server": &server_id + }) .await .map_err(|_| create_database_error!("delete_many", "channels"))?; @@ -248,12 +234,9 @@ impl MongoDb { // Delete members and bans. for with in &["server_members", "server_bans"] { self.col::(with) - .delete_many( - doc! { - "_id.server": &server_id - }, - None, - ) + .delete_many(doc! { + "_id.server": &server_id + }) .await .map_err(|_| create_database_error!("delete_many", with))?; } diff --git a/crates/core/database/src/models/user_settings/ops/mongodb.rs b/crates/core/database/src/models/user_settings/ops/mongodb.rs index 5de988322..cf5bd7622 100644 --- a/crates/core/database/src/models/user_settings/ops/mongodb.rs +++ b/crates/core/database/src/models/user_settings/ops/mongodb.rs @@ -53,8 +53,8 @@ impl AbstractUserSettings for MongoDb { doc! { "$set": set }, - UpdateOptions::builder().upsert(true).build(), ) + .with_options(UpdateOptions::builder().upsert(true).build()) .await .map(|_| ()) .map_err(|_| create_database_error!("update_one", "user_settings")) diff --git a/crates/core/database/src/models/users/ops/mongodb.rs b/crates/core/database/src/models/users/ops/mongodb.rs index ae61b0297..000034c52 100644 --- a/crates/core/database/src/models/users/ops/mongodb.rs +++ b/crates/core/database/src/models/users/ops/mongodb.rs @@ -49,12 +49,9 @@ impl AbstractUsers for MongoDb { /// Fetch a session from the database by token async fn fetch_session_by_token(&self, token: &str) -> Result { self.col::("sessions") - .find_one( - doc! { - "token": token - }, - None, - ) + .find_one(doc! { + "token": token + }) .await .map_err(|_| create_database_error!("find_one", "sessions"))? .ok_or_else(|| create_error!(InvalidSession)) @@ -64,14 +61,11 @@ impl AbstractUsers for MongoDb { async fn fetch_users<'a>(&self, ids: &'a [String]) -> Result> { Ok(self .col::(COL) - .find( - doc! { - "_id": { - "$in": ids - } - }, - None, - ) + .find(doc! { + "_id": { + "$in": ids + } + }) .await .map_err(|_| create_database_error!("find", COL))? .filter_map(|s| async { @@ -94,10 +88,10 @@ impl AbstractUsers for MongoDb { Ok(self .col::(COL) - .find( - doc! { - "username": username - }, + .find(doc! { + "username": username + }) + .with_options( FindOptions::builder() .collation( Collation::builder() @@ -122,15 +116,13 @@ impl AbstractUsers for MongoDb { async fn fetch_mutual_user_ids(&self, user_a: &str, user_b: &str) -> Result> { Ok(self .col::(COL) - .find( - doc! { - "$and": [ - { "relations": { "$elemMatch": { "_id": &user_a, "status": "Friend" } } }, - { "relations": { "$elemMatch": { "_id": &user_b, "status": "Friend" } } } - ] - }, - FindOptions::builder().projection(doc! { "_id": 1 }).build(), - ) + .find(doc! { + "$and": [ + { "relations": { "$elemMatch": { "_id": &user_a, "status": "Friend" } } }, + { "relations": { "$elemMatch": { "_id": &user_b, "status": "Friend" } } } + ] + }) + .with_options(FindOptions::builder().projection(doc! { "_id": 1 }).build()) .await .map_err(|_| create_database_error!("find", COL))? .filter_map(|s| async { s.ok() }) @@ -143,17 +135,15 @@ impl AbstractUsers for MongoDb { async fn fetch_mutual_channel_ids(&self, user_a: &str, user_b: &str) -> Result> { Ok(self .col::("channels") - .find( - doc! { - "channel_type": { - "$in": ["Group", "DirectMessage"] - }, - "recipients": { - "$all": [ user_a, user_b ] - } + .find(doc! { + "channel_type": { + "$in": ["Group", "DirectMessage"] }, - FindOptions::builder().projection(doc! { "_id": 1 }).build(), - ) + "recipients": { + "$all": [ user_a, user_b ] + } + }) + .with_options(FindOptions::builder().projection(doc! { "_id": 1 }).build()) .await .map_err(|_| create_database_error!("find", "channels"))? .filter_map(|s| async { s.ok() }) @@ -166,49 +156,46 @@ impl AbstractUsers for MongoDb { async fn fetch_mutual_server_ids(&self, user_a: &str, user_b: &str) -> Result> { Ok(self .col::("server_members") - .aggregate( - vec![ - doc! { - "$match": { - "_id.user": user_a - } - }, - doc! { - "$lookup": { - "from": "server_members", - "as": "members", - "let": { - "server": "$_id.server" - }, - "pipeline": [ - { - "$match": { - "$expr": { - "$and": [ - { "$eq": [ "$_id.user", user_b ] }, - { "$eq": [ "$_id.server", "$$server" ] } - ] - } + .aggregate(vec![ + doc! { + "$match": { + "_id.user": user_a + } + }, + doc! { + "$lookup": { + "from": "server_members", + "as": "members", + "let": { + "server": "$_id.server" + }, + "pipeline": [ + { + "$match": { + "$expr": { + "$and": [ + { "$eq": [ "$_id.user", user_b ] }, + { "$eq": [ "$_id.server", "$$server" ] } + ] } } - ] - } - }, - doc! { - "$match": { - "members": { - "$size": 1_i32 } + ] + } + }, + doc! { + "$match": { + "members": { + "$size": 1_i32 } - }, - doc! { - "$project": { - "_id": "$_id.server" - } - }, - ], - None, - ) + } + }, + doc! { + "$project": { + "_id": "$_id.server" + } + }, + ]) .await .map_err(|_| create_database_error!("aggregate", "server_members"))? .filter_map(|s| async { s.ok() }) @@ -284,7 +271,6 @@ impl AbstractUsers for MongoDb { } } }], - None, ) .await .map(|_| ()) @@ -305,7 +291,6 @@ impl AbstractUsers for MongoDb { } } }, - None, ) .await .map(|_| ()) @@ -329,7 +314,6 @@ impl AbstractUsers for MongoDb { "subscription": 1 } }, - None, ) .await .map(|_| ()) diff --git a/crates/daemons/pushd/Cargo.toml b/crates/daemons/pushd/Cargo.toml index f27fef600..f9eb4f9c2 100644 --- a/crates/daemons/pushd/Cargo.toml +++ b/crates/daemons/pushd/Cargo.toml @@ -19,7 +19,7 @@ tokio = "1.39.2" async-trait = "0.1.81" ulid = "1.0.0" -authifier = "1.0.8" +authifier = "1.0.10" log = "0.4.11" diff --git a/crates/delta/Cargo.toml b/crates/delta/Cargo.toml index d4ecc97ee..33acc8f0f 100644 --- a/crates/delta/Cargo.toml +++ b/crates/delta/Cargo.toml @@ -55,7 +55,7 @@ lettre = "0.10.0-alpha.4" rocket = { version = "0.5.1", default-features = false, features = ["json"] } rocket_cors = { git = "https://github.com/lawliet89/rocket_cors", rev = "072d90359b23e9b291df6b672c07c93de9c46011" } rocket_empty = { version = "0.1.1", features = ["schema"] } -rocket_authifier = { version = "1.0.9" } +rocket_authifier = { version = "1.0.10" } rocket_prometheus = "0.10.0-rc.3" # spec generation @@ -66,7 +66,7 @@ revolt_rocket_okapi = { version = "0.10.0", features = ["swagger"] } amqprs = { version = "1.7.0" } # core -authifier = "1.0.9" +authifier = "1.0.10" revolt-config = { path = "../core/config" } revolt-database = { path = "../core/database", features = [ "rocket-impl",