user.rs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. use std::sync::Arc;
  2. use anyhow::Context;
  3. use collab_integrate::collab_builder::AppFlowyCollabBuilder;
  4. use flowy_database2::DatabaseManager;
  5. use flowy_document2::manager::DocumentManager;
  6. use flowy_error::FlowyResult;
  7. use flowy_folder2::manager::{FolderInitializeDataSource, FolderManager};
  8. use flowy_user::event_map::{UserCloudServiceProvider, UserStatusCallback};
  9. use flowy_user_deps::cloud::UserCloudConfig;
  10. use flowy_user_deps::entities::{AuthType, UserProfile, UserWorkspace};
  11. use lib_infra::future::{to_fut, Fut};
  12. use crate::integrate::server::ServerProvider;
  13. use crate::AppFlowyCoreConfig;
  14. pub(crate) struct UserStatusCallbackImpl {
  15. pub(crate) collab_builder: Arc<AppFlowyCollabBuilder>,
  16. pub(crate) folder_manager: Arc<FolderManager>,
  17. pub(crate) database_manager: Arc<DatabaseManager>,
  18. pub(crate) document_manager: Arc<DocumentManager>,
  19. pub(crate) server_provider: Arc<ServerProvider>,
  20. #[allow(dead_code)]
  21. pub(crate) config: AppFlowyCoreConfig,
  22. }
  23. impl UserStatusCallback for UserStatusCallbackImpl {
  24. fn auth_type_did_changed(&self, _auth_type: AuthType) {}
  25. fn did_init(
  26. &self,
  27. user_id: i64,
  28. cloud_config: &Option<UserCloudConfig>,
  29. user_workspace: &UserWorkspace,
  30. _device_id: &str,
  31. ) -> Fut<FlowyResult<()>> {
  32. let user_id = user_id.to_owned();
  33. let user_workspace = user_workspace.clone();
  34. let collab_builder = self.collab_builder.clone();
  35. let folder_manager = self.folder_manager.clone();
  36. let database_manager = self.database_manager.clone();
  37. let document_manager = self.document_manager.clone();
  38. if let Some(cloud_config) = cloud_config {
  39. self
  40. .server_provider
  41. .set_enable_sync(user_id, cloud_config.enable_sync);
  42. if cloud_config.enable_encrypt() {
  43. self
  44. .server_provider
  45. .set_encrypt_secret(cloud_config.encrypt_secret.clone());
  46. }
  47. }
  48. to_fut(async move {
  49. collab_builder.initialize(user_workspace.id.clone());
  50. folder_manager
  51. .initialize(
  52. user_id,
  53. &user_workspace.id,
  54. FolderInitializeDataSource::LocalDisk {
  55. create_if_not_exist: false,
  56. },
  57. )
  58. .await?;
  59. database_manager
  60. .initialize(
  61. user_id,
  62. user_workspace.id.clone(),
  63. user_workspace.database_views_aggregate_id,
  64. )
  65. .await?;
  66. document_manager
  67. .initialize(user_id, user_workspace.id)
  68. .await?;
  69. Ok(())
  70. })
  71. }
  72. fn did_sign_in(
  73. &self,
  74. user_id: i64,
  75. user_workspace: &UserWorkspace,
  76. _device_id: &str,
  77. ) -> Fut<FlowyResult<()>> {
  78. let user_id = user_id.to_owned();
  79. let user_workspace = user_workspace.clone();
  80. let folder_manager = self.folder_manager.clone();
  81. let database_manager = self.database_manager.clone();
  82. let document_manager = self.document_manager.clone();
  83. to_fut(async move {
  84. folder_manager
  85. .initialize_with_workspace_id(user_id, &user_workspace.id)
  86. .await?;
  87. database_manager
  88. .initialize(
  89. user_id,
  90. user_workspace.id.clone(),
  91. user_workspace.database_views_aggregate_id,
  92. )
  93. .await?;
  94. document_manager
  95. .initialize(user_id, user_workspace.id)
  96. .await?;
  97. Ok(())
  98. })
  99. }
  100. fn did_sign_up(
  101. &self,
  102. is_new_user: bool,
  103. user_profile: &UserProfile,
  104. user_workspace: &UserWorkspace,
  105. _device_id: &str,
  106. ) -> Fut<FlowyResult<()>> {
  107. let user_profile = user_profile.clone();
  108. let folder_manager = self.folder_manager.clone();
  109. let database_manager = self.database_manager.clone();
  110. let user_workspace = user_workspace.clone();
  111. let document_manager = self.document_manager.clone();
  112. to_fut(async move {
  113. folder_manager
  114. .initialize_with_new_user(
  115. user_profile.uid,
  116. &user_profile.token,
  117. is_new_user,
  118. FolderInitializeDataSource::LocalDisk {
  119. create_if_not_exist: true,
  120. },
  121. &user_workspace.id,
  122. )
  123. .await
  124. .context("FolderManager error")?;
  125. database_manager
  126. .initialize_with_new_user(
  127. user_profile.uid,
  128. user_workspace.id.clone(),
  129. user_workspace.database_views_aggregate_id,
  130. )
  131. .await
  132. .context("DatabaseManager error")?;
  133. document_manager
  134. .initialize_with_new_user(user_profile.uid, user_workspace.id)
  135. .await
  136. .context("DocumentManager error")?;
  137. Ok(())
  138. })
  139. }
  140. fn did_expired(&self, _token: &str, user_id: i64) -> Fut<FlowyResult<()>> {
  141. let folder_manager = self.folder_manager.clone();
  142. to_fut(async move {
  143. folder_manager.clear(user_id).await;
  144. Ok(())
  145. })
  146. }
  147. fn open_workspace(&self, user_id: i64, user_workspace: &UserWorkspace) -> Fut<FlowyResult<()>> {
  148. let user_workspace = user_workspace.clone();
  149. let collab_builder = self.collab_builder.clone();
  150. let folder_manager = self.folder_manager.clone();
  151. let database_manager = self.database_manager.clone();
  152. let document_manager = self.document_manager.clone();
  153. to_fut(async move {
  154. collab_builder.initialize(user_workspace.id.clone());
  155. folder_manager
  156. .initialize_with_workspace_id(user_id, &user_workspace.id)
  157. .await?;
  158. database_manager
  159. .initialize(
  160. user_id,
  161. user_workspace.id.clone(),
  162. user_workspace.database_views_aggregate_id,
  163. )
  164. .await?;
  165. document_manager
  166. .initialize(user_id, user_workspace.id)
  167. .await?;
  168. Ok(())
  169. })
  170. }
  171. fn did_update_network(&self, reachable: bool) {
  172. self.collab_builder.update_network(reachable);
  173. }
  174. }