event_handler.rs 5.3 KB

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