context.rs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. use std::{collections::HashMap, sync::Arc};
  2. use chrono::Utc;
  3. use lazy_static::lazy_static;
  4. use parking_lot::RwLock;
  5. use flowy_collaboration::document::default::{initial_delta, initial_read_me};
  6. use flowy_core_data_model::{entities::view::CreateViewParams, user_default};
  7. use flowy_net::entities::NetworkType;
  8. use crate::{
  9. entities::workspace::RepeatedWorkspace,
  10. errors::{FlowyError, FlowyResult},
  11. module::{WorkspaceDatabase, WorkspaceUser},
  12. notify::{send_dart_notification, WorkspaceNotification},
  13. services::{server::Server, AppController, TrashController, ViewController, WorkspaceController},
  14. };
  15. lazy_static! {
  16. static ref INIT_WORKSPACE: RwLock<HashMap<String, bool>> = RwLock::new(HashMap::new());
  17. }
  18. pub struct CoreContext {
  19. pub user: Arc<dyn WorkspaceUser>,
  20. pub(crate) server: Server,
  21. pub(crate) database: Arc<dyn WorkspaceDatabase>,
  22. pub workspace_controller: Arc<WorkspaceController>,
  23. pub(crate) app_controller: Arc<AppController>,
  24. pub(crate) view_controller: Arc<ViewController>,
  25. pub(crate) trash_controller: Arc<TrashController>,
  26. }
  27. impl CoreContext {
  28. pub(crate) fn new(
  29. user: Arc<dyn WorkspaceUser>,
  30. server: Server,
  31. database: Arc<dyn WorkspaceDatabase>,
  32. workspace_controller: Arc<WorkspaceController>,
  33. app_controller: Arc<AppController>,
  34. view_controller: Arc<ViewController>,
  35. trash_controller: Arc<TrashController>,
  36. ) -> Self {
  37. if let Ok(token) = user.token() {
  38. INIT_WORKSPACE.write().insert(token, false);
  39. }
  40. Self {
  41. user,
  42. server,
  43. database,
  44. workspace_controller,
  45. app_controller,
  46. view_controller,
  47. trash_controller,
  48. }
  49. }
  50. pub fn network_state_changed(&self, new_type: NetworkType) {
  51. match new_type {
  52. NetworkType::UnknownNetworkType => {}
  53. NetworkType::Wifi => {}
  54. NetworkType::Cell => {}
  55. NetworkType::Ethernet => {}
  56. }
  57. }
  58. pub async fn user_did_sign_in(&self, token: &str) -> FlowyResult<()> {
  59. log::debug!("workspace initialize after sign in");
  60. let _ = self.init(token).await?;
  61. Ok(())
  62. }
  63. pub async fn user_did_logout(&self) {
  64. // TODO: (nathan) do something here
  65. }
  66. pub async fn user_session_expired(&self) {
  67. // TODO: (nathan) do something here
  68. }
  69. pub async fn user_did_sign_up(&self, _token: &str) -> FlowyResult<()> {
  70. log::debug!("Create user default workspace");
  71. let time = Utc::now();
  72. let mut workspace = user_default::create_default_workspace(time);
  73. let apps = workspace.take_apps().into_inner();
  74. let cloned_workspace = workspace.clone();
  75. let _ = self.workspace_controller.create_workspace_on_local(workspace).await?;
  76. for mut app in apps {
  77. let app_id = app.id.clone();
  78. let views = app.take_belongings().into_inner();
  79. let _ = self.app_controller.create_app_on_local(app).await?;
  80. for (index, view) in views.into_iter().enumerate() {
  81. let view_data = if index == 0 {
  82. initial_read_me().to_json()
  83. } else {
  84. initial_delta().to_json()
  85. };
  86. self.view_controller.set_latest_view(&view);
  87. let params = CreateViewParams {
  88. belong_to_id: app_id.clone(),
  89. name: view.name,
  90. desc: view.desc,
  91. thumbnail: "".to_string(),
  92. view_type: view.view_type,
  93. view_data,
  94. view_id: view.id.clone(),
  95. };
  96. let _ = self.view_controller.create_view_from_params(params).await?;
  97. }
  98. }
  99. let token = self.user.token()?;
  100. let repeated_workspace = RepeatedWorkspace {
  101. items: vec![cloned_workspace],
  102. };
  103. send_dart_notification(&token, WorkspaceNotification::UserCreateWorkspace)
  104. .payload(repeated_workspace)
  105. .send();
  106. tracing::debug!("Create default workspace after sign up");
  107. let _ = self.init(&token).await?;
  108. Ok(())
  109. }
  110. async fn init(&self, token: &str) -> Result<(), FlowyError> {
  111. if let Some(is_init) = INIT_WORKSPACE.read().get(token) {
  112. if *is_init {
  113. return Ok(());
  114. }
  115. }
  116. INIT_WORKSPACE.write().insert(token.to_owned(), true);
  117. let _ = self.workspace_controller.init()?;
  118. let _ = self.app_controller.init()?;
  119. let _ = self.view_controller.init()?;
  120. let _ = self.trash_controller.init()?;
  121. Ok(())
  122. }
  123. }