diff --git a/.github/workflows/rust.yaml b/.github/workflows/rust.yaml index d41ff722..2aad209b 100644 --- a/.github/workflows/rust.yaml +++ b/.github/workflows/rust.yaml @@ -30,23 +30,26 @@ jobs: run: | docker-compose -f docker-compose.db.yml up -d + - name: Copy .env.example + if: github.event_name != 'pull_request' && github.ref_name == 'master' + run: | + cp .env.example .env + - name: Run cargo test uses: actions-rs/cargo@v1 + env: + TEST_DB: REFERENCE with: command: test - name: Run cargo test (with MongoDB) uses: actions-rs/cargo@v1 env: + TEST_DB: MONGODB MONGODB: mongodb://localhost with: command: test - - name: Copy .env.example - if: github.event_name != 'pull_request' && github.ref_name == 'master' - run: | - cp .env.example .env - - name: Start API in background if: github.event_name != 'pull_request' && github.ref_name == 'master' run: | diff --git a/Cargo.lock b/Cargo.lock index dcceb406..15fe10df 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -347,9 +347,9 @@ dependencies = [ [[package]] name = "authifier" -version = "1.0.7" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a84411393a4326726ead660991ce8047f1865fa89900fb6c18e1e6c513cf1f9b" +checksum = "30269caf0aaf1e1b542b150030e9688bf41d50026e09a51efd9408f332636c9d" dependencies = [ "async-std", "async-trait", @@ -3573,6 +3573,7 @@ version = "0.6.8" dependencies = [ "async-channel", "async-std", + "authifier", "bitfield", "chrono", "dashmap", @@ -3859,9 +3860,9 @@ dependencies = [ [[package]] name = "rocket_authifier" -version = "1.0.7" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4554a81937341d8c3cd3e43431ac2d23624444dc3a88e7ffd3ff66593779293" +checksum = "5f89a12311f60e9288833fc3ce6029bce5d5c61870ceef74d4a50668a8b520ad" dependencies = [ "authifier", "iso8601-timestamp 0.1.10", diff --git a/Cargo.toml b/Cargo.toml index 43356e46..68b44ba0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,3 +5,5 @@ members = ["crates/delta", "crates/bonfire", "crates/quark", "crates/core/*"] # mobc-redis = { git = "https://github.com/insertish/mobc", rev = "8b880bb59f2ba80b4c7bc40c649c113d8857a186" } 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.8", path = "../authifier/crates/authifier" } +# rocket_authifier = { package = "rocket_authifier", version = "1.0.8", path = "../authifier/crates/rocket_authifier" } diff --git a/crates/core/database/Cargo.toml b/crates/core/database/Cargo.toml index 0d67cfda..4e2d7fcd 100644 --- a/crates/core/database/Cargo.toml +++ b/crates/core/database/Cargo.toml @@ -86,4 +86,4 @@ fcm = "0.9.2" web-push = "0.10.0" # Authifier -authifier = { version = "1.0" } +authifier = { version = "1.0.8" } diff --git a/crates/core/database/src/drivers/mod.rs b/crates/core/database/src/drivers/mod.rs index 01dc4455..734a0b50 100644 --- a/crates/core/database/src/drivers/mod.rs +++ b/crates/core/database/src/drivers/mod.rs @@ -1,6 +1,8 @@ mod mongodb; mod reference; +use revolt_config::config; + pub use self::mongodb::*; pub use self::reference::*; @@ -31,25 +33,41 @@ impl DatabaseInfo { /// Create a database client from the given database information #[async_recursion] pub async fn connect(self) -> Result { + let config = config().await; + Ok(match self { DatabaseInfo::Auto => { - if let Ok(uri) = std::env::var("MONGODB") { - return DatabaseInfo::MongoDb { - uri, + if std::env::var("TEST_DB").is_ok() { + DatabaseInfo::Test("revolt_test".to_string()) + .connect() + .await? + } else if !config.database.mongodb.is_empty() { + DatabaseInfo::MongoDb { + uri: config.database.mongodb, database_name: "revolt".to_string(), } .connect() - .await; + .await? + } else { + DatabaseInfo::Reference.connect().await? } - - DatabaseInfo::Reference.connect().await? } DatabaseInfo::Test(database_name) => { - if let Ok(uri) = std::env::var("MONGODB") { - return DatabaseInfo::MongoDb { uri, database_name }.connect().await; + match std::env::var("TEST_DB") + .expect("`TEST_DB` environment variable should be set to REFERENCE or MONGODB") + .as_str() + { + "REFERENCE" => DatabaseInfo::Reference.connect().await?, + "MONGODB" => { + DatabaseInfo::MongoDb { + uri: config.database.mongodb, + database_name, + } + .connect() + .await? + } + _ => unreachable!("must specify REFERENCE or MONGODB"), } - - DatabaseInfo::Reference.connect().await? } DatabaseInfo::Reference => Database::Reference(Default::default()), DatabaseInfo::MongoDb { uri, database_name } => { @@ -65,14 +83,3 @@ impl DatabaseInfo { }) } } - -impl From for authifier::Database { - fn from(value: Database) -> Self { - match value { - Database::Reference(_) => Default::default(), - Database::MongoDb(MongoDb(client, _)) => authifier::Database::MongoDb( - authifier::database::MongoDb(client.database("revolt")), - ), - } - } -} diff --git a/crates/core/database/src/tasks/mod.rs b/crates/core/database/src/tasks/mod.rs index 93f15a5a..12a5d122 100644 --- a/crates/core/database/src/tasks/mod.rs +++ b/crates/core/database/src/tasks/mod.rs @@ -13,12 +13,12 @@ pub mod process_embeds; pub mod web_push; /// Spawn background workers -pub async fn start_workers(db: Database) { +pub async fn start_workers(db: Database, authifier_db: authifier::Database) { for _ in 0..WORKER_COUNT { task::spawn(ack::worker(db.clone())); task::spawn(last_message_id::worker(db.clone())); task::spawn(process_embeds::worker(db.clone())); - task::spawn(web_push::worker(db.clone().into())); + task::spawn(web_push::worker(authifier_db.clone())); } } diff --git a/crates/delta/Cargo.toml b/crates/delta/Cargo.toml index bc18e98b..6eee2eb3 100644 --- a/crates/delta/Cargo.toml +++ b/crates/delta/Cargo.toml @@ -57,7 +57,7 @@ rocket = { version = "0.5.0-rc.2", default-features = false, features = [ ] } rocket_cors = { git = "https://github.com/lawliet89/rocket_cors", rev = "c17e8145baa4790319fdb6a473e465b960f55e7c" } rocket_empty = { version = "0.1.1", features = ["schema"] } -rocket_authifier = { version = "1.0.7" } +rocket_authifier = { version = "1.0.8" } rocket_prometheus = "0.10.0-rc.3" # spec generation @@ -68,6 +68,7 @@ revolt_rocket_okapi = { version = "0.9.1", features = ["swagger"] } revolt-quark = { path = "../quark" } # core +authifier = "1.0.8" revolt-config = { path = "../core/config" } revolt-database = { path = "../core/database", features = [ "rocket-impl", diff --git a/crates/delta/src/main.rs b/crates/delta/src/main.rs index f517f29b..a962ac9f 100644 --- a/crates/delta/src/main.rs +++ b/crates/delta/src/main.rs @@ -8,6 +8,7 @@ extern crate serde_json; pub mod routes; pub mod util; +use revolt_database::{Database, MongoDb}; use rocket::{Build, Rocket}; use rocket_cors::{AllowedOrigins, CorsOptions}; use rocket_prometheus::PrometheusMetrics; @@ -33,7 +34,12 @@ pub async fn web() -> Rocket { // Setup Authifier let authifier = Authifier { - database: db.clone().into(), + database: match db.clone() { + Database::Reference(_) => Default::default(), + Database::MongoDb(MongoDb(client, _)) => authifier::Database::MongoDb( + authifier::database::MongoDb(client.database("revolt")), + ), + }, config: revolt_quark::util::authifier::config(), event_channel: Some(sender), }; @@ -55,8 +61,14 @@ pub async fn web() -> Rocket { }); // Launch background task workers - async_std::task::spawn(revolt_database::tasks::start_workers(db.clone())); - async_std::task::spawn(revolt_quark::tasks::start_workers(legacy_db.clone())); + async_std::task::spawn(revolt_database::tasks::start_workers( + db.clone(), + authifier.database.clone(), + )); + async_std::task::spawn(revolt_quark::tasks::start_workers( + legacy_db.clone(), + authifier.database.clone(), + )); // Configure CORS let cors = CorsOptions { diff --git a/crates/delta/src/util/test.rs b/crates/delta/src/util/test.rs index cd15ae22..136c0295 100644 --- a/crates/delta/src/util/test.rs +++ b/crates/delta/src/util/test.rs @@ -1,7 +1,7 @@ use futures::StreamExt; use rand::Rng; use redis_kiss::redis::aio::PubSub; -use revolt_database::{events::client::EventV1, Database, DatabaseInfo, User}; +use revolt_database::{events::client::EventV1, Database, User}; use revolt_quark::authifier::{ models::{Account, Session}, Authifier, @@ -24,20 +24,27 @@ impl TestHarness { .await .expect("valid rocket instance"); - let db = DatabaseInfo::Auto.connect().await.expect("`Database`"); let mut sub = redis_kiss::open_pubsub_connection() .await .expect("`PubSub`"); sub.psubscribe("*").await.unwrap(); + let db = client + .rocket() + .state::() + .expect("`Database`") + .clone(); + + let authifier = client + .rocket() + .state::() + .expect("`Authifier`") + .clone(); + TestHarness { client, - authifier: Authifier { - database: db.clone().into(), - config: revolt_quark::util::authifier::config(), - event_channel: None, - }, + authifier, db, sub, event_buffer: vec![], diff --git a/crates/quark/Cargo.toml b/crates/quark/Cargo.toml index d3f597b9..a88cf045 100644 --- a/crates/quark/Cargo.toml +++ b/crates/quark/Cargo.toml @@ -88,7 +88,7 @@ rocket_empty = { version = "0.1.1", optional = true, features = ["schema"] } rocket_cors = { optional = true, git = "https://github.com/lawliet89/rocket_cors", rev = "c17e8145baa4790319fdb6a473e465b960f55e7c" } # Authifier -authifier = { version = "1.0.7", features = ["async-std-runtime"] } +authifier = { version = "1.0.8", features = ["async-std-runtime"] } # Sentry sentry = "0.31.5" diff --git a/crates/quark/src/database.rs b/crates/quark/src/database.rs index d607763e..7229dadc 100644 --- a/crates/quark/src/database.rs +++ b/crates/quark/src/database.rs @@ -31,6 +31,18 @@ impl DatabaseInfo { pub async fn connect(self) -> Result { Ok(match self { DatabaseInfo::Auto => { + if let Ok(test_db) = env::var("TEST_DB") { + return match test_db.as_str() { + "REFERENCE" => DatabaseInfo::Dummy.connect().await, + "MONGODB" => { + DatabaseInfo::MongoDb(env::var("MONGODB").expect("`MONGODB` env")) + .connect() + .await + } + _ => unreachable!("must specify REFERENCE or MONGODB"), + }; + } + if let Ok(uri) = env::var("MONGODB") { return DatabaseInfo::MongoDb(uri).connect().await; } @@ -61,17 +73,6 @@ impl Deref for Database { } } -impl From for authifier::Database { - fn from(val: Database) -> Self { - match val { - Database::Dummy(_) => authifier::Database::default(), - Database::MongoDb(MongoDb(client)) => authifier::Database::MongoDb( - authifier::database::MongoDb(client.database("revolt")), - ), - } - } -} - impl From for revolt_database::Database { fn from(val: Database) -> Self { match val { diff --git a/crates/quark/src/tasks/mod.rs b/crates/quark/src/tasks/mod.rs index 93f15a5a..12a5d122 100644 --- a/crates/quark/src/tasks/mod.rs +++ b/crates/quark/src/tasks/mod.rs @@ -13,12 +13,12 @@ pub mod process_embeds; pub mod web_push; /// Spawn background workers -pub async fn start_workers(db: Database) { +pub async fn start_workers(db: Database, authifier_db: authifier::Database) { for _ in 0..WORKER_COUNT { task::spawn(ack::worker(db.clone())); task::spawn(last_message_id::worker(db.clone())); task::spawn(process_embeds::worker(db.clone())); - task::spawn(web_push::worker(db.clone().into())); + task::spawn(web_push::worker(authifier_db.clone())); } }