event_handler.rs 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. use crate::entities::{
  2. app::RepeatedAppPB,
  3. view::ViewPB,
  4. workspace::{CurrentWorkspaceSettingPB, RepeatedWorkspacePB, WorkspaceIdPB, *},
  5. };
  6. use crate::{
  7. dart_notification::{send_dart_notification, FolderNotification},
  8. errors::FlowyError,
  9. manager::FolderManager,
  10. services::{get_current_workspace, read_local_workspace_apps, WorkspaceController},
  11. };
  12. use lib_dispatch::prelude::{data_result, AppData, Data, DataResult};
  13. use std::{convert::TryInto, sync::Arc};
  14. #[tracing::instrument(level = "debug", skip(data, controller), err)]
  15. pub(crate) async fn create_workspace_handler(
  16. data: Data<CreateWorkspacePayloadPB>,
  17. controller: AppData<Arc<WorkspaceController>>,
  18. ) -> DataResult<WorkspacePB, FlowyError> {
  19. let controller = controller.get_ref().clone();
  20. let params: CreateWorkspaceParams = data.into_inner().try_into()?;
  21. let workspace_rev = controller.create_workspace_from_params(params).await?;
  22. data_result(workspace_rev.into())
  23. }
  24. #[tracing::instrument(level = "debug", skip(controller), err)]
  25. pub(crate) async fn read_workspace_apps_handler(
  26. controller: AppData<Arc<WorkspaceController>>,
  27. ) -> DataResult<RepeatedAppPB, FlowyError> {
  28. let items = controller
  29. .read_current_workspace_apps()
  30. .await?
  31. .into_iter()
  32. .map(|app_rev| app_rev.into())
  33. .collect();
  34. let repeated_app = RepeatedAppPB { items };
  35. data_result(repeated_app)
  36. }
  37. #[tracing::instrument(level = "debug", skip(data, controller), err)]
  38. pub(crate) async fn open_workspace_handler(
  39. data: Data<WorkspaceIdPB>,
  40. controller: AppData<Arc<WorkspaceController>>,
  41. ) -> DataResult<WorkspacePB, FlowyError> {
  42. let params: WorkspaceIdPB = data.into_inner();
  43. let workspaces = controller.open_workspace(params).await?;
  44. data_result(workspaces)
  45. }
  46. #[tracing::instrument(level = "debug", skip(data, folder), err)]
  47. pub(crate) async fn read_workspaces_handler(
  48. data: Data<WorkspaceIdPB>,
  49. folder: AppData<Arc<FolderManager>>,
  50. ) -> DataResult<RepeatedWorkspacePB, FlowyError> {
  51. let params: WorkspaceIdPB = data.into_inner();
  52. let user_id = folder.user.user_id()?;
  53. let workspace_controller = folder.workspace_controller.clone();
  54. let trash_controller = folder.trash_controller.clone();
  55. let workspaces = folder
  56. .persistence
  57. .begin_transaction(|transaction| {
  58. let mut workspaces =
  59. workspace_controller.read_local_workspaces(params.value.clone(), &user_id, &transaction)?;
  60. for workspace in workspaces.iter_mut() {
  61. let apps = read_local_workspace_apps(&workspace.id, trash_controller.clone(), &transaction)?
  62. .into_iter()
  63. .map(|app_rev| app_rev.into())
  64. .collect();
  65. workspace.apps.items = apps;
  66. }
  67. Ok(workspaces)
  68. })
  69. .await?;
  70. let _ = read_workspaces_on_server(folder, user_id, params);
  71. data_result(workspaces)
  72. }
  73. #[tracing::instrument(level = "debug", skip(folder), err)]
  74. pub async fn read_cur_workspace_handler(
  75. folder: AppData<Arc<FolderManager>>,
  76. ) -> DataResult<CurrentWorkspaceSettingPB, FlowyError> {
  77. let workspace_id = get_current_workspace()?;
  78. let user_id = folder.user.user_id()?;
  79. let params = WorkspaceIdPB {
  80. value: Some(workspace_id.clone()),
  81. };
  82. let workspace = folder
  83. .persistence
  84. .begin_transaction(|transaction| {
  85. folder
  86. .workspace_controller
  87. .read_local_workspace(workspace_id, &user_id, &transaction)
  88. })
  89. .await?;
  90. let latest_view: Option<ViewPB> = folder
  91. .view_controller
  92. .latest_visit_view()
  93. .await
  94. .unwrap_or(None)
  95. .map(|view_rev| view_rev.into());
  96. let setting = CurrentWorkspaceSettingPB { workspace, latest_view };
  97. let _ = read_workspaces_on_server(folder, user_id, params);
  98. data_result(setting)
  99. }
  100. #[tracing::instrument(level = "trace", skip(folder_manager), err)]
  101. fn read_workspaces_on_server(
  102. folder_manager: AppData<Arc<FolderManager>>,
  103. user_id: String,
  104. params: WorkspaceIdPB,
  105. ) -> Result<(), FlowyError> {
  106. let (token, server) = (folder_manager.user.token()?, folder_manager.cloud_service.clone());
  107. let persistence = folder_manager.persistence.clone();
  108. tokio::spawn(async move {
  109. let workspace_revs = server.read_workspace(&token, params).await?;
  110. let _ = persistence
  111. .begin_transaction(|transaction| {
  112. tracing::trace!("Save {} workspace", workspace_revs.len());
  113. for workspace_rev in &workspace_revs {
  114. let m_workspace = workspace_rev.clone();
  115. let app_revs = m_workspace.apps.clone();
  116. let _ = transaction.create_workspace(&user_id, m_workspace)?;
  117. tracing::trace!("Save {} apps", app_revs.len());
  118. for app_rev in app_revs {
  119. let view_revs = app_rev.belongings.clone();
  120. match transaction.create_app(app_rev) {
  121. Ok(_) => {}
  122. Err(e) => log::error!("create app failed: {:?}", e),
  123. }
  124. tracing::trace!("Save {} views", view_revs.len());
  125. for view_rev in view_revs {
  126. match transaction.create_view(view_rev) {
  127. Ok(_) => {}
  128. Err(e) => log::error!("create view failed: {:?}", e),
  129. }
  130. }
  131. }
  132. }
  133. Ok(())
  134. })
  135. .await?;
  136. let repeated_workspace = RepeatedWorkspacePB {
  137. items: workspace_revs
  138. .into_iter()
  139. .map(|workspace_rev| workspace_rev.into())
  140. .collect(),
  141. };
  142. send_dart_notification(&token, FolderNotification::WorkspaceListUpdated)
  143. .payload(repeated_workspace)
  144. .send();
  145. Result::<(), FlowyError>::Ok(())
  146. });
  147. Ok(())
  148. }