event_handler.rs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. use crate::entities::{
  2. app::RepeatedAppPB,
  3. view::ViewPB,
  4. workspace::{RepeatedWorkspacePB, WorkspaceIdPB, WorkspaceSettingPB, *},
  5. };
  6. use crate::{
  7. errors::FlowyError,
  8. manager::FolderManager,
  9. notification::{send_notification, FolderNotification},
  10. services::{get_current_workspace, read_workspace_apps, WorkspaceController},
  11. };
  12. use lib_dispatch::prelude::{data_result, AFPluginData, AFPluginState, 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: AFPluginData<CreateWorkspacePayloadPB>,
  17. controller: AFPluginState<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: AFPluginState<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: AFPluginData<WorkspaceIdPB>,
  40. controller: AFPluginState<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: AFPluginData<WorkspaceIdPB>,
  49. folder: AFPluginState<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 = workspace_controller.read_workspaces(params.value.clone(), &user_id, &transaction)?;
  59. for workspace in workspaces.iter_mut() {
  60. let apps = read_workspace_apps(&workspace.id, trash_controller.clone(), &transaction)?
  61. .into_iter()
  62. .map(|app_rev| app_rev.into())
  63. .collect();
  64. workspace.apps.items = apps;
  65. }
  66. Ok(workspaces)
  67. })
  68. .await?;
  69. let _ = read_workspaces_on_server(folder, user_id, params);
  70. data_result(workspaces)
  71. }
  72. #[tracing::instrument(level = "debug", skip(folder), err)]
  73. pub async fn read_cur_workspace_handler(
  74. folder: AFPluginState<Arc<FolderManager>>,
  75. ) -> DataResult<WorkspaceSettingPB, FlowyError> {
  76. let user_id = folder.user.user_id()?;
  77. let workspace_id = get_current_workspace(&user_id)?;
  78. let params = WorkspaceIdPB {
  79. value: Some(workspace_id.clone()),
  80. };
  81. let workspace = folder
  82. .persistence
  83. .begin_transaction(|transaction| {
  84. folder
  85. .workspace_controller
  86. .read_workspace(workspace_id, &user_id, &transaction)
  87. })
  88. .await?;
  89. let latest_view: Option<ViewPB> = folder
  90. .view_controller
  91. .latest_visit_view()
  92. .await
  93. .unwrap_or(None)
  94. .map(|view_rev| view_rev.into());
  95. let setting = WorkspaceSettingPB { workspace, latest_view };
  96. let _ = read_workspaces_on_server(folder, user_id, params);
  97. data_result(setting)
  98. }
  99. #[tracing::instrument(level = "trace", skip(folder_manager), err)]
  100. fn read_workspaces_on_server(
  101. folder_manager: AFPluginState<Arc<FolderManager>>,
  102. user_id: String,
  103. params: WorkspaceIdPB,
  104. ) -> Result<(), FlowyError> {
  105. let (token, server) = (folder_manager.user.token()?, folder_manager.cloud_service.clone());
  106. let persistence = folder_manager.persistence.clone();
  107. tokio::spawn(async move {
  108. let workspace_revs = server.read_workspace(&token, params).await?;
  109. persistence
  110. .begin_transaction(|transaction| {
  111. for workspace_rev in &workspace_revs {
  112. let m_workspace = workspace_rev.clone();
  113. let app_revs = m_workspace.apps.clone();
  114. transaction.create_workspace(&user_id, m_workspace)?;
  115. tracing::trace!("Save {} apps", app_revs.len());
  116. for app_rev in app_revs {
  117. let view_revs = app_rev.belongings.clone();
  118. match transaction.create_app(app_rev) {
  119. Ok(_) => {}
  120. Err(e) => log::error!("create app failed: {:?}", e),
  121. }
  122. tracing::trace!("Save {} views", view_revs.len());
  123. for view_rev in view_revs {
  124. match transaction.create_view(view_rev) {
  125. Ok(_) => {}
  126. Err(e) => log::error!("create view failed: {:?}", e),
  127. }
  128. }
  129. }
  130. }
  131. Ok(())
  132. })
  133. .await?;
  134. let repeated_workspace = RepeatedWorkspacePB {
  135. items: workspace_revs
  136. .into_iter()
  137. .map(|workspace_rev| workspace_rev.into())
  138. .collect(),
  139. };
  140. send_notification(&token, FolderNotification::WorkspaceListUpdated)
  141. .payload(repeated_workspace)
  142. .send();
  143. Result::<(), FlowyError>::Ok(())
  144. });
  145. Ok(())
  146. }