mirror of
				https://github.com/AppFlowy-IO/AppFlowy.git
				synced 2025-10-31 18:15:09 +00:00 
			
		
		
		
	Merge pull request #7779 from AppFlowy-IO/server_type
refactor: server type name
This commit is contained in:
		
						commit
						d24383b6ea
					
				| @ -1,4 +1,4 @@ | ||||
| use crate::server_layer::{Server, ServerProvider}; | ||||
| use crate::server_layer::ServerProvider; | ||||
| use client_api::collab_sync::{SinkConfig, SyncObject, SyncPlugin}; | ||||
| use client_api::entity::ai_dto::RepeatedRelatedQuestion; | ||||
| use client_api::entity::workspace_dto::PublishInfoView; | ||||
| @ -35,7 +35,7 @@ use flowy_server_pub::af_cloud_config::AFCloudConfiguration; | ||||
| use flowy_storage_pub::cloud::{ObjectIdentity, ObjectValue, StorageCloudService}; | ||||
| use flowy_storage_pub::storage::{CompletedPartRequest, CreateUploadResponse, UploadPartResponse}; | ||||
| use flowy_user_pub::cloud::{UserCloudService, UserCloudServiceProvider}; | ||||
| use flowy_user_pub::entities::{Authenticator, UserTokenState}; | ||||
| use flowy_user_pub::entities::{AuthType, UserTokenState}; | ||||
| use lib_infra::async_trait::async_trait; | ||||
| use serde_json::Value; | ||||
| use std::collections::HashMap; | ||||
| @ -186,18 +186,18 @@ impl UserCloudServiceProvider for ServerProvider { | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   /// When user login, the provider type is set by the [Authenticator] and save to disk for next use.
 | ||||
|   /// When user login, the provider type is set by the [AuthType] and save to disk for next use.
 | ||||
|   ///
 | ||||
|   /// Each [Authenticator] has a corresponding [Server]. The [Server] is used
 | ||||
|   /// to create a new [AppFlowyServer] if it doesn't exist. Once the [Server] is set,
 | ||||
|   /// Each [AuthType] has a corresponding [AuthType]. The [AuthType] is used
 | ||||
|   /// to create a new [AppFlowyServer] if it doesn't exist. Once the [AuthType] is set,
 | ||||
|   /// it will be used when user open the app again.
 | ||||
|   ///
 | ||||
|   fn set_user_authenticator(&self, authenticator: &Authenticator) { | ||||
|     self.set_authenticator(authenticator.clone()); | ||||
|   fn set_server_auth_type(&self, auth_type: &AuthType) { | ||||
|     self.set_auth_type(*auth_type); | ||||
|   } | ||||
| 
 | ||||
|   fn get_user_authenticator(&self) -> Authenticator { | ||||
|     self.get_authenticator() | ||||
|   fn get_server_auth_type(&self) -> AuthType { | ||||
|     self.get_auth_type() | ||||
|   } | ||||
| 
 | ||||
|   fn set_network_reachable(&self, reachable: bool) { | ||||
| @ -211,7 +211,7 @@ impl UserCloudServiceProvider for ServerProvider { | ||||
|     self.encryption.set_secret(secret); | ||||
|   } | ||||
| 
 | ||||
|   /// Returns the [UserCloudService] base on the current [Server].
 | ||||
|   /// Returns the [UserCloudService] base on the current [AuthType].
 | ||||
|   /// Creates a new [AppFlowyServer] if it doesn't exist.
 | ||||
|   fn get_user_service(&self) -> Result<Arc<dyn UserCloudService>, FlowyError> { | ||||
|     let user_service = self.get_server()?.user_service(); | ||||
| @ -219,9 +219,9 @@ impl UserCloudServiceProvider for ServerProvider { | ||||
|   } | ||||
| 
 | ||||
|   fn service_url(&self) -> String { | ||||
|     match self.get_server_type() { | ||||
|       Server::Local => "".to_string(), | ||||
|       Server::AppFlowyCloud => AFCloudConfiguration::from_env() | ||||
|     match self.get_auth_type() { | ||||
|       AuthType::Local => "".to_string(), | ||||
|       AuthType::AppFlowyCloud => AFCloudConfiguration::from_env() | ||||
|         .map(|config| config.base_url) | ||||
|         .unwrap_or_default(), | ||||
|     } | ||||
| @ -578,12 +578,15 @@ impl DocumentCloudService for ServerProvider { | ||||
| 
 | ||||
| impl CollabCloudPluginProvider for ServerProvider { | ||||
|   fn provider_type(&self) -> CollabPluginProviderType { | ||||
|     self.get_server_type().into() | ||||
|     match self.get_auth_type() { | ||||
|       AuthType::Local => CollabPluginProviderType::Local, | ||||
|       AuthType::AppFlowyCloud => CollabPluginProviderType::AppFlowyCloud, | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   fn get_plugins(&self, context: CollabPluginProviderContext) -> Vec<Box<dyn CollabPlugin>> { | ||||
|     // If the user is local, we don't need to create a sync plugin.
 | ||||
|     if self.get_server_type().is_local() { | ||||
|     if self.get_auth_type().is_local() { | ||||
|       debug!( | ||||
|         "User authenticator is local, skip create sync plugin for: {}", | ||||
|         context | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| #![allow(unused_doc_comments)] | ||||
| 
 | ||||
| use collab_integrate::collab_builder::{AppFlowyCollabBuilder, CollabPluginProviderType}; | ||||
| use collab_integrate::collab_builder::AppFlowyCollabBuilder; | ||||
| use flowy_ai::ai_manager::AIManager; | ||||
| use flowy_database2::DatabaseManager; | ||||
| use flowy_document::manager::DocumentManager; | ||||
| @ -34,7 +34,7 @@ use crate::config::AppFlowyCoreConfig; | ||||
| use crate::deps_resolve::file_storage_deps::FileStorageResolver; | ||||
| use crate::deps_resolve::*; | ||||
| use crate::log_filter::init_log; | ||||
| use crate::server_layer::{current_server_type, Server, ServerProvider}; | ||||
| use crate::server_layer::{current_server_type, ServerProvider}; | ||||
| use deps_resolve::reminder_deps::CollabInteractImpl; | ||||
| use flowy_sqlite::DBConnection; | ||||
| use lib_infra::async_trait::async_trait; | ||||
| @ -131,12 +131,12 @@ impl AppFlowyCore { | ||||
|       store_preference.clone(), | ||||
|     )); | ||||
| 
 | ||||
|     let server_type = current_server_type(); | ||||
|     debug!("🔥runtime:{}, server:{}", runtime, server_type); | ||||
|     let auth_type = current_server_type(); | ||||
|     debug!("🔥runtime:{}, server:{}", runtime, auth_type); | ||||
| 
 | ||||
|     let server_provider = Arc::new(ServerProvider::new( | ||||
|       config.clone(), | ||||
|       server_type, | ||||
|       auth_type, | ||||
|       Arc::downgrade(&store_preference), | ||||
|       ServerUserImpl(Arc::downgrade(&authenticate_user)), | ||||
|     )); | ||||
| @ -314,15 +314,6 @@ impl AppFlowyCore { | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| impl From<Server> for CollabPluginProviderType { | ||||
|   fn from(server_type: Server) -> Self { | ||||
|     match server_type { | ||||
|       Server::Local => CollabPluginProviderType::Local, | ||||
|       Server::AppFlowyCloud => CollabPluginProviderType::AppFlowyCloud, | ||||
|     } | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| struct ServerUserImpl(Weak<AuthenticateUser>); | ||||
| 
 | ||||
| impl ServerUserImpl { | ||||
|  | ||||
| @ -1,179 +1,108 @@ | ||||
| use crate::AppFlowyCoreConfig; | ||||
| use af_plugin::manager::PluginManager; | ||||
| use arc_swap::ArcSwapOption; | ||||
| use arc_swap::{ArcSwap, ArcSwapOption}; | ||||
| use dashmap::DashMap; | ||||
| use flowy_ai::local_ai::controller::LocalAIController; | ||||
| use flowy_error::{FlowyError, FlowyResult}; | ||||
| use flowy_server::af_cloud::define::{AIUserServiceImpl, LoginUserService}; | ||||
| use flowy_server::af_cloud::AppFlowyCloudServer; | ||||
| use flowy_server::af_cloud::{ | ||||
|   define::{AIUserServiceImpl, LoginUserService}, | ||||
|   AppFlowyCloudServer, | ||||
| }; | ||||
| use flowy_server::local_server::LocalServer; | ||||
| use flowy_server::{AppFlowyEncryption, AppFlowyServer, EncryptionImpl}; | ||||
| use flowy_server_pub::AuthenticatorType; | ||||
| use flowy_sqlite::kv::KVStorePreferences; | ||||
| use flowy_user_pub::entities::*; | ||||
| use serde_repr::*; | ||||
| use std::fmt::{Display, Formatter}; | ||||
| use std::sync::atomic::{AtomicBool, AtomicU8, Ordering}; | ||||
| use std::sync::atomic::{AtomicBool, Ordering}; | ||||
| use std::sync::{Arc, Weak}; | ||||
| 
 | ||||
| #[derive(Debug, Clone, Hash, Eq, PartialEq, Serialize_repr, Deserialize_repr)] | ||||
| #[repr(u8)] | ||||
| pub enum Server { | ||||
|   /// Local server provider.
 | ||||
|   /// Offline mode, no user authentication and the data is stored locally.
 | ||||
|   Local = 0, | ||||
|   /// AppFlowy Cloud server provider.
 | ||||
|   /// See: https://github.com/AppFlowy-IO/AppFlowy-Cloud
 | ||||
|   AppFlowyCloud = 1, | ||||
| } | ||||
| 
 | ||||
| impl Server { | ||||
|   pub fn is_local(&self) -> bool { | ||||
|     matches!(self, Server::Local) | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| impl Display for Server { | ||||
|   fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { | ||||
|     match self { | ||||
|       Server::Local => write!(f, "Local"), | ||||
|       Server::AppFlowyCloud => write!(f, "AppFlowyCloud"), | ||||
|     } | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| /// The [ServerProvider] provides list of [AppFlowyServer] base on the [Authenticator]. Using
 | ||||
| /// the auth type, the [ServerProvider] will create a new [AppFlowyServer] if it doesn't
 | ||||
| /// exist.
 | ||||
| /// Each server implements the [AppFlowyServer] trait, which provides the [UserCloudService], etc.
 | ||||
| pub struct ServerProvider { | ||||
|   config: AppFlowyCoreConfig, | ||||
|   providers: DashMap<Server, Arc<dyn AppFlowyServer>>, | ||||
|   pub(crate) encryption: Arc<dyn AppFlowyEncryption>, | ||||
|   #[allow(dead_code)] | ||||
|   pub(crate) store_preferences: Weak<KVStorePreferences>, | ||||
|   pub(crate) user_enable_sync: AtomicBool, | ||||
| 
 | ||||
|   /// The authenticator type of the user.
 | ||||
|   authenticator: AtomicU8, | ||||
|   providers: DashMap<AuthType, Arc<dyn AppFlowyServer>>, | ||||
|   auth_type: ArcSwap<AuthType>, | ||||
|   user: Arc<dyn LoginUserService>, | ||||
|   pub(crate) uid: Arc<ArcSwapOption<i64>>, | ||||
|   pub local_ai: Arc<LocalAIController>, | ||||
|   pub uid: Arc<ArcSwapOption<i64>>, | ||||
|   pub user_enable_sync: Arc<AtomicBool>, | ||||
|   pub encryption: Arc<dyn AppFlowyEncryption>, | ||||
| } | ||||
| 
 | ||||
| impl ServerProvider { | ||||
|   pub fn new( | ||||
|     config: AppFlowyCoreConfig, | ||||
|     server: Server, | ||||
|     initial_auth: AuthType, | ||||
|     store_preferences: Weak<KVStorePreferences>, | ||||
|     server_user: impl LoginUserService + 'static, | ||||
|     user_service: impl LoginUserService + 'static, | ||||
|   ) -> Self { | ||||
|     let user = Arc::new(server_user); | ||||
|     let encryption = EncryptionImpl::new(None); | ||||
|     let user_service = Arc::new(AIUserServiceImpl(user.clone())); | ||||
|     let plugin_manager = Arc::new(PluginManager::new()); | ||||
|     let user = Arc::new(user_service); | ||||
|     let auth_type = ArcSwap::from(Arc::new(initial_auth)); | ||||
|     let encryption = Arc::new(EncryptionImpl::new(None)) as Arc<dyn AppFlowyEncryption>; | ||||
|     let ai_user = Arc::new(AIUserServiceImpl(user.clone())); | ||||
|     let plugins = Arc::new(PluginManager::new()); | ||||
|     let local_ai = Arc::new(LocalAIController::new( | ||||
|       plugin_manager.clone(), | ||||
|       store_preferences.clone(), | ||||
|       user_service.clone(), | ||||
|       plugins, | ||||
|       store_preferences, | ||||
|       ai_user.clone(), | ||||
|     )); | ||||
| 
 | ||||
|     Self { | ||||
|     ServerProvider { | ||||
|       config, | ||||
|       providers: DashMap::new(), | ||||
|       user_enable_sync: AtomicBool::new(true), | ||||
|       authenticator: AtomicU8::new(Authenticator::from(server) as u8), | ||||
|       encryption: Arc::new(encryption), | ||||
|       store_preferences, | ||||
|       uid: Default::default(), | ||||
|       encryption, | ||||
|       user_enable_sync: Arc::new(AtomicBool::new(true)), | ||||
|       auth_type, | ||||
|       user, | ||||
|       uid: Default::default(), | ||||
|       local_ai, | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   pub fn get_server_type(&self) -> Server { | ||||
|     match Authenticator::from(self.authenticator.load(Ordering::Acquire) as i32) { | ||||
|       Authenticator::Local => Server::Local, | ||||
|       Authenticator::AppFlowyCloud => Server::AppFlowyCloud, | ||||
|   pub fn set_auth_type(&self, new_auth_type: AuthType) { | ||||
|     let old_type = self.get_auth_type(); | ||||
|     if old_type != new_auth_type { | ||||
|       self.auth_type.store(Arc::new(new_auth_type)); | ||||
|       self.providers.remove(&old_type); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   pub fn set_authenticator(&self, authenticator: Authenticator) { | ||||
|     let old_server_type = self.get_server_type(); | ||||
|     self | ||||
|       .authenticator | ||||
|       .store(authenticator as u8, Ordering::Release); | ||||
|     let new_server_type = self.get_server_type(); | ||||
| 
 | ||||
|     if old_server_type != new_server_type { | ||||
|       self.providers.remove(&old_server_type); | ||||
|     } | ||||
|   pub fn get_auth_type(&self) -> AuthType { | ||||
|     *self.auth_type.load_full().as_ref() | ||||
|   } | ||||
| 
 | ||||
|   pub fn get_authenticator(&self) -> Authenticator { | ||||
|     Authenticator::from(self.authenticator.load(Ordering::Acquire) as i32) | ||||
|   } | ||||
| 
 | ||||
|   /// Returns a [AppFlowyServer] trait implementation base on the provider_type.
 | ||||
|   /// Lazily create or fetch an AppFlowyServer instance
 | ||||
|   pub fn get_server(&self) -> FlowyResult<Arc<dyn AppFlowyServer>> { | ||||
|     let server_type = self.get_server_type(); | ||||
| 
 | ||||
|     if let Some(provider) = self.providers.get(&server_type) { | ||||
|       return Ok(provider.value().clone()); | ||||
|     let auth_type = self.get_auth_type(); | ||||
|     if let Some(entry) = self.providers.get(&auth_type) { | ||||
|       return Ok(entry.clone()); | ||||
|     } | ||||
| 
 | ||||
|     let server = match server_type { | ||||
|       Server::Local => { | ||||
|         let server = Arc::new(LocalServer::new(self.user.clone(), self.local_ai.clone())); | ||||
|         Ok::<Arc<dyn AppFlowyServer>, FlowyError>(server) | ||||
|       }, | ||||
|       Server::AppFlowyCloud => { | ||||
|         let config = self.config.cloud_config.clone().ok_or_else(|| { | ||||
|           FlowyError::internal().with_context("AppFlowyCloud configuration is missing") | ||||
|         })?; | ||||
|         let server = Arc::new(AppFlowyCloudServer::new( | ||||
|           config, | ||||
|     let server: Arc<dyn AppFlowyServer> = match auth_type { | ||||
|       AuthType::Local => Arc::new(LocalServer::new(self.user.clone(), self.local_ai.clone())), | ||||
|       AuthType::AppFlowyCloud => { | ||||
|         let cfg = self | ||||
|           .config | ||||
|           .cloud_config | ||||
|           .clone() | ||||
|           .ok_or_else(|| FlowyError::internal().with_context("Missing cloud config"))?; | ||||
|         Arc::new(AppFlowyCloudServer::new( | ||||
|           cfg, | ||||
|           self.user_enable_sync.load(Ordering::Acquire), | ||||
|           self.config.device_id.clone(), | ||||
|           self.config.app_version.clone(), | ||||
|           self.user.clone(), | ||||
|         )); | ||||
| 
 | ||||
|         Ok::<Arc<dyn AppFlowyServer>, FlowyError>(server) | ||||
|         )) | ||||
|       }, | ||||
|     }?; | ||||
|     }; | ||||
| 
 | ||||
|     self.providers.insert(server_type.clone(), server.clone()); | ||||
|     self.providers.insert(auth_type, server.clone()); | ||||
|     Ok(server) | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| impl From<Authenticator> for Server { | ||||
|   fn from(auth_provider: Authenticator) -> Self { | ||||
|     match auth_provider { | ||||
|       Authenticator::Local => Server::Local, | ||||
|       Authenticator::AppFlowyCloud => Server::AppFlowyCloud, | ||||
|     } | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| impl From<Server> for Authenticator { | ||||
|   fn from(ty: Server) -> Self { | ||||
|     match ty { | ||||
|       Server::Local => Authenticator::Local, | ||||
|       Server::AppFlowyCloud => Authenticator::AppFlowyCloud, | ||||
|     } | ||||
|   } | ||||
| } | ||||
| impl From<&Authenticator> for Server { | ||||
|   fn from(auth_provider: &Authenticator) -> Self { | ||||
|     Self::from(auth_provider.clone()) | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| pub fn current_server_type() -> Server { | ||||
| /// Determine current server type from ENV
 | ||||
| pub fn current_server_type() -> AuthType { | ||||
|   match AuthenticatorType::from_env() { | ||||
|     AuthenticatorType::Local => Server::Local, | ||||
|     AuthenticatorType::AppFlowyCloud => Server::AppFlowyCloud, | ||||
|     AuthenticatorType::Local => AuthType::Local, | ||||
|     AuthenticatorType::AppFlowyCloud => AuthType::AppFlowyCloud, | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -14,11 +14,11 @@ use flowy_folder::manager::{FolderInitDataSource, FolderManager}; | ||||
| use flowy_storage::manager::StorageManager; | ||||
| use flowy_user::event_map::UserStatusCallback; | ||||
| use flowy_user_pub::cloud::{UserCloudConfig, UserCloudServiceProvider}; | ||||
| use flowy_user_pub::entities::{Authenticator, UserProfile, UserWorkspace}; | ||||
| use flowy_user_pub::entities::{AuthType, UserProfile, UserWorkspace}; | ||||
| use lib_dispatch::runtime::AFPluginRuntime; | ||||
| use lib_infra::async_trait::async_trait; | ||||
| 
 | ||||
| use crate::server_layer::{Server, ServerProvider}; | ||||
| use crate::server_layer::ServerProvider; | ||||
| 
 | ||||
| pub(crate) struct UserStatusCallbackImpl { | ||||
|   pub(crate) collab_builder: Arc<AppFlowyCollabBuilder>, | ||||
| @ -49,16 +49,14 @@ impl UserStatusCallback for UserStatusCallbackImpl { | ||||
|   async fn did_init( | ||||
|     &self, | ||||
|     user_id: i64, | ||||
|     user_authenticator: &Authenticator, | ||||
|     auth_type: &AuthType, | ||||
|     cloud_config: &Option<UserCloudConfig>, | ||||
|     user_workspace: &UserWorkspace, | ||||
|     _device_id: &str, | ||||
|     authenticator: &Authenticator, | ||||
|     authenticator: &AuthType, | ||||
|   ) -> FlowyResult<()> { | ||||
|     let workspace_id = user_workspace.workspace_id()?; | ||||
|     self | ||||
|       .server_provider | ||||
|       .set_user_authenticator(user_authenticator); | ||||
|     self.server_provider.set_auth_type(*auth_type); | ||||
| 
 | ||||
|     if let Some(cloud_config) = cloud_config { | ||||
|       self | ||||
| @ -83,7 +81,7 @@ impl UserStatusCallback for UserStatusCallbackImpl { | ||||
|       .await?; | ||||
|     self | ||||
|       .database_manager | ||||
|       .initialize(user_id, authenticator == &Authenticator::Local) | ||||
|       .initialize(user_id, authenticator == &AuthType::Local) | ||||
|       .await?; | ||||
|     self.document_manager.initialize(user_id).await?; | ||||
| 
 | ||||
| @ -97,7 +95,7 @@ impl UserStatusCallback for UserStatusCallbackImpl { | ||||
|     user_id: i64, | ||||
|     user_workspace: &UserWorkspace, | ||||
|     device_id: &str, | ||||
|     authenticator: &Authenticator, | ||||
|     authenticator: &AuthType, | ||||
|   ) -> FlowyResult<()> { | ||||
|     event!( | ||||
|       tracing::Level::TRACE, | ||||
| @ -127,12 +125,9 @@ impl UserStatusCallback for UserStatusCallbackImpl { | ||||
|     user_profile: &UserProfile, | ||||
|     user_workspace: &UserWorkspace, | ||||
|     device_id: &str, | ||||
|     authenticator: &Authenticator, | ||||
|     auth_type: &AuthType, | ||||
|   ) -> FlowyResult<()> { | ||||
|     self | ||||
|       .server_provider | ||||
|       .set_user_authenticator(&user_profile.authenticator); | ||||
|     let server_type = self.server_provider.get_server_type(); | ||||
|     self.server_provider.set_auth_type(*auth_type); | ||||
| 
 | ||||
|     event!( | ||||
|       tracing::Level::TRACE, | ||||
| @ -158,17 +153,17 @@ impl UserStatusCallback for UserStatusCallbackImpl { | ||||
|       ) | ||||
|       .await | ||||
|     { | ||||
|       Ok(doc_state) => match server_type { | ||||
|         Server::Local => FolderInitDataSource::LocalDisk { | ||||
|       Ok(doc_state) => match auth_type { | ||||
|         AuthType::Local => FolderInitDataSource::LocalDisk { | ||||
|           create_if_not_exist: true, | ||||
|         }, | ||||
|         Server::AppFlowyCloud => FolderInitDataSource::Cloud(doc_state), | ||||
|         AuthType::AppFlowyCloud => FolderInitDataSource::Cloud(doc_state), | ||||
|       }, | ||||
|       Err(err) => match server_type { | ||||
|         Server::Local => FolderInitDataSource::LocalDisk { | ||||
|       Err(err) => match auth_type { | ||||
|         AuthType::Local => FolderInitDataSource::LocalDisk { | ||||
|           create_if_not_exist: true, | ||||
|         }, | ||||
|         Server::AppFlowyCloud => { | ||||
|         AuthType::AppFlowyCloud => { | ||||
|           return Err(err); | ||||
|         }, | ||||
|       }, | ||||
| @ -188,7 +183,7 @@ impl UserStatusCallback for UserStatusCallbackImpl { | ||||
| 
 | ||||
|     self | ||||
|       .database_manager | ||||
|       .initialize_with_new_user(user_profile.uid, authenticator.is_local()) | ||||
|       .initialize_with_new_user(user_profile.uid, auth_type.is_local()) | ||||
|       .await | ||||
|       .context("DatabaseManager error")?; | ||||
| 
 | ||||
| @ -212,7 +207,7 @@ impl UserStatusCallback for UserStatusCallbackImpl { | ||||
|     &self, | ||||
|     user_id: i64, | ||||
|     user_workspace: &UserWorkspace, | ||||
|     authenticator: &Authenticator, | ||||
|     authenticator: &AuthType, | ||||
|   ) -> FlowyResult<()> { | ||||
|     self | ||||
|       .folder_manager | ||||
|  | ||||
| @ -3,9 +3,8 @@ use client_api::entity::auth_dto::{UpdateUserParams, UserMetaData}; | ||||
| use client_api::entity::{AFRole, AFUserProfile, AFWorkspaceInvitationStatus, AFWorkspaceMember}; | ||||
| 
 | ||||
| use flowy_user_pub::entities::{ | ||||
|   Authenticator, Role, UpdateUserProfileParams, UserProfile, WorkspaceInvitationStatus, | ||||
|   WorkspaceMember, USER_METADATA_ICON_URL, USER_METADATA_OPEN_AI_KEY, | ||||
|   USER_METADATA_STABILITY_AI_KEY, | ||||
|   AuthType, Role, UpdateUserProfileParams, UserProfile, WorkspaceInvitationStatus, WorkspaceMember, | ||||
|   USER_METADATA_ICON_URL, USER_METADATA_OPEN_AI_KEY, USER_METADATA_STABILITY_AI_KEY, | ||||
| }; | ||||
| 
 | ||||
| use crate::af_cloud::impls::user::util::encryption_type_from_profile; | ||||
| @ -60,7 +59,7 @@ pub fn user_profile_from_af_profile( | ||||
|     icon_url: icon_url.unwrap_or_default(), | ||||
|     openai_key: openai_key.unwrap_or_default(), | ||||
|     stability_ai_key: stability_ai_key.unwrap_or_default(), | ||||
|     authenticator: Authenticator::AppFlowyCloud, | ||||
|     authenticator: AuthType::AppFlowyCloud, | ||||
|     encryption_type, | ||||
|     uid: profile.uid, | ||||
|     updated_at: profile.updated_at, | ||||
|  | ||||
| @ -20,7 +20,7 @@ use tokio_stream::wrappers::WatchStream; | ||||
| use uuid::Uuid; | ||||
| 
 | ||||
| use crate::entities::{ | ||||
|   AuthResponse, Authenticator, Role, UpdateUserProfileParams, UserCredentials, UserProfile, | ||||
|   AuthResponse, AuthType, Role, UpdateUserProfileParams, UserCredentials, UserProfile, | ||||
|   UserTokenState, UserWorkspace, WorkspaceInvitation, WorkspaceInvitationStatus, WorkspaceMember, | ||||
| }; | ||||
| 
 | ||||
| @ -84,13 +84,9 @@ pub trait UserCloudServiceProvider: Send + Sync { | ||||
|   /// * `enable_sync`: A boolean indicating whether synchronization should be enabled or disabled.
 | ||||
|   fn set_enable_sync(&self, uid: i64, enable_sync: bool); | ||||
| 
 | ||||
|   /// Sets the authenticator when user sign in or sign up.
 | ||||
|   ///
 | ||||
|   /// # Arguments
 | ||||
|   /// * `authenticator`: An `Authenticator` object.
 | ||||
|   fn set_user_authenticator(&self, authenticator: &Authenticator); | ||||
|   fn set_server_auth_type(&self, auth_type: &AuthType); | ||||
| 
 | ||||
|   fn get_user_authenticator(&self) -> Authenticator; | ||||
|   fn get_server_auth_type(&self) -> AuthType; | ||||
| 
 | ||||
|   /// Sets the network reachability
 | ||||
|   ///
 | ||||
|  | ||||
| @ -1,3 +1,4 @@ | ||||
| use std::fmt::{Display, Formatter}; | ||||
| use std::str::FromStr; | ||||
| 
 | ||||
| use chrono::{DateTime, Utc}; | ||||
| @ -32,7 +33,7 @@ pub struct SignInParams { | ||||
|   pub email: String, | ||||
|   pub password: String, | ||||
|   pub name: String, | ||||
|   pub auth_type: Authenticator, | ||||
|   pub auth_type: AuthType, | ||||
| } | ||||
| 
 | ||||
| #[derive(Serialize, Deserialize, Default, Debug)] | ||||
| @ -40,7 +41,7 @@ pub struct SignUpParams { | ||||
|   pub email: String, | ||||
|   pub name: String, | ||||
|   pub password: String, | ||||
|   pub auth_type: Authenticator, | ||||
|   pub auth_type: AuthType, | ||||
|   pub device_id: String, | ||||
| } | ||||
| 
 | ||||
| @ -103,7 +104,7 @@ impl UserAuthResponse for AuthResponse { | ||||
| 
 | ||||
| #[derive(Clone, Debug)] | ||||
| pub struct UserCredentials { | ||||
|   /// Currently, the token is only used when the [Authenticator] is AppFlowyCloud
 | ||||
|   /// Currently, the token is only used when the [AuthType] is AppFlowyCloud
 | ||||
|   pub token: Option<String>, | ||||
| 
 | ||||
|   /// The user id
 | ||||
| @ -180,7 +181,7 @@ pub struct UserProfile { | ||||
|   pub icon_url: String, | ||||
|   pub openai_key: String, | ||||
|   pub stability_ai_key: String, | ||||
|   pub authenticator: Authenticator, | ||||
|   pub authenticator: AuthType, | ||||
|   // If the encryption_sign is not empty, which means the user has enabled the encryption.
 | ||||
|   pub encryption_type: EncryptionType, | ||||
|   pub updated_at: i64, | ||||
| @ -226,11 +227,11 @@ impl FromStr for EncryptionType { | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| impl<T> From<(&T, &Authenticator)> for UserProfile | ||||
| impl<T> From<(&T, &AuthType)> for UserProfile | ||||
| where | ||||
|   T: UserAuthResponse, | ||||
| { | ||||
|   fn from(params: (&T, &Authenticator)) -> Self { | ||||
|   fn from(params: (&T, &AuthType)) -> Self { | ||||
|     let (value, auth_type) = params; | ||||
|     let (icon_url, openai_key, stability_ai_key) = { | ||||
|       value | ||||
| @ -258,7 +259,7 @@ where | ||||
|       token: value.user_token().unwrap_or_default(), | ||||
|       icon_url, | ||||
|       openai_key, | ||||
|       authenticator: auth_type.clone(), | ||||
|       authenticator: *auth_type, | ||||
|       encryption_type: value.encryption_type(), | ||||
|       stability_ai_key, | ||||
|       updated_at: value.updated_at(), | ||||
| @ -349,9 +350,9 @@ impl UpdateUserProfileParams { | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| #[derive(Debug, Clone, Hash, Serialize_repr, Deserialize_repr, Eq, PartialEq)] | ||||
| #[derive(Debug, Clone, Copy, Hash, Serialize_repr, Deserialize_repr, Eq, PartialEq)] | ||||
| #[repr(u8)] | ||||
| pub enum Authenticator { | ||||
| pub enum AuthType { | ||||
|   /// It's a local server, we do fake sign in default.
 | ||||
|   Local = 0, | ||||
|   /// Currently not supported. It will be supported in the future when the
 | ||||
| @ -359,28 +360,37 @@ pub enum Authenticator { | ||||
|   AppFlowyCloud = 1, | ||||
| } | ||||
| 
 | ||||
| impl Default for Authenticator { | ||||
| impl Display for AuthType { | ||||
|   fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { | ||||
|     match self { | ||||
|       AuthType::Local => write!(f, "Local"), | ||||
|       AuthType::AppFlowyCloud => write!(f, "AppFlowyCloud"), | ||||
|     } | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| impl Default for AuthType { | ||||
|   fn default() -> Self { | ||||
|     Self::Local | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| impl Authenticator { | ||||
| impl AuthType { | ||||
|   pub fn is_local(&self) -> bool { | ||||
|     matches!(self, Authenticator::Local) | ||||
|     matches!(self, AuthType::Local) | ||||
|   } | ||||
| 
 | ||||
|   pub fn is_appflowy_cloud(&self) -> bool { | ||||
|     matches!(self, Authenticator::AppFlowyCloud) | ||||
|     matches!(self, AuthType::AppFlowyCloud) | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| impl From<i32> for Authenticator { | ||||
| impl From<i32> for AuthType { | ||||
|   fn from(value: i32) -> Self { | ||||
|     match value { | ||||
|       0 => Authenticator::Local, | ||||
|       1 => Authenticator::AppFlowyCloud, | ||||
|       _ => Authenticator::Local, | ||||
|       0 => AuthType::Local, | ||||
|       1 => AuthType::AppFlowyCloud, | ||||
|       _ => AuthType::Local, | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -235,20 +235,20 @@ pub enum AuthenticatorPB { | ||||
|   AppFlowyCloud = 2, | ||||
| } | ||||
| 
 | ||||
| impl From<Authenticator> for AuthenticatorPB { | ||||
|   fn from(auth_type: Authenticator) -> Self { | ||||
| impl From<AuthType> for AuthenticatorPB { | ||||
|   fn from(auth_type: AuthType) -> Self { | ||||
|     match auth_type { | ||||
|       Authenticator::Local => AuthenticatorPB::Local, | ||||
|       Authenticator::AppFlowyCloud => AuthenticatorPB::AppFlowyCloud, | ||||
|       AuthType::Local => AuthenticatorPB::Local, | ||||
|       AuthType::AppFlowyCloud => AuthenticatorPB::AppFlowyCloud, | ||||
|     } | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| impl From<AuthenticatorPB> for Authenticator { | ||||
| impl From<AuthenticatorPB> for AuthType { | ||||
|   fn from(pb: AuthenticatorPB) -> Self { | ||||
|     match pb { | ||||
|       AuthenticatorPB::Local => Authenticator::Local, | ||||
|       AuthenticatorPB::AppFlowyCloud => Authenticator::AppFlowyCloud, | ||||
|       AuthenticatorPB::Local => AuthType::Local, | ||||
|       AuthenticatorPB::AppFlowyCloud => AuthType::AppFlowyCloud, | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -45,7 +45,7 @@ pub async fn sign_in_with_email_password_handler( | ||||
|   let manager = upgrade_manager(manager)?; | ||||
|   let params: SignInParams = data.into_inner().try_into()?; | ||||
| 
 | ||||
|   let old_authenticator = manager.cloud_services.get_user_authenticator(); | ||||
|   let old_authenticator = manager.cloud_services.get_server_auth_type(); | ||||
|   match manager | ||||
|     .sign_in_with_password(¶ms.email, ¶ms.password) | ||||
|     .await | ||||
| @ -54,7 +54,7 @@ pub async fn sign_in_with_email_password_handler( | ||||
|     Err(err) => { | ||||
|       manager | ||||
|         .cloud_services | ||||
|         .set_user_authenticator(&old_authenticator); | ||||
|         .set_server_auth_type(&old_authenticator); | ||||
|       return Err(err); | ||||
|     }, | ||||
|   } | ||||
| @ -76,15 +76,13 @@ pub async fn sign_up( | ||||
| ) -> DataResult<UserProfilePB, FlowyError> { | ||||
|   let manager = upgrade_manager(manager)?; | ||||
|   let params: SignUpParams = data.into_inner().try_into()?; | ||||
|   let authenticator = params.auth_type.clone(); | ||||
|   let auth_type = params.auth_type; | ||||
| 
 | ||||
|   let prev_authenticator = manager.cloud_services.get_user_authenticator(); | ||||
|   match manager.sign_up(authenticator, BoxAny::new(params)).await { | ||||
|   let prev_auth_type = manager.cloud_services.get_server_auth_type(); | ||||
|   match manager.sign_up(auth_type, BoxAny::new(params)).await { | ||||
|     Ok(profile) => data_result_ok(UserProfilePB::from(profile)), | ||||
|     Err(err) => { | ||||
|       manager | ||||
|         .cloud_services | ||||
|         .set_user_authenticator(&prev_authenticator); | ||||
|       manager.cloud_services.set_server_auth_type(&prev_auth_type); | ||||
|       Err(err) | ||||
|     }, | ||||
|   } | ||||
| @ -119,7 +117,7 @@ pub async fn get_user_profile_handler( | ||||
| 
 | ||||
|   // When the user is logged in with a local account, the email field is a placeholder and should
 | ||||
|   // not be exposed to the client. So we set the email field to an empty string.
 | ||||
|   if user_profile.authenticator == Authenticator::Local { | ||||
|   if user_profile.authenticator == AuthType::Local { | ||||
|     user_profile.email = "".to_string(); | ||||
|   } | ||||
| 
 | ||||
| @ -341,7 +339,7 @@ pub async fn oauth_sign_in_handler( | ||||
| ) -> DataResult<UserProfilePB, FlowyError> { | ||||
|   let manager = upgrade_manager(manager)?; | ||||
|   let params = data.into_inner(); | ||||
|   let authenticator: Authenticator = params.authenticator.into(); | ||||
|   let authenticator: AuthType = params.authenticator.into(); | ||||
|   let user_profile = manager | ||||
|     .sign_up(authenticator, BoxAny::new(params.map)) | ||||
|     .await?; | ||||
| @ -355,7 +353,7 @@ pub async fn gen_sign_in_url_handler( | ||||
| ) -> DataResult<SignInUrlPB, FlowyError> { | ||||
|   let manager = upgrade_manager(manager)?; | ||||
|   let params = data.into_inner(); | ||||
|   let authenticator: Authenticator = params.authenticator.into(); | ||||
|   let authenticator: AuthType = params.authenticator.into(); | ||||
|   let sign_in_url = manager | ||||
|     .generate_sign_in_url_with_email(&authenticator, ¶ms.email) | ||||
|     .await?; | ||||
|  | ||||
| @ -86,12 +86,12 @@ pub fn init(user_manager: Weak<UserManager>) -> AFPlugin { | ||||
| #[derive(Clone, Copy, PartialEq, Eq, Debug, Display, Hash, ProtoBuf_Enum, Flowy_Event)] | ||||
| #[event_err = "FlowyError"] | ||||
| pub enum UserEvent { | ||||
|   /// Only use when the [Authenticator] is Local or SelfHosted
 | ||||
|   /// Only use when the [AuthType] is Local or SelfHosted
 | ||||
|   /// Logging into an account using a register email and password
 | ||||
|   #[event(input = "SignInPayloadPB", output = "GotrueTokenResponsePB")] | ||||
|   SignInWithEmailPassword = 0, | ||||
| 
 | ||||
|   /// Only use when the [Authenticator] is Local or SelfHosted
 | ||||
|   /// Only use when the [AuthType] is Local or SelfHosted
 | ||||
|   /// Creating a new account
 | ||||
|   #[event(input = "SignUpPayloadPB", output = "UserProfilePB")] | ||||
|   SignUp = 1, | ||||
| @ -129,7 +129,7 @@ pub enum UserEvent { | ||||
|   OauthSignIn = 10, | ||||
| 
 | ||||
|   /// Get the OAuth callback url
 | ||||
|   /// Only use when the [Authenticator] is AFCloud
 | ||||
|   /// Only use when the [AuthType] is AFCloud
 | ||||
|   #[event(input = "SignInUrlPayloadPB", output = "SignInUrlPB")] | ||||
|   GenerateSignInURL = 11, | ||||
| 
 | ||||
| @ -165,7 +165,7 @@ pub enum UserEvent { | ||||
|   OpenAnonUser = 26, | ||||
| 
 | ||||
|   /// Push a realtime event to the user. Currently, the realtime event
 | ||||
|   /// is only used when the auth type is: [Authenticator::Supabase].
 | ||||
|   /// is only used when the auth type is: [AuthType::Supabase].
 | ||||
|   ///
 | ||||
|   #[event(input = "RealtimePayloadPB")] | ||||
|   PushRealtimeEvent = 27, | ||||
| @ -281,19 +281,19 @@ pub enum UserEvent { | ||||
| 
 | ||||
| #[async_trait] | ||||
| pub trait UserStatusCallback: Send + Sync + 'static { | ||||
|   /// When the [Authenticator] changed, this method will be called. Currently, the auth type
 | ||||
|   /// When the [AuthType] changed, this method will be called. Currently, the auth type
 | ||||
|   /// will be changed when the user sign in or sign up.
 | ||||
|   fn authenticator_did_changed(&self, _authenticator: Authenticator) {} | ||||
|   fn authenticator_did_changed(&self, _authenticator: AuthType) {} | ||||
|   /// This will be called after the application launches if the user is already signed in.
 | ||||
|   /// If the user is not signed in, this method will not be called
 | ||||
|   async fn did_init( | ||||
|     &self, | ||||
|     _user_id: i64, | ||||
|     _user_authenticator: &Authenticator, | ||||
|     _user_authenticator: &AuthType, | ||||
|     _cloud_config: &Option<UserCloudConfig>, | ||||
|     _user_workspace: &UserWorkspace, | ||||
|     _device_id: &str, | ||||
|     _authenticator: &Authenticator, | ||||
|     _authenticator: &AuthType, | ||||
|   ) -> FlowyResult<()> { | ||||
|     Ok(()) | ||||
|   } | ||||
| @ -303,7 +303,7 @@ pub trait UserStatusCallback: Send + Sync + 'static { | ||||
|     _user_id: i64, | ||||
|     _user_workspace: &UserWorkspace, | ||||
|     _device_id: &str, | ||||
|     _authenticator: &Authenticator, | ||||
|     _authenticator: &AuthType, | ||||
|   ) -> FlowyResult<()> { | ||||
|     Ok(()) | ||||
|   } | ||||
| @ -314,7 +314,7 @@ pub trait UserStatusCallback: Send + Sync + 'static { | ||||
|     _user_profile: &UserProfile, | ||||
|     _user_workspace: &UserWorkspace, | ||||
|     _device_id: &str, | ||||
|     _authenticator: &Authenticator, | ||||
|     _auth_type: &AuthType, | ||||
|   ) -> FlowyResult<()> { | ||||
|     Ok(()) | ||||
|   } | ||||
| @ -326,7 +326,7 @@ pub trait UserStatusCallback: Send + Sync + 'static { | ||||
|     &self, | ||||
|     _user_id: i64, | ||||
|     _user_workspace: &UserWorkspace, | ||||
|     _authenticator: &Authenticator, | ||||
|     _authenticator: &AuthType, | ||||
|   ) -> FlowyResult<()> { | ||||
|     Ok(()) | ||||
|   } | ||||
|  | ||||
| @ -7,7 +7,7 @@ use tracing::{instrument, trace}; | ||||
| 
 | ||||
| use collab_integrate::CollabKVDB; | ||||
| use flowy_error::FlowyResult; | ||||
| use flowy_user_pub::entities::Authenticator; | ||||
| use flowy_user_pub::entities::AuthType; | ||||
| 
 | ||||
| use crate::migrations::migration::UserDataMigration; | ||||
| use flowy_user_pub::session::Session; | ||||
| @ -39,7 +39,7 @@ impl UserDataMigration for CollabDocKeyWithWorkspaceIdMigration { | ||||
|     &self, | ||||
|     session: &Session, | ||||
|     collab_db: &Arc<CollabKVDB>, | ||||
|     _authenticator: &Authenticator, | ||||
|     _authenticator: &AuthType, | ||||
|   ) -> FlowyResult<()> { | ||||
|     trace!( | ||||
|       "migrate key with workspace id:{}", | ||||
|  | ||||
| @ -11,7 +11,7 @@ use tracing::{event, instrument}; | ||||
| 
 | ||||
| use collab_integrate::{CollabKVAction, CollabKVDB, PersistenceError}; | ||||
| use flowy_error::{FlowyError, FlowyResult}; | ||||
| use flowy_user_pub::entities::Authenticator; | ||||
| use flowy_user_pub::entities::AuthType; | ||||
| 
 | ||||
| use crate::migrations::migration::UserDataMigration; | ||||
| use crate::migrations::util::load_collab; | ||||
| @ -41,12 +41,12 @@ impl UserDataMigration for HistoricalEmptyDocumentMigration { | ||||
|     &self, | ||||
|     session: &Session, | ||||
|     collab_db: &Arc<CollabKVDB>, | ||||
|     authenticator: &Authenticator, | ||||
|     authenticator: &AuthType, | ||||
|   ) -> FlowyResult<()> { | ||||
|     // - The `empty document` struct has already undergone refactoring prior to the launch of the AppFlowy cloud version.
 | ||||
|     // - Consequently, if a user is utilizing the AppFlowy cloud version, there is no need to perform any migration for the `empty document` struct.
 | ||||
|     // - This migration step is only necessary for users who are transitioning from a local version of AppFlowy to the cloud version.
 | ||||
|     if !matches!(authenticator, Authenticator::Local) { | ||||
|     if !matches!(authenticator, AuthType::Local) { | ||||
|       return Ok(()); | ||||
|     } | ||||
|     collab_db.with_write_txn(|write_txn| { | ||||
|  | ||||
| @ -7,7 +7,7 @@ use flowy_error::FlowyResult; | ||||
| use flowy_sqlite::kv::KVStorePreferences; | ||||
| use flowy_sqlite::schema::user_data_migration_records; | ||||
| use flowy_sqlite::ConnectionPool; | ||||
| use flowy_user_pub::entities::Authenticator; | ||||
| use flowy_user_pub::entities::AuthType; | ||||
| use flowy_user_pub::session::Session; | ||||
| use semver::Version; | ||||
| use tracing::info; | ||||
| @ -54,7 +54,7 @@ impl UserLocalDataMigration { | ||||
|   pub fn run( | ||||
|     self, | ||||
|     migrations: Vec<Box<dyn UserDataMigration>>, | ||||
|     authenticator: &Authenticator, | ||||
|     authenticator: &AuthType, | ||||
|     app_version: &Version, | ||||
|   ) -> FlowyResult<Vec<String>> { | ||||
|     let mut applied_migrations = vec![]; | ||||
| @ -98,7 +98,7 @@ pub trait UserDataMigration { | ||||
|     &self, | ||||
|     user: &Session, | ||||
|     collab_db: &Arc<CollabKVDB>, | ||||
|     authenticator: &Authenticator, | ||||
|     authenticator: &AuthType, | ||||
|   ) -> FlowyResult<()>; | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -7,7 +7,7 @@ use tracing::instrument; | ||||
| 
 | ||||
| use collab_integrate::{CollabKVAction, CollabKVDB}; | ||||
| use flowy_error::FlowyResult; | ||||
| use flowy_user_pub::entities::Authenticator; | ||||
| use flowy_user_pub::entities::AuthType; | ||||
| 
 | ||||
| use crate::migrations::migration::UserDataMigration; | ||||
| use crate::migrations::util::load_collab; | ||||
| @ -39,7 +39,7 @@ impl UserDataMigration for FavoriteV1AndWorkspaceArrayMigration { | ||||
|     &self, | ||||
|     session: &Session, | ||||
|     collab_db: &Arc<CollabKVDB>, | ||||
|     _authenticator: &Authenticator, | ||||
|     _authenticator: &AuthType, | ||||
|   ) -> FlowyResult<()> { | ||||
|     collab_db.with_write_txn(|write_txn| { | ||||
|       if let Ok(collab) = load_collab( | ||||
|  | ||||
| @ -7,7 +7,7 @@ use tracing::instrument; | ||||
| 
 | ||||
| use collab_integrate::{CollabKVAction, CollabKVDB}; | ||||
| use flowy_error::FlowyResult; | ||||
| use flowy_user_pub::entities::Authenticator; | ||||
| use flowy_user_pub::entities::AuthType; | ||||
| 
 | ||||
| use crate::migrations::migration::UserDataMigration; | ||||
| use crate::migrations::util::load_collab; | ||||
| @ -37,7 +37,7 @@ impl UserDataMigration for WorkspaceTrashMapToSectionMigration { | ||||
|     &self, | ||||
|     session: &Session, | ||||
|     collab_db: &Arc<CollabKVDB>, | ||||
|     _authenticator: &Authenticator, | ||||
|     _authenticator: &AuthType, | ||||
|   ) -> FlowyResult<()> { | ||||
|     collab_db.with_write_txn(|write_txn| { | ||||
|       if let Ok(collab) = load_collab( | ||||
|  | ||||
| @ -30,7 +30,7 @@ use flowy_folder_pub::entities::{ | ||||
| }; | ||||
| use flowy_sqlite::kv::KVStorePreferences; | ||||
| use flowy_user_pub::cloud::{UserCloudService, UserCollabParams}; | ||||
| use flowy_user_pub::entities::{user_awareness_object_id, Authenticator}; | ||||
| use flowy_user_pub::entities::{user_awareness_object_id, AuthType}; | ||||
| use flowy_user_pub::session::Session; | ||||
| use rayon::prelude::*; | ||||
| use std::collections::{HashMap, HashSet}; | ||||
| @ -1175,7 +1175,7 @@ pub async fn upload_collab_objects_data( | ||||
|   uid: i64, | ||||
|   user_collab_db: Weak<CollabKVDB>, | ||||
|   workspace_id: &Uuid, | ||||
|   user_authenticator: &Authenticator, | ||||
|   user_authenticator: &AuthType, | ||||
|   collab_data: ImportedCollabData, | ||||
|   user_cloud_service: Arc<dyn UserCloudService>, | ||||
| ) -> Result<(), FlowyError> { | ||||
|  | ||||
| @ -31,8 +31,8 @@ pub struct UserTable { | ||||
| } | ||||
| 
 | ||||
| #[allow(deprecated)] | ||||
| impl From<(UserProfile, Authenticator)> for UserTable { | ||||
|   fn from(value: (UserProfile, Authenticator)) -> Self { | ||||
| impl From<(UserProfile, AuthType)> for UserTable { | ||||
|   fn from(value: (UserProfile, AuthType)) -> Self { | ||||
|     let (user_profile, auth_type) = value; | ||||
|     let encryption_type = serde_json::to_string(&user_profile.encryption_type).unwrap_or_default(); | ||||
|     UserTable { | ||||
| @ -62,7 +62,7 @@ impl From<UserTable> for UserProfile { | ||||
|       token: table.token, | ||||
|       icon_url: table.icon_url, | ||||
|       openai_key: table.openai_key, | ||||
|       authenticator: Authenticator::from(table.auth_type), | ||||
|       authenticator: AuthType::from(table.auth_type), | ||||
|       encryption_type: EncryptionType::from_str(&table.encryption_type).unwrap_or_default(), | ||||
|       stability_ai_key: table.stability_ai_key, | ||||
|       updated_at: table.updated_at, | ||||
|  | ||||
| @ -141,7 +141,7 @@ impl UserManager { | ||||
| 
 | ||||
|       // If the current authenticator is different from the authenticator in the session and it's
 | ||||
|       // not a local authenticator, we need to sign out the user.
 | ||||
|       if user.authenticator != Authenticator::Local && user.authenticator != current_authenticator { | ||||
|       if user.authenticator != AuthType::Local && user.authenticator != current_authenticator { | ||||
|         event!( | ||||
|           tracing::Level::INFO, | ||||
|           "Authenticator changed from {:?} to {:?}", | ||||
| @ -349,9 +349,9 @@ impl UserManager { | ||||
|   pub async fn sign_in( | ||||
|     &self, | ||||
|     params: SignInParams, | ||||
|     authenticator: Authenticator, | ||||
|     authenticator: AuthType, | ||||
|   ) -> Result<UserProfile, FlowyError> { | ||||
|     self.cloud_services.set_user_authenticator(&authenticator); | ||||
|     self.cloud_services.set_server_auth_type(&authenticator); | ||||
| 
 | ||||
|     let response: AuthResponse = self | ||||
|       .cloud_services | ||||
| @ -398,25 +398,25 @@ impl UserManager { | ||||
|   #[tracing::instrument(level = "info", skip(self, params))] | ||||
|   pub async fn sign_up( | ||||
|     &self, | ||||
|     authenticator: Authenticator, | ||||
|     auth_type: AuthType, | ||||
|     params: BoxAny, | ||||
|   ) -> Result<UserProfile, FlowyError> { | ||||
|     // sign out the current user if there is one
 | ||||
|     let migration_user = self.get_migration_user(&authenticator).await; | ||||
|     self.cloud_services.set_user_authenticator(&authenticator); | ||||
|     let migration_user = self.get_migration_user(&auth_type).await; | ||||
|     self.cloud_services.set_server_auth_type(&auth_type); | ||||
|     let auth_service = self.cloud_services.get_user_service()?; | ||||
|     let response: AuthResponse = auth_service.sign_up(params).await?; | ||||
|     let new_user_profile = UserProfile::from((&response, &authenticator)); | ||||
|     let new_user_profile = UserProfile::from((&response, &auth_type)); | ||||
|     if new_user_profile.encryption_type.require_encrypt_secret() { | ||||
|       self.auth_process.lock().await.replace(UserAuthProcess { | ||||
|         user_profile: new_user_profile.clone(), | ||||
|         migration_user, | ||||
|         response, | ||||
|         authenticator, | ||||
|         authenticator: auth_type, | ||||
|       }); | ||||
|     } else { | ||||
|       self | ||||
|         .continue_sign_up(&new_user_profile, migration_user, response, &authenticator) | ||||
|         .continue_sign_up(&new_user_profile, migration_user, response, &auth_type) | ||||
|         .await?; | ||||
|     } | ||||
|     Ok(new_user_profile) | ||||
| @ -450,12 +450,12 @@ impl UserManager { | ||||
|     new_user_profile: &UserProfile, | ||||
|     migration_user: Option<AnonUser>, | ||||
|     response: AuthResponse, | ||||
|     authenticator: &Authenticator, | ||||
|     auth_type: &AuthType, | ||||
|   ) -> FlowyResult<()> { | ||||
|     let new_session = Session::from(&response); | ||||
|     self.prepare_user(&new_session).await; | ||||
|     self | ||||
|       .save_auth_data(&response, authenticator, &new_session) | ||||
|       .save_auth_data(&response, auth_type, &new_session) | ||||
|       .await?; | ||||
|     let _ = self | ||||
|       .initial_user_awareness(&new_session, &new_user_profile.authenticator) | ||||
| @ -469,7 +469,7 @@ impl UserManager { | ||||
|         new_user_profile, | ||||
|         &new_session.user_workspace, | ||||
|         &self.authenticate_user.user_config.device_id, | ||||
|         authenticator, | ||||
|         auth_type, | ||||
|       ) | ||||
|       .await?; | ||||
| 
 | ||||
| @ -493,7 +493,7 @@ impl UserManager { | ||||
|           new_user_profile.uid | ||||
|         ); | ||||
|         self | ||||
|           .migrate_anon_user_data_to_cloud(&old_user, &new_session, authenticator) | ||||
|           .migrate_anon_user_data_to_cloud(&old_user, &new_session, auth_type) | ||||
|           .await?; | ||||
|         self.remove_anon_user(); | ||||
|         let _ = self | ||||
| @ -709,10 +709,10 @@ impl UserManager { | ||||
| 
 | ||||
|   pub(crate) async fn generate_sign_in_url_with_email( | ||||
|     &self, | ||||
|     authenticator: &Authenticator, | ||||
|     authenticator: &AuthType, | ||||
|     email: &str, | ||||
|   ) -> Result<String, FlowyError> { | ||||
|     self.cloud_services.set_user_authenticator(authenticator); | ||||
|     self.cloud_services.set_server_auth_type(authenticator); | ||||
| 
 | ||||
|     let auth_service = self.cloud_services.get_user_service()?; | ||||
|     let url = auth_service.generate_sign_in_url_with_email(email).await?; | ||||
| @ -726,7 +726,7 @@ impl UserManager { | ||||
|   ) -> Result<GotrueTokenResponse, FlowyError> { | ||||
|     self | ||||
|       .cloud_services | ||||
|       .set_user_authenticator(&Authenticator::AppFlowyCloud); | ||||
|       .set_server_auth_type(&AuthType::AppFlowyCloud); | ||||
|     let auth_service = self.cloud_services.get_user_service()?; | ||||
|     let response = auth_service.sign_in_with_password(email, password).await?; | ||||
|     Ok(response) | ||||
| @ -739,7 +739,7 @@ impl UserManager { | ||||
|   ) -> Result<(), FlowyError> { | ||||
|     self | ||||
|       .cloud_services | ||||
|       .set_user_authenticator(&Authenticator::AppFlowyCloud); | ||||
|       .set_server_auth_type(&AuthType::AppFlowyCloud); | ||||
|     let auth_service = self.cloud_services.get_user_service()?; | ||||
|     auth_service | ||||
|       .sign_in_with_magic_link(email, redirect_to) | ||||
| @ -754,7 +754,7 @@ impl UserManager { | ||||
|   ) -> Result<GotrueTokenResponse, FlowyError> { | ||||
|     self | ||||
|       .cloud_services | ||||
|       .set_user_authenticator(&Authenticator::AppFlowyCloud); | ||||
|       .set_server_auth_type(&AuthType::AppFlowyCloud); | ||||
|     let auth_service = self.cloud_services.get_user_service()?; | ||||
|     let response = auth_service.sign_in_with_passcode(email, passcode).await?; | ||||
|     Ok(response) | ||||
| @ -766,7 +766,7 @@ impl UserManager { | ||||
|   ) -> Result<String, FlowyError> { | ||||
|     self | ||||
|       .cloud_services | ||||
|       .set_user_authenticator(&Authenticator::AppFlowyCloud); | ||||
|       .set_server_auth_type(&AuthType::AppFlowyCloud); | ||||
|     let auth_service = self.cloud_services.get_user_service()?; | ||||
|     let url = auth_service | ||||
|       .generate_oauth_url_with_provider(oauth_provider) | ||||
| @ -778,7 +778,7 @@ impl UserManager { | ||||
|   async fn save_auth_data( | ||||
|     &self, | ||||
|     response: &impl UserAuthResponse, | ||||
|     authenticator: &Authenticator, | ||||
|     authenticator: &AuthType, | ||||
|     session: &Session, | ||||
|   ) -> Result<(), FlowyError> { | ||||
|     let user_profile = UserProfile::from((response, authenticator)); | ||||
| @ -798,7 +798,7 @@ impl UserManager { | ||||
|       .authenticate_user | ||||
|       .set_session(Some(session.clone().into()))?; | ||||
|     self | ||||
|       .save_user(uid, (user_profile, authenticator.clone()).into()) | ||||
|       .save_user(uid, (user_profile, *authenticator).into()) | ||||
|       .await?; | ||||
|     Ok(()) | ||||
|   } | ||||
| @ -827,14 +827,14 @@ impl UserManager { | ||||
|     &self, | ||||
|     old_user: &AnonUser, | ||||
|     _new_user_session: &Session, | ||||
|     authenticator: &Authenticator, | ||||
|     authenticator: &AuthType, | ||||
|   ) -> Result<(), FlowyError> { | ||||
|     let old_collab_db = self | ||||
|       .authenticate_user | ||||
|       .database | ||||
|       .get_collab_db(old_user.session.user_id)?; | ||||
| 
 | ||||
|     if authenticator == &Authenticator::AppFlowyCloud { | ||||
|     if authenticator == &AuthType::AppFlowyCloud { | ||||
|       self | ||||
|         .migration_anon_user_on_appflowy_cloud_sign_up(old_user, &old_collab_db) | ||||
|         .await?; | ||||
| @ -853,10 +853,10 @@ impl UserManager { | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| fn current_authenticator() -> Authenticator { | ||||
| fn current_authenticator() -> AuthType { | ||||
|   match AuthenticatorType::from_env() { | ||||
|     AuthenticatorType::Local => Authenticator::Local, | ||||
|     AuthenticatorType::AppFlowyCloud => Authenticator::AppFlowyCloud, | ||||
|     AuthenticatorType::Local => AuthType::Local, | ||||
|     AuthenticatorType::AppFlowyCloud => AuthType::AppFlowyCloud, | ||||
|   } | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -4,7 +4,7 @@ use tracing::instrument; | ||||
| use crate::entities::UserProfilePB; | ||||
| use crate::user_manager::UserManager; | ||||
| use flowy_error::{ErrorCode, FlowyError, FlowyResult}; | ||||
| use flowy_user_pub::entities::Authenticator; | ||||
| use flowy_user_pub::entities::AuthType; | ||||
| 
 | ||||
| use crate::migrations::AnonUser; | ||||
| use flowy_user_pub::session::Session; | ||||
| @ -12,10 +12,7 @@ use flowy_user_pub::session::Session; | ||||
| pub const ANON_USER: &str = "anon_user"; | ||||
| impl UserManager { | ||||
|   #[instrument(skip_all)] | ||||
|   pub async fn get_migration_user( | ||||
|     &self, | ||||
|     current_authenticator: &Authenticator, | ||||
|   ) -> Option<AnonUser> { | ||||
|   pub async fn get_migration_user(&self, current_authenticator: &AuthType) -> Option<AnonUser> { | ||||
|     // No need to migrate if the user is already local
 | ||||
|     if current_authenticator.is_local() { | ||||
|       return None; | ||||
|  | ||||
| @ -12,7 +12,7 @@ use collab_integrate::CollabKVDB; | ||||
| use collab_user::core::{UserAwareness, UserAwarenessNotifier}; | ||||
| use dashmap::try_result::TryResult; | ||||
| use flowy_error::{ErrorCode, FlowyError, FlowyResult}; | ||||
| use flowy_user_pub::entities::{user_awareness_object_id, Authenticator}; | ||||
| use flowy_user_pub::entities::{user_awareness_object_id, AuthType}; | ||||
| use tracing::{error, info, instrument, trace}; | ||||
| use uuid::Uuid; | ||||
| 
 | ||||
| @ -119,9 +119,8 @@ impl UserManager { | ||||
|   pub(crate) async fn initial_user_awareness( | ||||
|     &self, | ||||
|     session: &Session, | ||||
|     authenticator: &Authenticator, | ||||
|     auth_type: &AuthType, | ||||
|   ) -> FlowyResult<()> { | ||||
|     let authenticator = authenticator.clone(); | ||||
|     let object_id = user_awareness_object_id(&session.user_uuid, &session.user_workspace.id); | ||||
| 
 | ||||
|     // Try to acquire mutable access to `is_loading_awareness`.
 | ||||
| @ -156,11 +155,11 @@ impl UserManager { | ||||
|       let is_exist_on_disk = self | ||||
|         .authenticate_user | ||||
|         .is_collab_on_disk(session.user_id, &object_id.to_string())?; | ||||
|       if authenticator.is_local() || is_exist_on_disk { | ||||
|       if auth_type.is_local() || is_exist_on_disk { | ||||
|         trace!( | ||||
|           "Initializing new user awareness from disk:{}, {:?}", | ||||
|           object_id, | ||||
|           authenticator | ||||
|           auth_type | ||||
|         ); | ||||
|         let collab_db = self.get_collab_db(session.user_id)?; | ||||
|         let workspace_id = session.user_workspace.workspace_id()?; | ||||
| @ -185,9 +184,9 @@ impl UserManager { | ||||
|       } else { | ||||
|         info!( | ||||
|           "Initializing new user awareness from server:{}, {:?}", | ||||
|           object_id, authenticator | ||||
|           object_id, auth_type | ||||
|         ); | ||||
|         self.load_awareness_from_server(session, object_id, authenticator.clone())?; | ||||
|         self.load_awareness_from_server(session, object_id, *auth_type)?; | ||||
|       } | ||||
|     } else { | ||||
|       return Err(FlowyError::new( | ||||
| @ -209,7 +208,7 @@ impl UserManager { | ||||
|     &self, | ||||
|     session: &Session, | ||||
|     object_id: Uuid, | ||||
|     authenticator: Authenticator, | ||||
|     authenticator: AuthType, | ||||
|   ) -> FlowyResult<()> { | ||||
|     // Clone necessary data
 | ||||
|     let session = session.clone(); | ||||
|  | ||||
| @ -1,11 +1,11 @@ | ||||
| use crate::migrations::AnonUser; | ||||
| use flowy_user_pub::entities::{AuthResponse, Authenticator, UserProfile}; | ||||
| use flowy_user_pub::entities::{AuthResponse, AuthType, UserProfile}; | ||||
| 
 | ||||
| /// recording the intermediate state of the sign-in/sign-up process
 | ||||
| #[derive(Clone)] | ||||
| pub struct UserAuthProcess { | ||||
|   pub user_profile: UserProfile, | ||||
|   pub response: AuthResponse, | ||||
|   pub authenticator: Authenticator, | ||||
|   pub authenticator: AuthType, | ||||
|   pub migration_user: Option<AnonUser>, | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Nathan.fooo
						Nathan.fooo