use std::sync::Arc; use collab_plugins::cloud_storage::{CollabObject, RemoteCollabStorage}; use parking_lot::RwLock; use tokio::sync::mpsc; use flowy_database_deps::cloud::DatabaseCloudService; use flowy_document_deps::cloud::DocumentCloudService; use flowy_error::FlowyError; use flowy_folder_deps::cloud::FolderCloudService; // use flowy_user::services::database::{ // get_user_profile, get_user_workspace, open_collab_db, open_user_db, // }; use flowy_user_deps::cloud::UserService; use flowy_user_deps::entities::*; use crate::local_server::impls::{ LocalServerDatabaseCloudServiceImpl, LocalServerDocumentCloudServiceImpl, LocalServerFolderCloudServiceImpl, LocalServerUserAuthServiceImpl, }; use crate::AppFlowyServer; pub trait LocalServerDB: Send + Sync + 'static { fn get_user_profile(&self, uid: i64) -> Result, FlowyError>; fn get_user_workspace(&self, uid: i64) -> Result, FlowyError>; fn get_collab_updates(&self, uid: i64, object_id: &str) -> Result>, FlowyError>; } pub struct LocalServer { local_db: Arc, stop_tx: RwLock>>, } impl LocalServer { pub fn new(local_db: Arc) -> Self { Self { local_db, stop_tx: Default::default(), } } pub async fn stop(&self) { let sender = self.stop_tx.read().clone(); if let Some(stop_tx) = sender { let _ = stop_tx.send(()).await; } } } impl AppFlowyServer for LocalServer { fn user_service(&self) -> Arc { Arc::new(LocalServerUserAuthServiceImpl { db: self.local_db.clone(), }) } fn folder_service(&self) -> Arc { Arc::new(LocalServerFolderCloudServiceImpl { db: self.local_db.clone(), }) } fn database_service(&self) -> Arc { Arc::new(LocalServerDatabaseCloudServiceImpl()) } fn document_service(&self) -> Arc { Arc::new(LocalServerDocumentCloudServiceImpl()) } fn collab_storage(&self, _collab_object: &CollabObject) -> Option> { None } }