| 
									
										
										
										
											2023-05-21 18:53:59 +08:00
										 |  |  | #![allow(unused_doc_comments)]
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-18 15:48:17 +08:00
										 |  |  | use collab_integrate::collab_builder::AppFlowyCollabBuilder;
 | 
					
						
							| 
									
										
										
										
											2025-04-20 15:54:37 +08:00
										 |  |  | use collab_plugins::CollabKVDB;
 | 
					
						
							| 
									
										
										
										
											2024-08-01 23:13:35 +08:00
										 |  |  | use flowy_ai::ai_manager::AIManager;
 | 
					
						
							| 
									
										
										
										
											2023-07-29 09:46:24 +08:00
										 |  |  | use flowy_database2::DatabaseManager;
 | 
					
						
							| 
									
										
										
										
											2023-12-31 07:29:40 +08:00
										 |  |  | use flowy_document::manager::DocumentManager;
 | 
					
						
							| 
									
										
										
										
											2024-04-26 09:44:07 +08:00
										 |  |  | use flowy_error::{FlowyError, FlowyResult};
 | 
					
						
							| 
									
										
										
										
											2023-12-31 07:29:40 +08:00
										 |  |  | use flowy_folder::manager::FolderManager;
 | 
					
						
							| 
									
										
										
										
											2025-04-07 19:24:58 +08:00
										 |  |  | use flowy_search::folder::indexer::FolderIndexManagerImpl;
 | 
					
						
							|  |  |  | use flowy_search::services::manager::SearchManager;
 | 
					
						
							| 
									
										
										
										
											2025-04-19 14:00:51 +08:00
										 |  |  | use flowy_server::af_cloud::define::LoggedUser;
 | 
					
						
							| 
									
										
										
										
											2025-04-17 11:11:54 +08:00
										 |  |  | use std::path::PathBuf;
 | 
					
						
							| 
									
										
										
										
											2025-04-07 19:24:58 +08:00
										 |  |  | use std::sync::{Arc, Weak};
 | 
					
						
							|  |  |  | use std::time::Duration;
 | 
					
						
							|  |  |  | use sysinfo::System;
 | 
					
						
							|  |  |  | use tokio::sync::RwLock;
 | 
					
						
							|  |  |  | use tracing::{debug, error, event, info, instrument};
 | 
					
						
							|  |  |  | use uuid::Uuid;
 | 
					
						
							| 
									
										
										
										
											2024-04-12 10:21:41 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-30 17:38:39 +08:00
										 |  |  | use flowy_sqlite::kv::KVStorePreferences;
 | 
					
						
							| 
									
										
										
										
											2024-06-20 07:44:57 +08:00
										 |  |  | use flowy_storage::manager::StorageManager;
 | 
					
						
							| 
									
										
										
										
											2024-01-12 14:34:59 +08:00
										 |  |  | use flowy_user::services::authenticate_user::AuthenticateUser;
 | 
					
						
							| 
									
										
										
										
											2023-12-29 13:02:27 +08:00
										 |  |  | use flowy_user::services::entities::UserConfig;
 | 
					
						
							| 
									
										
										
										
											2024-01-11 14:42:03 +08:00
										 |  |  | use flowy_user::user_manager::UserManager;
 | 
					
						
							| 
									
										
										
										
											2023-12-29 13:02:27 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-19 14:38:11 +08:00
										 |  |  | use lib_dispatch::prelude::*;
 | 
					
						
							| 
									
										
										
										
											2023-10-30 12:35:06 +08:00
										 |  |  | use lib_dispatch::runtime::AFPluginRuntime;
 | 
					
						
							| 
									
										
										
										
											2024-01-11 14:42:03 +08:00
										 |  |  | use lib_infra::priority_task::{TaskDispatcher, TaskRunner};
 | 
					
						
							| 
									
										
										
										
											2024-06-30 17:38:39 +08:00
										 |  |  | use lib_infra::util::OperatingSystem;
 | 
					
						
							| 
									
										
										
										
											2024-04-07 21:36:55 +08:00
										 |  |  | use lib_log::stream_log::StreamLogSender;
 | 
					
						
							| 
									
										
										
										
											2022-12-01 08:35:50 +08:00
										 |  |  | use module::make_plugins;
 | 
					
						
							| 
									
										
										
										
											2021-07-09 23:31:44 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-17 15:38:56 +08:00
										 |  |  | use crate::config::AppFlowyCoreConfig;
 | 
					
						
							| 
									
										
										
										
											2024-06-20 07:44:57 +08:00
										 |  |  | use crate::deps_resolve::file_storage_deps::FileStorageResolver;
 | 
					
						
							| 
									
										
										
										
											2023-04-28 14:08:53 +08:00
										 |  |  | use crate::deps_resolve::*;
 | 
					
						
							| 
									
										
										
										
											2024-12-29 14:47:28 +08:00
										 |  |  | use crate::log_filter::init_log;
 | 
					
						
							| 
									
										
										
										
											2025-04-19 14:00:51 +08:00
										 |  |  | use crate::server_layer::ServerProvider;
 | 
					
						
							| 
									
										
										
										
											2024-12-30 10:26:06 +08:00
										 |  |  | use deps_resolve::reminder_deps::CollabInteractImpl;
 | 
					
						
							| 
									
										
										
										
											2025-04-16 20:59:25 +08:00
										 |  |  | use flowy_sqlite::DBConnection;
 | 
					
						
							| 
									
										
										
										
											2025-04-17 20:49:24 +08:00
										 |  |  | use lib_infra::async_trait::async_trait;
 | 
					
						
							| 
									
										
										
										
											2024-12-30 10:26:06 +08:00
										 |  |  | use user_state_callback::UserStatusCallbackImpl;
 | 
					
						
							| 
									
										
										
										
											2023-04-28 14:08:53 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-17 15:38:56 +08:00
										 |  |  | pub mod config;
 | 
					
						
							| 
									
										
										
										
											2023-04-28 14:08:53 +08:00
										 |  |  | mod deps_resolve;
 | 
					
						
							| 
									
										
										
										
											2024-12-30 10:26:06 +08:00
										 |  |  | mod log_filter;
 | 
					
						
							| 
									
										
										
										
											2023-04-28 14:08:53 +08:00
										 |  |  | pub mod module;
 | 
					
						
							| 
									
										
										
										
											2024-12-29 14:47:28 +08:00
										 |  |  | pub(crate) mod server_layer;
 | 
					
						
							| 
									
										
										
										
											2024-12-30 10:26:06 +08:00
										 |  |  | pub(crate) mod user_state_callback;
 | 
					
						
							| 
									
										
										
										
											2023-04-28 14:08:53 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-13 16:42:45 +08:00
										 |  |  | /// This name will be used as to identify the current [AppFlowyCore] instance.
 | 
					
						
							|  |  |  | /// Don't change this.
 | 
					
						
							|  |  |  | pub const DEFAULT_NAME: &str = "appflowy";
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-04 15:12:53 +08:00
										 |  |  | #[derive(Clone)]
 | 
					
						
							| 
									
										
										
										
											2023-02-02 23:02:49 +08:00
										 |  |  | pub struct AppFlowyCore {
 | 
					
						
							| 
									
										
										
										
											2023-02-13 09:29:49 +08:00
										 |  |  |   #[allow(dead_code)]
 | 
					
						
							|  |  |  |   pub config: AppFlowyCoreConfig,
 | 
					
						
							| 
									
										
										
										
											2023-08-14 12:57:59 +08:00
										 |  |  |   pub user_manager: Arc<UserManager>,
 | 
					
						
							| 
									
										
										
										
											2023-07-29 09:46:24 +08:00
										 |  |  |   pub document_manager: Arc<DocumentManager>,
 | 
					
						
							| 
									
										
										
										
											2023-07-05 20:57:09 +08:00
										 |  |  |   pub folder_manager: Arc<FolderManager>,
 | 
					
						
							| 
									
										
										
										
											2023-07-29 09:46:24 +08:00
										 |  |  |   pub database_manager: Arc<DatabaseManager>,
 | 
					
						
							| 
									
										
										
										
											2024-08-19 22:08:10 +08:00
										 |  |  |   pub event_dispatcher: Arc<AFPluginDispatcher>,
 | 
					
						
							| 
									
										
										
										
											2023-09-17 17:14:34 +08:00
										 |  |  |   pub server_provider: Arc<ServerProvider>,
 | 
					
						
							| 
									
										
										
										
											2023-02-13 09:29:49 +08:00
										 |  |  |   pub task_dispatcher: Arc<RwLock<TaskDispatcher>>,
 | 
					
						
							| 
									
										
										
										
											2024-06-30 17:38:39 +08:00
										 |  |  |   pub store_preference: Arc<KVStorePreferences>,
 | 
					
						
							| 
									
										
										
										
											2024-04-12 10:21:41 +02:00
										 |  |  |   pub search_manager: Arc<SearchManager>,
 | 
					
						
							| 
									
										
										
										
											2024-08-01 23:13:35 +08:00
										 |  |  |   pub ai_manager: Arc<AIManager>,
 | 
					
						
							| 
									
										
										
										
											2024-06-20 07:44:57 +08:00
										 |  |  |   pub storage_manager: Arc<StorageManager>,
 | 
					
						
							| 
									
										
										
										
											2021-07-14 21:12:52 +08:00
										 |  |  | }
 | 
					
						
							| 
									
										
										
										
											2021-06-28 23:58:43 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-02 23:02:49 +08:00
										 |  |  | impl AppFlowyCore {
 | 
					
						
							| 
									
										
										
										
											2024-04-07 21:36:55 +08:00
										 |  |  |   pub async fn new(
 | 
					
						
							|  |  |  |     config: AppFlowyCoreConfig,
 | 
					
						
							| 
									
										
										
										
											2024-08-19 22:08:10 +08:00
										 |  |  |     runtime: Arc<AFPluginRuntime>,
 | 
					
						
							| 
									
										
										
										
											2024-04-07 21:36:55 +08:00
										 |  |  |     stream_log_sender: Option<Arc<dyn StreamLogSender>>,
 | 
					
						
							|  |  |  |   ) -> Self {
 | 
					
						
							| 
									
										
										
										
											2024-06-30 17:38:39 +08:00
										 |  |  |     let platform = OperatingSystem::from(&config.platform);
 | 
					
						
							| 
									
										
										
										
											2023-10-30 12:35:06 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-12 18:00:07 +08:00
										 |  |  |     #[allow(clippy::if_same_then_else)]
 | 
					
						
							|  |  |  |     if cfg!(debug_assertions) {
 | 
					
						
							|  |  |  |       /// The profiling can be used to tracing the performance of the application.
 | 
					
						
							| 
									
										
										
										
											2024-03-25 08:13:49 +08:00
										 |  |  |       /// Check out the [Link](https://docs.appflowy.io/docs/documentation/software-contributions/architecture/backend/profiling#enable-profiling)
 | 
					
						
							| 
									
										
										
										
											2023-11-12 18:00:07 +08:00
										 |  |  |       ///  for more information.
 | 
					
						
							|  |  |  |       #[cfg(feature = "profiling")]
 | 
					
						
							|  |  |  |       console_subscriber::init();
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Init the logger before anything else
 | 
					
						
							|  |  |  |       #[cfg(not(feature = "profiling"))]
 | 
					
						
							| 
									
										
										
										
											2024-04-07 21:36:55 +08:00
										 |  |  |       init_log(&config, &platform, stream_log_sender);
 | 
					
						
							| 
									
										
										
										
											2023-11-12 18:00:07 +08:00
										 |  |  |     } else {
 | 
					
						
							| 
									
										
										
										
											2024-04-07 21:36:55 +08:00
										 |  |  |       init_log(&config, &platform, stream_log_sender);
 | 
					
						
							| 
									
										
										
										
											2023-11-12 18:00:07 +08:00
										 |  |  |     }
 | 
					
						
							| 
									
										
										
										
											2023-05-21 18:53:59 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-15 15:23:23 +08:00
										 |  |  |     if sysinfo::IS_SUPPORTED_SYSTEM {
 | 
					
						
							|  |  |  |       info!(
 | 
					
						
							|  |  |  |         "💡{:?}, platform: {:?}",
 | 
					
						
							|  |  |  |         System::long_os_version(),
 | 
					
						
							|  |  |  |         platform
 | 
					
						
							|  |  |  |       );
 | 
					
						
							|  |  |  |     }
 | 
					
						
							| 
									
										
										
										
											2024-04-07 21:36:55 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     Self::init(config, runtime).await
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   pub fn close_db(&self) {
 | 
					
						
							|  |  |  |     self.user_manager.close_db();
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   #[instrument(skip(config, runtime))]
 | 
					
						
							| 
									
										
										
										
											2024-08-19 22:08:10 +08:00
										 |  |  |   async fn init(config: AppFlowyCoreConfig, runtime: Arc<AFPluginRuntime>) -> Self {
 | 
					
						
							| 
									
										
										
										
											2025-04-08 20:49:15 +08:00
										 |  |  |     config.ensure_path();
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-21 18:53:59 +08:00
										 |  |  |     // Init the key value database
 | 
					
						
							| 
									
										
										
										
											2024-06-30 17:38:39 +08:00
										 |  |  |     let store_preference = Arc::new(KVStorePreferences::new(&config.storage_path).unwrap());
 | 
					
						
							| 
									
										
										
										
											2023-11-12 18:00:07 +08:00
										 |  |  |     info!("🔥{:?}", &config);
 | 
					
						
							| 
									
										
										
										
											2024-02-26 15:27:12 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-26 09:46:16 +08:00
										 |  |  |     let task_scheduler = TaskDispatcher::new(Duration::from_secs(10));
 | 
					
						
							| 
									
										
										
										
											2023-02-13 09:29:49 +08:00
										 |  |  |     let task_dispatcher = Arc::new(RwLock::new(task_scheduler));
 | 
					
						
							|  |  |  |     runtime.spawn(TaskRunner::run(task_dispatcher.clone()));
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-26 09:44:07 +08:00
										 |  |  |     let user_config = UserConfig::new(
 | 
					
						
							|  |  |  |       &config.name,
 | 
					
						
							|  |  |  |       &config.storage_path,
 | 
					
						
							|  |  |  |       &config.application_path,
 | 
					
						
							|  |  |  |       &config.device_id,
 | 
					
						
							| 
									
										
										
										
											2024-05-22 14:24:11 +08:00
										 |  |  |       config.app_version.clone(),
 | 
					
						
							| 
									
										
										
										
											2024-04-26 09:44:07 +08:00
										 |  |  |     );
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     let authenticate_user = Arc::new(AuthenticateUser::new(
 | 
					
						
							|  |  |  |       user_config.clone(),
 | 
					
						
							|  |  |  |       store_preference.clone(),
 | 
					
						
							|  |  |  |     ));
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-19 14:00:51 +08:00
										 |  |  |     debug!("🔥runtime:{}", runtime);
 | 
					
						
							| 
									
										
										
										
											2024-04-26 09:44:07 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-17 17:14:34 +08:00
										 |  |  |     let server_provider = Arc::new(ServerProvider::new(
 | 
					
						
							| 
									
										
										
										
											2023-07-14 13:37:13 +08:00
										 |  |  |       config.clone(),
 | 
					
						
							| 
									
										
										
										
											2023-08-06 11:51:03 +08:00
										 |  |  |       Arc::downgrade(&store_preference),
 | 
					
						
							| 
									
										
										
										
											2024-04-26 09:44:07 +08:00
										 |  |  |       ServerUserImpl(Arc::downgrade(&authenticate_user)),
 | 
					
						
							| 
									
										
										
										
											2023-07-14 13:37:13 +08:00
										 |  |  |     ));
 | 
					
						
							| 
									
										
										
										
											2023-06-06 16:03:29 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-30 12:35:06 +08:00
										 |  |  |     event!(tracing::Level::DEBUG, "Init managers",);
 | 
					
						
							| 
									
										
										
										
											2023-07-29 09:46:24 +08:00
										 |  |  |     let (
 | 
					
						
							| 
									
										
										
										
											2023-08-14 12:57:59 +08:00
										 |  |  |       user_manager,
 | 
					
						
							| 
									
										
										
										
											2023-07-29 09:46:24 +08:00
										 |  |  |       folder_manager,
 | 
					
						
							|  |  |  |       server_provider,
 | 
					
						
							|  |  |  |       database_manager,
 | 
					
						
							|  |  |  |       document_manager,
 | 
					
						
							|  |  |  |       collab_builder,
 | 
					
						
							| 
									
										
										
										
											2024-04-12 10:21:41 +02:00
										 |  |  |       search_manager,
 | 
					
						
							| 
									
										
										
										
											2024-08-01 23:13:35 +08:00
										 |  |  |       ai_manager,
 | 
					
						
							| 
									
										
										
										
											2024-06-20 07:44:57 +08:00
										 |  |  |       storage_manager,
 | 
					
						
							| 
									
										
										
										
											2023-10-30 12:35:06 +08:00
										 |  |  |     ) = async {
 | 
					
						
							| 
									
										
										
										
											2024-06-20 07:44:57 +08:00
										 |  |  |       let storage_manager = FileStorageResolver::resolve(
 | 
					
						
							|  |  |  |         Arc::downgrade(&authenticate_user),
 | 
					
						
							|  |  |  |         server_provider.clone(),
 | 
					
						
							|  |  |  |         &user_config.storage_path,
 | 
					
						
							|  |  |  |       );
 | 
					
						
							| 
									
										
										
										
											2023-07-29 09:46:24 +08:00
										 |  |  |       /// The shared collab builder is used to build the [Collab] instance. The plugins will be loaded
 | 
					
						
							|  |  |  |       /// on demand based on the [CollabPluginConfig].
 | 
					
						
							| 
									
										
										
										
											2023-11-20 20:54:47 +08:00
										 |  |  |       let collab_builder = Arc::new(AppFlowyCollabBuilder::new(
 | 
					
						
							|  |  |  |         server_provider.clone(),
 | 
					
						
							| 
									
										
										
										
											2024-04-26 09:44:07 +08:00
										 |  |  |         WorkspaceCollabIntegrateImpl(Arc::downgrade(&authenticate_user)),
 | 
					
						
							| 
									
										
										
										
											2024-01-12 14:34:59 +08:00
										 |  |  |       ));
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-14 12:57:59 +08:00
										 |  |  |       collab_builder
 | 
					
						
							| 
									
										
										
										
											2024-01-12 14:34:59 +08:00
										 |  |  |         .set_snapshot_persistence(Arc::new(SnapshotDBImpl(Arc::downgrade(&authenticate_user))));
 | 
					
						
							| 
									
										
										
										
											2023-07-29 09:46:24 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-14 10:36:42 +08:00
										 |  |  |       let folder_indexer = Arc::new(FolderIndexManagerImpl::new(Arc::downgrade(
 | 
					
						
							| 
									
										
										
										
											2024-12-08 18:25:25 +08:00
										 |  |  |         &authenticate_user,
 | 
					
						
							| 
									
										
										
										
											2025-04-14 10:36:42 +08:00
										 |  |  |       )));
 | 
					
						
							| 
									
										
										
										
											2024-12-08 18:25:25 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       let folder_manager = FolderDepsResolver::resolve(
 | 
					
						
							|  |  |  |         Arc::downgrade(&authenticate_user),
 | 
					
						
							|  |  |  |         collab_builder.clone(),
 | 
					
						
							|  |  |  |         server_provider.clone(),
 | 
					
						
							|  |  |  |         folder_indexer.clone(),
 | 
					
						
							|  |  |  |         store_preference.clone(),
 | 
					
						
							|  |  |  |       )
 | 
					
						
							|  |  |  |       .await;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-20 00:15:01 +08:00
										 |  |  |       let folder_query_service = FolderServiceImpl::new(
 | 
					
						
							|  |  |  |         Arc::downgrade(&folder_manager),
 | 
					
						
							|  |  |  |         Arc::downgrade(&authenticate_user),
 | 
					
						
							|  |  |  |       );
 | 
					
						
							| 
									
										
										
										
											2024-12-08 18:25:25 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-01 23:13:35 +08:00
										 |  |  |       let ai_manager = ChatDepsResolver::resolve(
 | 
					
						
							|  |  |  |         Arc::downgrade(&authenticate_user),
 | 
					
						
							|  |  |  |         server_provider.clone(),
 | 
					
						
							|  |  |  |         store_preference.clone(),
 | 
					
						
							| 
									
										
										
										
											2024-08-11 20:39:25 +08:00
										 |  |  |         Arc::downgrade(&storage_manager.storage_service),
 | 
					
						
							| 
									
										
										
										
											2024-12-20 00:15:01 +08:00
										 |  |  |         server_provider.clone(),
 | 
					
						
							| 
									
										
										
										
											2024-12-08 18:25:25 +08:00
										 |  |  |         folder_query_service.clone(),
 | 
					
						
							| 
									
										
										
										
											2025-04-17 11:11:54 +08:00
										 |  |  |         server_provider.local_ai.clone(),
 | 
					
						
							| 
									
										
										
										
											2024-08-01 23:13:35 +08:00
										 |  |  |       );
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-29 09:46:24 +08:00
										 |  |  |       let database_manager = DatabaseDepsResolver::resolve(
 | 
					
						
							| 
									
										
										
										
											2024-01-12 14:34:59 +08:00
										 |  |  |         Arc::downgrade(&authenticate_user),
 | 
					
						
							| 
									
										
										
										
											2023-07-29 09:46:24 +08:00
										 |  |  |         task_dispatcher.clone(),
 | 
					
						
							|  |  |  |         collab_builder.clone(),
 | 
					
						
							|  |  |  |         server_provider.clone(),
 | 
					
						
							| 
									
										
										
										
											2024-08-01 23:13:35 +08:00
										 |  |  |         server_provider.clone(),
 | 
					
						
							|  |  |  |         ai_manager.clone(),
 | 
					
						
							| 
									
										
										
										
											2023-07-29 09:46:24 +08:00
										 |  |  |       )
 | 
					
						
							|  |  |  |       .await;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       let document_manager = DocumentDepsResolver::resolve(
 | 
					
						
							| 
									
										
										
										
											2024-01-12 14:34:59 +08:00
										 |  |  |         Arc::downgrade(&authenticate_user),
 | 
					
						
							| 
									
										
										
										
											2023-07-29 09:46:24 +08:00
										 |  |  |         &database_manager,
 | 
					
						
							|  |  |  |         collab_builder.clone(),
 | 
					
						
							|  |  |  |         server_provider.clone(),
 | 
					
						
							| 
									
										
										
										
											2024-06-20 07:44:57 +08:00
										 |  |  |         Arc::downgrade(&storage_manager.storage_service),
 | 
					
						
							| 
									
										
										
										
											2023-07-29 09:46:24 +08:00
										 |  |  |       );
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-12 14:34:59 +08:00
										 |  |  |       let user_manager = UserDepsResolver::resolve(
 | 
					
						
							| 
									
										
										
										
											2024-04-12 10:21:41 +02:00
										 |  |  |         authenticate_user.clone(),
 | 
					
						
							| 
									
										
										
										
											2024-01-12 14:34:59 +08:00
										 |  |  |         collab_builder.clone(),
 | 
					
						
							|  |  |  |         server_provider.clone(),
 | 
					
						
							|  |  |  |         store_preference.clone(),
 | 
					
						
							|  |  |  |         database_manager.clone(),
 | 
					
						
							|  |  |  |         folder_manager.clone(),
 | 
					
						
							|  |  |  |       )
 | 
					
						
							|  |  |  |       .await;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-13 01:37:19 +02:00
										 |  |  |       let search_manager = SearchDepsResolver::resolve(
 | 
					
						
							|  |  |  |         folder_indexer,
 | 
					
						
							|  |  |  |         server_provider.clone(),
 | 
					
						
							|  |  |  |         folder_manager.clone(),
 | 
					
						
							|  |  |  |       )
 | 
					
						
							|  |  |  |       .await;
 | 
					
						
							| 
									
										
										
										
											2024-04-12 10:21:41 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-08 18:25:25 +08:00
										 |  |  |       // Register the folder operation handlers
 | 
					
						
							|  |  |  |       register_handlers(
 | 
					
						
							|  |  |  |         &folder_manager,
 | 
					
						
							|  |  |  |         document_manager.clone(),
 | 
					
						
							|  |  |  |         database_manager.clone(),
 | 
					
						
							|  |  |  |         ai_manager.clone(),
 | 
					
						
							|  |  |  |       );
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-29 09:46:24 +08:00
										 |  |  |       (
 | 
					
						
							| 
									
										
										
										
											2023-08-14 12:57:59 +08:00
										 |  |  |         user_manager,
 | 
					
						
							| 
									
										
										
										
											2023-07-29 09:46:24 +08:00
										 |  |  |         folder_manager,
 | 
					
						
							|  |  |  |         server_provider,
 | 
					
						
							|  |  |  |         database_manager,
 | 
					
						
							|  |  |  |         document_manager,
 | 
					
						
							|  |  |  |         collab_builder,
 | 
					
						
							| 
									
										
										
										
											2024-04-12 10:21:41 +02:00
										 |  |  |         search_manager,
 | 
					
						
							| 
									
										
										
										
											2024-08-01 23:13:35 +08:00
										 |  |  |         ai_manager,
 | 
					
						
							| 
									
										
										
										
											2024-06-20 07:44:57 +08:00
										 |  |  |         storage_manager,
 | 
					
						
							| 
									
										
										
										
											2023-07-29 09:46:24 +08:00
										 |  |  |       )
 | 
					
						
							| 
									
										
										
										
											2023-10-30 12:35:06 +08:00
										 |  |  |     }
 | 
					
						
							|  |  |  |     .await;
 | 
					
						
							| 
									
										
										
										
											2023-02-13 09:29:49 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-02 09:12:24 +02:00
										 |  |  |     let user_status_callback = UserStatusCallbackImpl {
 | 
					
						
							| 
									
										
										
										
											2025-04-20 18:07:02 +08:00
										 |  |  |       user_manager: user_manager.clone(),
 | 
					
						
							| 
									
										
										
										
											2023-07-29 09:46:24 +08:00
										 |  |  |       collab_builder,
 | 
					
						
							| 
									
										
										
										
											2023-02-13 09:29:49 +08:00
										 |  |  |       folder_manager: folder_manager.clone(),
 | 
					
						
							| 
									
										
										
										
											2023-02-26 16:27:17 +08:00
										 |  |  |       database_manager: database_manager.clone(),
 | 
					
						
							| 
									
										
										
										
											2023-07-29 09:46:24 +08:00
										 |  |  |       document_manager: document_manager.clone(),
 | 
					
						
							| 
									
										
										
										
											2023-08-12 17:36:31 +08:00
										 |  |  |       server_provider: server_provider.clone(),
 | 
					
						
							| 
									
										
										
										
											2024-06-20 07:44:57 +08:00
										 |  |  |       storage_manager: storage_manager.clone(),
 | 
					
						
							| 
									
										
										
										
											2024-08-01 23:13:35 +08:00
										 |  |  |       ai_manager: ai_manager.clone(),
 | 
					
						
							| 
									
										
										
										
											2025-03-10 08:54:32 +08:00
										 |  |  |       runtime: runtime.clone(),
 | 
					
						
							| 
									
										
										
										
											2023-02-13 09:29:49 +08:00
										 |  |  |     };
 | 
					
						
							| 
									
										
										
										
											2023-05-21 18:53:59 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-02 09:12:24 +02:00
										 |  |  |     let collab_interact_impl = CollabInteractImpl {
 | 
					
						
							|  |  |  |       database_manager: Arc::downgrade(&database_manager),
 | 
					
						
							|  |  |  |       document_manager: Arc::downgrade(&document_manager),
 | 
					
						
							|  |  |  |     };
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-20 20:54:47 +08:00
										 |  |  |     let cloned_user_manager = Arc::downgrade(&user_manager);
 | 
					
						
							|  |  |  |     if let Some(user_manager) = cloned_user_manager.upgrade() {
 | 
					
						
							|  |  |  |       if let Err(err) = user_manager
 | 
					
						
							| 
									
										
										
										
											2024-02-08 23:53:05 +08:00
										 |  |  |         .init_with_callback(user_status_callback, collab_interact_impl)
 | 
					
						
							| 
									
										
										
										
											2023-10-30 12:35:06 +08:00
										 |  |  |         .await
 | 
					
						
							|  |  |  |       {
 | 
					
						
							|  |  |  |         error!("Init user failed: {}", err)
 | 
					
						
							| 
									
										
										
										
											2023-07-05 20:57:09 +08:00
										 |  |  |       }
 | 
					
						
							| 
									
										
										
										
											2023-10-30 12:35:06 +08:00
										 |  |  |     }
 | 
					
						
							| 
									
										
										
										
											2024-08-20 17:07:54 +08:00
										 |  |  |     #[allow(clippy::arc_with_non_send_sync)]
 | 
					
						
							| 
									
										
										
										
											2024-08-19 22:08:10 +08:00
										 |  |  |     let event_dispatcher = Arc::new(AFPluginDispatcher::new(
 | 
					
						
							| 
									
										
										
										
											2024-01-06 00:37:26 +08:00
										 |  |  |       runtime,
 | 
					
						
							| 
									
										
										
										
											2023-02-13 09:29:49 +08:00
										 |  |  |       make_plugins(
 | 
					
						
							| 
									
										
										
										
											2023-07-29 09:46:24 +08:00
										 |  |  |         Arc::downgrade(&folder_manager),
 | 
					
						
							|  |  |  |         Arc::downgrade(&database_manager),
 | 
					
						
							| 
									
										
										
										
											2023-08-14 12:57:59 +08:00
										 |  |  |         Arc::downgrade(&user_manager),
 | 
					
						
							| 
									
										
										
										
											2023-07-29 09:46:24 +08:00
										 |  |  |         Arc::downgrade(&document_manager),
 | 
					
						
							| 
									
										
										
										
											2024-04-12 10:21:41 +02:00
										 |  |  |         Arc::downgrade(&search_manager),
 | 
					
						
							| 
									
										
										
										
											2024-08-01 23:13:35 +08:00
										 |  |  |         Arc::downgrade(&ai_manager),
 | 
					
						
							| 
									
										
										
										
											2024-09-04 07:56:08 +08:00
										 |  |  |         Arc::downgrade(&storage_manager),
 | 
					
						
							| 
									
										
										
										
											2024-01-06 00:37:26 +08:00
										 |  |  |       ),
 | 
					
						
							|  |  |  |     ));
 | 
					
						
							| 
									
										
										
										
											2023-02-13 09:29:49 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     Self {
 | 
					
						
							|  |  |  |       config,
 | 
					
						
							| 
									
										
										
										
											2023-08-14 12:57:59 +08:00
										 |  |  |       user_manager,
 | 
					
						
							| 
									
										
										
										
											2023-07-29 09:46:24 +08:00
										 |  |  |       document_manager,
 | 
					
						
							| 
									
										
										
										
											2023-02-13 09:29:49 +08:00
										 |  |  |       folder_manager,
 | 
					
						
							| 
									
										
										
										
											2023-02-26 16:27:17 +08:00
										 |  |  |       database_manager,
 | 
					
						
							| 
									
										
										
										
											2023-02-13 09:29:49 +08:00
										 |  |  |       event_dispatcher,
 | 
					
						
							| 
									
										
										
										
											2023-05-21 18:53:59 +08:00
										 |  |  |       server_provider,
 | 
					
						
							| 
									
										
										
										
											2023-02-13 09:29:49 +08:00
										 |  |  |       task_dispatcher,
 | 
					
						
							| 
									
										
										
										
											2023-08-14 12:57:59 +08:00
										 |  |  |       store_preference,
 | 
					
						
							| 
									
										
										
										
											2024-04-12 10:21:41 +02:00
										 |  |  |       search_manager,
 | 
					
						
							| 
									
										
										
										
											2024-08-01 23:13:35 +08:00
										 |  |  |       ai_manager,
 | 
					
						
							| 
									
										
										
										
											2024-06-20 07:44:57 +08:00
										 |  |  |       storage_manager,
 | 
					
						
							| 
									
										
										
										
											2022-01-23 12:14:00 +08:00
										 |  |  |     }
 | 
					
						
							| 
									
										
										
										
											2023-02-13 09:29:49 +08:00
										 |  |  |   }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-29 09:46:24 +08:00
										 |  |  |   /// Only expose the dispatcher in test
 | 
					
						
							| 
									
										
										
										
											2024-08-19 22:08:10 +08:00
										 |  |  |   pub fn dispatcher(&self) -> Arc<AFPluginDispatcher> {
 | 
					
						
							| 
									
										
										
										
											2023-02-13 09:29:49 +08:00
										 |  |  |     self.event_dispatcher.clone()
 | 
					
						
							|  |  |  |   }
 | 
					
						
							| 
									
										
										
										
											2021-09-04 15:12:53 +08:00
										 |  |  | }
 | 
					
						
							| 
									
										
										
										
											2021-07-17 10:26:05 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-26 09:44:07 +08:00
										 |  |  | struct ServerUserImpl(Weak<AuthenticateUser>);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | impl ServerUserImpl {
 | 
					
						
							|  |  |  |   fn upgrade_user(&self) -> Result<Arc<AuthenticateUser>, FlowyError> {
 | 
					
						
							|  |  |  |     let user = self
 | 
					
						
							|  |  |  |       .0
 | 
					
						
							|  |  |  |       .upgrade()
 | 
					
						
							|  |  |  |       .ok_or(FlowyError::internal().with_context("Unexpected error: UserSession is None"))?;
 | 
					
						
							|  |  |  |     Ok(user)
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | }
 | 
					
						
							| 
									
										
										
										
											2025-04-17 20:49:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | #[async_trait]
 | 
					
						
							| 
									
										
										
										
											2025-04-19 14:00:51 +08:00
										 |  |  | impl LoggedUser for ServerUserImpl {
 | 
					
						
							| 
									
										
										
										
											2025-04-07 19:24:58 +08:00
										 |  |  |   fn workspace_id(&self) -> FlowyResult<Uuid> {
 | 
					
						
							| 
									
										
										
										
											2024-04-26 09:44:07 +08:00
										 |  |  |     self.upgrade_user()?.workspace_id()
 | 
					
						
							|  |  |  |   }
 | 
					
						
							| 
									
										
										
										
											2025-04-16 20:59:25 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   fn user_id(&self) -> FlowyResult<i64> {
 | 
					
						
							|  |  |  |     self.upgrade_user()?.user_id()
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-17 20:49:24 +08:00
										 |  |  |   async fn is_local_mode(&self) -> FlowyResult<bool> {
 | 
					
						
							|  |  |  |     self.upgrade_user()?.is_local_mode().await
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-16 20:59:25 +08:00
										 |  |  |   fn get_sqlite_db(&self, uid: i64) -> Result<DBConnection, FlowyError> {
 | 
					
						
							|  |  |  |     self.upgrade_user()?.get_sqlite_connection(uid)
 | 
					
						
							|  |  |  |   }
 | 
					
						
							| 
									
										
										
										
											2025-04-17 11:11:54 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-20 15:54:37 +08:00
										 |  |  |   fn get_collab_db(&self, uid: i64) -> Result<Weak<CollabKVDB>, FlowyError> {
 | 
					
						
							|  |  |  |     self.upgrade_user()?.get_collab_db(uid)
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-17 11:11:54 +08:00
										 |  |  |   fn application_root_dir(&self) -> Result<PathBuf, FlowyError> {
 | 
					
						
							|  |  |  |     Ok(PathBuf::from(
 | 
					
						
							|  |  |  |       self.upgrade_user()?.get_application_root_dir(),
 | 
					
						
							|  |  |  |     ))
 | 
					
						
							|  |  |  |   }
 | 
					
						
							| 
									
										
										
										
											2024-04-26 09:44:07 +08:00
										 |  |  | }
 |