diff --git a/Cargo.lock b/Cargo.lock index 05033c65..bf4db3ba 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6291,7 +6291,6 @@ dependencies = [ "bson", "deadqueue", "decancer", - "fcm_v1", "futures", "indexmap 1.9.3", "isahc", @@ -6311,7 +6310,6 @@ dependencies = [ "revolt-permissions", "revolt-presence", "revolt-result", - "revolt_a2", "revolt_okapi", "revolt_optional_struct", "revolt_rocket_okapi", @@ -6323,7 +6321,6 @@ dependencies = [ "unicode-segmentation", "url-escape", "validator 0.16.1", - "web-push", ] [[package]] diff --git a/crates/core/config/Cargo.toml b/crates/core/config/Cargo.toml index 04cf6fca..26cc1c25 100644 --- a/crates/core/config/Cargo.toml +++ b/crates/core/config/Cargo.toml @@ -11,8 +11,9 @@ description = "Revolt Backend: Configuration" [features] anyhow = ["dep:sentry-anyhow"] report-macros = ["revolt-result"] +sentry = ["dep:sentry"] test = ["async-std"] -default = ["test", "anyhow"] +default = ["test", "sentry"] [dependencies] # Utility @@ -32,7 +33,7 @@ log = "0.4.14" pretty_env_logger = "0.4.0" # Sentry -sentry = "0.31.5" +sentry = { version = "0.31.5", optional = true } sentry-anyhow = { version = "0.38.1", optional = true } # Core diff --git a/crates/core/config/src/lib.rs b/crates/core/config/src/lib.rs index 7c050499..6c4d58de 100644 --- a/crates/core/config/src/lib.rs +++ b/crates/core/config/src/lib.rs @@ -6,10 +6,12 @@ use futures_locks::RwLock; use once_cell::sync::Lazy; use serde::Deserialize; +#[cfg(feature = "sentry")] pub use sentry::{capture_error, capture_message, Level}; +#[cfg(feature = "anyhow")] pub use sentry_anyhow::capture_anyhow; -#[cfg(feature = "report-macros")] +#[cfg(all(feature = "report-macros", feature = "sentry"))] #[macro_export] macro_rules! report_error { ( $expr: expr, $error: ident $( $tt:tt )? ) => { @@ -24,7 +26,7 @@ macro_rules! report_error { }; } -#[cfg(feature = "report-macros")] +#[cfg(all(feature = "report-macros", feature = "sentry"))] #[macro_export] macro_rules! capture_internal_error { ( $expr: expr ) => { @@ -35,7 +37,7 @@ macro_rules! capture_internal_error { }; } -#[cfg(feature = "report-macros")] +#[cfg(all(feature = "report-macros", feature = "sentry"))] #[macro_export] macro_rules! report_internal_error { ( $expr: expr ) => { @@ -419,6 +421,7 @@ pub async fn config() -> Settings { } /// Configure logging and common Rust variables +#[cfg(feature = "sentry")] pub async fn setup_logging(release: &'static str, dsn: String) -> Option { if std::env::var("RUST_LOG").is_err() { std::env::set_var("RUST_LOG", "info"); @@ -444,6 +447,7 @@ pub async fn setup_logging(release: &'static str, dsn: String) -> Option { diff --git a/crates/core/database/Cargo.toml b/crates/core/database/Cargo.toml index 7f2e0973..02e55411 100644 --- a/crates/core/database/Cargo.toml +++ b/crates/core/database/Cargo.toml @@ -10,12 +10,12 @@ description = "Revolt Backend: Database Implementation" [features] # Databases -mongodb = ["dep:mongodb", "bson"] +mongodb = ["dep:mongodb", "bson", "authifier/database-mongodb"] # ... Other tasks = ["isahc", "linkify", "url-escape"] -async-std-runtime = ["async-std"] -rocket-impl = ["rocket", "schemars", "revolt_okapi", "revolt_rocket_okapi"] +async-std-runtime = ["async-std", "authifier/async-std-runtime"] +rocket-impl = ["rocket", "schemars", "revolt_okapi", "revolt_rocket_okapi", "authifier/rocket_impl"] axum-impl = ["axum"] redis-is-patched = ["revolt-presence/redis-is-patched"] @@ -91,13 +91,8 @@ rocket = { version = "0.5.1", default-features = false, features = [ revolt_okapi = { version = "0.9.1", optional = true } revolt_rocket_okapi = { version = "0.10.0", optional = true } -# Notifications -fcm_v1 = "0.3.0" -web-push = "0.10.0" -revolt_a2 = { version = "0.10", default-features = false, features = ["ring"] } - # Authifier -authifier = { version = "1.0.15", features = ["rocket_impl"] } +authifier = { version = "1.0.15" } # RabbitMQ amqprs = { version = "1.7.0" } diff --git a/crates/core/database/src/drivers/mod.rs b/crates/core/database/src/drivers/mod.rs index 1c9ae967..2a2c7b85 100644 --- a/crates/core/database/src/drivers/mod.rs +++ b/crates/core/database/src/drivers/mod.rs @@ -1,3 +1,4 @@ +#[cfg(feature = "mongodb")] mod mongodb; mod reference; @@ -13,6 +14,7 @@ use authifier::Authifier; use rand::Rng; use revolt_config::config; +#[cfg(feature = "mongodb")] pub use self::mongodb::*; pub use self::reference::*; @@ -25,8 +27,10 @@ pub enum DatabaseInfo { /// Use the mock database Reference, /// Connect to MongoDB + #[cfg(feature = "mongodb")] MongoDb { uri: String, database_name: String }, /// Use existing MongoDB connection + #[cfg(feature = "mongodb")] MongoDbFromClient(::mongodb::Client, String), } @@ -36,6 +40,7 @@ pub enum Database { /// Mock database Reference(ReferenceDb), /// MongoDB database + #[cfg(feature = "mongodb")] MongoDb(MongoDb), } @@ -45,7 +50,7 @@ impl DatabaseInfo { pub async fn connect(self) -> Result { let config = config().await; - Ok(match self { + match self { DatabaseInfo::Auto => { if std::env::var("TEST_DB").is_ok() { DatabaseInfo::Test(format!( @@ -53,16 +58,20 @@ impl DatabaseInfo { rand::thread_rng().gen_range(1_000_000..10_000_000) )) .connect() - .await? + .await } else if !config.database.mongodb.is_empty() { - DatabaseInfo::MongoDb { + #[cfg(feature = "mongodb")] + return DatabaseInfo::MongoDb { uri: config.database.mongodb, database_name: "revolt".to_string(), } .connect() - .await? + .await; + + #[cfg(not(feature = "mongodb"))] + return Err("MongoDB not enabled.".to_string()) } else { - DatabaseInfo::Reference.connect().await? + DatabaseInfo::Reference.connect().await } } DatabaseInfo::Test(database_name) => { @@ -70,30 +79,36 @@ impl DatabaseInfo { .expect("`TEST_DB` environment variable should be set to REFERENCE or MONGODB") .as_str() { - "REFERENCE" => DatabaseInfo::Reference.connect().await?, + "REFERENCE" => DatabaseInfo::Reference.connect().await, "MONGODB" => { - DatabaseInfo::MongoDb { + #[cfg(feature = "mongodb")] + return DatabaseInfo::MongoDb { uri: config.database.mongodb, database_name, } .connect() - .await? + .await; + + #[cfg(not(feature = "mongodb"))] + return Err("MongoDB not enabled.".to_string()) } _ => unreachable!("must specify REFERENCE or MONGODB"), } } - DatabaseInfo::Reference => Database::Reference(Default::default()), + DatabaseInfo::Reference => Ok(Database::Reference(Default::default())), + #[cfg(feature = "mongodb")] DatabaseInfo::MongoDb { uri, database_name } => { let client = ::mongodb::Client::with_uri_str(uri) .await .map_err(|_| "Failed to init db connection.".to_string())?; - Database::MongoDb(MongoDb(client, database_name)) + Ok(Database::MongoDb(MongoDb(client, database_name))) } + #[cfg(feature = "mongodb")] DatabaseInfo::MongoDbFromClient(client, database_name) => { - Database::MongoDb(MongoDb(client, database_name)) + Ok(Database::MongoDb(MongoDb(client, database_name))) } - }) + } } } @@ -219,12 +234,16 @@ impl Database { Authifier { database: match self { Database::Reference(_) => Default::default(), + #[cfg(feature = "mongodb")] Database::MongoDb(MongoDb(client, _)) => authifier::Database::MongoDb( authifier::database::MongoDb(client.database("revolt")), ), }, config: auth_config, + #[cfg(feature = "tasks")] event_channel: Some(crate::tasks::authifier_relay::sender()), + #[cfg(not(feature = "tasks"))] + event_channel: None, } } } diff --git a/crates/core/database/src/drivers/mongodb.rs b/crates/core/database/src/drivers/mongodb.rs index 64a2250b..fc5dbe3c 100644 --- a/crates/core/database/src/drivers/mongodb.rs +++ b/crates/core/database/src/drivers/mongodb.rs @@ -10,7 +10,6 @@ use serde::de::DeserializeOwned; use serde::Serialize; database_derived!( - #[cfg(feature = "mongodb")] /// MongoDB implementation pub struct MongoDb(pub ::mongodb::Client, pub String); ); diff --git a/crates/core/database/src/lib.rs b/crates/core/database/src/lib.rs index 9e26336d..f9827d03 100644 --- a/crates/core/database/src/lib.rs +++ b/crates/core/database/src/lib.rs @@ -25,6 +25,9 @@ pub use mongodb; #[macro_use] extern crate bson; +#[cfg(not(feature = "async-std-runtime"))] +compile_error!("async-std-runtime feature must be enabled."); + #[macro_export] #[cfg(debug_assertions)] macro_rules! query { @@ -103,6 +106,7 @@ pub mod util; pub use models::*; pub mod events; +#[cfg(feature = "tasks")] pub mod tasks; mod amqp; diff --git a/crates/core/database/src/models/admin_migrations/ops.rs b/crates/core/database/src/models/admin_migrations/ops.rs index ff8ae25d..d49716e4 100644 --- a/crates/core/database/src/models/admin_migrations/ops.rs +++ b/crates/core/database/src/models/admin_migrations/ops.rs @@ -1,3 +1,4 @@ +#[cfg(feature = "mongodb")] mod mongodb; mod reference; diff --git a/crates/core/database/src/models/bots/ops.rs b/crates/core/database/src/models/bots/ops.rs index 8d77673f..f35a210a 100644 --- a/crates/core/database/src/models/bots/ops.rs +++ b/crates/core/database/src/models/bots/ops.rs @@ -2,6 +2,7 @@ use revolt_result::Result; use crate::{Bot, FieldsBot, PartialBot}; +#[cfg(feature = "mongodb")] mod mongodb; mod reference; diff --git a/crates/core/database/src/models/channel_invites/ops.rs b/crates/core/database/src/models/channel_invites/ops.rs index 82b2bd8a..59bd7271 100644 --- a/crates/core/database/src/models/channel_invites/ops.rs +++ b/crates/core/database/src/models/channel_invites/ops.rs @@ -2,6 +2,7 @@ use revolt_result::Result; use crate::Invite; +#[cfg(feature = "mongodb")] mod mongodb; mod reference; diff --git a/crates/core/database/src/models/channel_unreads/ops.rs b/crates/core/database/src/models/channel_unreads/ops.rs index 6c91bf64..70d77d92 100644 --- a/crates/core/database/src/models/channel_unreads/ops.rs +++ b/crates/core/database/src/models/channel_unreads/ops.rs @@ -2,6 +2,7 @@ use revolt_result::Result; use crate::ChannelUnread; +#[cfg(feature = "mongodb")] mod mongodb; mod reference; diff --git a/crates/core/database/src/models/channel_webhooks/ops.rs b/crates/core/database/src/models/channel_webhooks/ops.rs index d7561a99..4e22ec08 100644 --- a/crates/core/database/src/models/channel_webhooks/ops.rs +++ b/crates/core/database/src/models/channel_webhooks/ops.rs @@ -2,6 +2,7 @@ use revolt_result::Result; use crate::{FieldsWebhook, PartialWebhook, Webhook}; +#[cfg(feature = "mongodb")] mod mongodb; mod reference; diff --git a/crates/core/database/src/models/channels/model.rs b/crates/core/database/src/models/channels/model.rs index 536632a7..673e5e50 100644 --- a/crates/core/database/src/models/channels/model.rs +++ b/crates/core/database/src/models/channels/model.rs @@ -8,10 +8,13 @@ use serde::{Deserialize, Serialize}; use ulid::Ulid; use crate::{ - events::client::EventV1, tasks::ack::AckEvent, Database, File, IntoDocumentPath, PartialServer, + events::client::EventV1, Database, File, PartialServer, Server, SystemMessage, User, AMQP, }; +#[cfg(feature = "mongodb")] +use crate::IntoDocumentPath; + auto_derived!( #[serde(tag = "channel_type")] pub enum Channel { @@ -646,10 +649,11 @@ impl Channel { .private(user.to_string()) .await; + #[cfg(feature = "tasks")] crate::tasks::ack::queue_ack( self.id().to_string(), user.to_string(), - AckEvent::AckMessage { + crate::tasks::ack::AckEvent::AckMessage { id: message.to_string(), }, ) @@ -766,6 +770,7 @@ impl Channel { } } +#[cfg(feature = "mongodb")] impl IntoDocumentPath for FieldsChannel { fn as_path(&self) -> Option<&'static str> { Some(match self { diff --git a/crates/core/database/src/models/channels/ops.rs b/crates/core/database/src/models/channels/ops.rs index 2598043e..3ee90d54 100644 --- a/crates/core/database/src/models/channels/ops.rs +++ b/crates/core/database/src/models/channels/ops.rs @@ -1,5 +1,7 @@ use crate::{revolt_result::Result, Channel, FieldsChannel, PartialChannel}; use revolt_permissions::OverrideField; + +#[cfg(feature = "mongodb")] mod mongodb; mod reference; diff --git a/crates/core/database/src/models/emojis/ops.rs b/crates/core/database/src/models/emojis/ops.rs index c0b51228..26e23aca 100644 --- a/crates/core/database/src/models/emojis/ops.rs +++ b/crates/core/database/src/models/emojis/ops.rs @@ -2,6 +2,7 @@ use revolt_result::Result; use crate::Emoji; +#[cfg(feature = "mongodb")] mod mongodb; mod reference; diff --git a/crates/core/database/src/models/file_hashes/ops.rs b/crates/core/database/src/models/file_hashes/ops.rs index 648a1a2f..4b249e4c 100644 --- a/crates/core/database/src/models/file_hashes/ops.rs +++ b/crates/core/database/src/models/file_hashes/ops.rs @@ -2,6 +2,7 @@ use revolt_result::Result; use crate::FileHash; +#[cfg(feature = "mongodb")] mod mongodb; mod reference; diff --git a/crates/core/database/src/models/files/ops.rs b/crates/core/database/src/models/files/ops.rs index b30d3acc..dd975d52 100644 --- a/crates/core/database/src/models/files/ops.rs +++ b/crates/core/database/src/models/files/ops.rs @@ -4,6 +4,7 @@ use crate::File; use super::FileUsedFor; +#[cfg(feature = "mongodb")] mod mongodb; mod reference; diff --git a/crates/core/database/src/models/messages/model.rs b/crates/core/database/src/models/messages/model.rs index 2c24567a..53d38012 100644 --- a/crates/core/database/src/models/messages/model.rs +++ b/crates/core/database/src/models/messages/model.rs @@ -14,7 +14,6 @@ use validator::Validate; use crate::{ events::client::EventV1, - tasks::{self, ack::AckEvent}, util::{ bulk_permissions::BulkDatabasePermissionQuery, idempotency::IdempotencyKey, permissions::DatabasePermissionQuery, @@ -22,6 +21,9 @@ use crate::{ Channel, Database, Emoji, File, User, AMQP, }; +#[cfg(feature = "tasks")] +use crate::tasks::{self, ack::AckEvent}; + auto_derived_partial!( /// Message pub struct Message { @@ -616,9 +618,11 @@ impl Message { .await; // Update last_message_id + #[cfg(feature = "tasks")] tasks::last_message_id::queue(self.channel.to_string(), self.id.to_string(), is_dm).await; // Add mentions for affected users + #[cfg(feature = "tasks")] if !mentions_elsewhere { if let Some(mentions) = &self.mentions { tasks::ack::queue_message( @@ -637,6 +641,7 @@ impl Message { } // Generate embeds + #[cfg(feature = "tasks")] if generate_embeds { if let Some(content) = &self.content { tasks::process_embeds::queue( @@ -673,10 +678,12 @@ impl Message { ) .await?; + if !self.has_suppressed_notifications() && (self.mentions.is_some() || self.contains_mass_push_mention()) { // send Push notifications + #[cfg(feature = "tasks")] tasks::ack::queue_message( self.channel.to_string(), AckEvent::ProcessMessage { diff --git a/crates/core/database/src/models/messages/ops.rs b/crates/core/database/src/models/messages/ops.rs index b10022b4..4d54e83c 100644 --- a/crates/core/database/src/models/messages/ops.rs +++ b/crates/core/database/src/models/messages/ops.rs @@ -2,6 +2,7 @@ use revolt_result::Result; use crate::{AppendMessage, FieldsMessage, Message, MessageQuery, PartialMessage}; +#[cfg(feature = "mongodb")] mod mongodb; mod reference; diff --git a/crates/core/database/src/models/mod.rs b/crates/core/database/src/models/mod.rs index 181a30c0..93bd556c 100644 --- a/crates/core/database/src/models/mod.rs +++ b/crates/core/database/src/models/mod.rs @@ -38,7 +38,10 @@ pub use servers::*; pub use user_settings::*; pub use users::*; -use crate::{Database, MongoDb, ReferenceDb}; +use crate::{Database, ReferenceDb}; + +#[cfg(feature = "mongodb")] +use crate::MongoDb; pub trait AbstractDatabase: Sync @@ -66,6 +69,8 @@ pub trait AbstractDatabase: } impl AbstractDatabase for ReferenceDb {} + +#[cfg(feature = "mongodb")] impl AbstractDatabase for MongoDb {} impl std::ops::Deref for Database { @@ -74,6 +79,7 @@ impl std::ops::Deref for Database { fn deref(&self) -> &Self::Target { match &self { Database::Reference(dummy) => dummy, + #[cfg(feature = "mongodb")] Database::MongoDb(mongo) => mongo, } } diff --git a/crates/core/database/src/models/policy_changes/ops.rs b/crates/core/database/src/models/policy_changes/ops.rs index 2692a81f..05bc7c2f 100644 --- a/crates/core/database/src/models/policy_changes/ops.rs +++ b/crates/core/database/src/models/policy_changes/ops.rs @@ -2,6 +2,7 @@ use revolt_result::Result; use crate::PolicyChange; +#[cfg(feature = "mongodb")] mod mongodb; mod reference; diff --git a/crates/core/database/src/models/ratelimit_events/ops.rs b/crates/core/database/src/models/ratelimit_events/ops.rs index 31991da7..53b7dce3 100644 --- a/crates/core/database/src/models/ratelimit_events/ops.rs +++ b/crates/core/database/src/models/ratelimit_events/ops.rs @@ -1,6 +1,8 @@ use std::time::Duration; use crate::{revolt_result::Result, RatelimitEvent, RatelimitEventType}; + +#[cfg(feature = "mongodb")] mod mongodb; mod reference; diff --git a/crates/core/database/src/models/safety_reports/ops.rs b/crates/core/database/src/models/safety_reports/ops.rs index ccb8fb5d..7c0712a5 100644 --- a/crates/core/database/src/models/safety_reports/ops.rs +++ b/crates/core/database/src/models/safety_reports/ops.rs @@ -2,6 +2,7 @@ use revolt_result::Result; use crate::Report; +#[cfg(feature = "mongodb")] mod mongodb; mod reference; diff --git a/crates/core/database/src/models/safety_snapshots/ops.rs b/crates/core/database/src/models/safety_snapshots/ops.rs index 0f9a852b..5a2803d4 100644 --- a/crates/core/database/src/models/safety_snapshots/ops.rs +++ b/crates/core/database/src/models/safety_snapshots/ops.rs @@ -2,6 +2,7 @@ use revolt_result::Result; use crate::Snapshot; +#[cfg(feature = "mongodb")] mod mongodb; mod reference; diff --git a/crates/core/database/src/models/server_bans/ops.rs b/crates/core/database/src/models/server_bans/ops.rs index 90cb4df3..51bac384 100644 --- a/crates/core/database/src/models/server_bans/ops.rs +++ b/crates/core/database/src/models/server_bans/ops.rs @@ -2,6 +2,7 @@ use revolt_result::Result; use crate::{MemberCompositeKey, ServerBan}; +#[cfg(feature = "mongodb")] mod mongodb; mod reference; diff --git a/crates/core/database/src/models/server_members/ops.rs b/crates/core/database/src/models/server_members/ops.rs index 1d5a045f..51ddd574 100644 --- a/crates/core/database/src/models/server_members/ops.rs +++ b/crates/core/database/src/models/server_members/ops.rs @@ -1,16 +1,20 @@ -use ::mongodb::SessionCursor; +#[cfg(feature = "mongodb")] +use ::mongodb::{ClientSession, SessionCursor}; + use revolt_result::Result; use crate::{FieldsMember, Member, MemberCompositeKey, PartialMember}; +#[cfg(feature = "mongodb")] mod mongodb; mod reference; #[derive(Debug)] +#[allow(clippy::large_enum_variant)] pub enum ChunkedServerMembersGenerator { #[cfg(feature = "mongodb")] MongoDb { - session: ::mongodb::ClientSession, + session: ClientSession, cursor: Option>, }, @@ -22,7 +26,7 @@ pub enum ChunkedServerMembersGenerator { impl ChunkedServerMembersGenerator { #[cfg(feature = "mongodb")] - pub fn new_mongo(session: ::mongodb::ClientSession, cursor: SessionCursor) -> Self { + pub fn new_mongo(session: ClientSession, cursor: SessionCursor) -> Self { ChunkedServerMembersGenerator::MongoDb { session, cursor: Some(cursor), diff --git a/crates/core/database/src/models/servers/ops.rs b/crates/core/database/src/models/servers/ops.rs index 6c58773a..ee07ba8f 100644 --- a/crates/core/database/src/models/servers/ops.rs +++ b/crates/core/database/src/models/servers/ops.rs @@ -2,6 +2,7 @@ use revolt_result::Result; use crate::{FieldsRole, FieldsServer, PartialRole, PartialServer, Role, Server}; +#[cfg(feature = "mongodb")] mod mongodb; mod reference; diff --git a/crates/core/database/src/models/user_settings/ops.rs b/crates/core/database/src/models/user_settings/ops.rs index 2dd6bb69..d44b9a41 100644 --- a/crates/core/database/src/models/user_settings/ops.rs +++ b/crates/core/database/src/models/user_settings/ops.rs @@ -2,6 +2,7 @@ use revolt_result::Result; use crate::UserSettings; +#[cfg(feature = "mongodb")] mod mongodb; mod reference; diff --git a/crates/core/database/src/models/users/ops.rs b/crates/core/database/src/models/users/ops.rs index 356a3f6c..d7586641 100644 --- a/crates/core/database/src/models/users/ops.rs +++ b/crates/core/database/src/models/users/ops.rs @@ -4,6 +4,7 @@ use revolt_result::Result; use crate::{FieldsUser, PartialUser, RelationshipStatus, User}; +#[cfg(feature = "mongodb")] mod mongodb; mod reference; diff --git a/crates/daemons/pushd/Cargo.toml b/crates/daemons/pushd/Cargo.toml index 50db680b..40a28008 100644 --- a/crates/daemons/pushd/Cargo.toml +++ b/crates/daemons/pushd/Cargo.toml @@ -8,6 +8,7 @@ license = "AGPL-3.0-or-later" revolt-result = { version = "0.8.8", path = "../../core/result" } revolt-config = { version = "0.8.8", path = "../../core/config", features = [ "report-macros", + "anyhow" ] } revolt-database = { version = "0.8.8", path = "../../core/database" } revolt-models = { version = "0.8.8", path = "../../core/models", features = [