event_handler.rs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. use crate::{
  2. context::CoreContext,
  3. errors::FlowyError,
  4. notify::{send_dart_notification, WorkspaceNotification},
  5. services::{
  6. get_current_workspace,
  7. read_local_workspace_apps,
  8. workspace::sql::{WorkspaceTable, WorkspaceTableSql},
  9. },
  10. };
  11. use flowy_core_data_model::entities::{
  12. view::View,
  13. workspace::{CurrentWorkspaceSetting, QueryWorkspaceRequest, RepeatedWorkspace, WorkspaceId},
  14. };
  15. use lib_dispatch::prelude::{data_result, Data, DataResult, Unit};
  16. use std::{convert::TryInto, sync::Arc};
  17. #[tracing::instrument(skip(data, core), err)]
  18. pub(crate) async fn read_workspaces_handler(
  19. data: Data<QueryWorkspaceRequest>,
  20. core: Unit<Arc<CoreContext>>,
  21. ) -> DataResult<RepeatedWorkspace, FlowyError> {
  22. let params: WorkspaceId = data.into_inner().try_into()?;
  23. let user_id = core.user.user_id()?;
  24. let conn = &*core.database.db_connection()?;
  25. let workspace_controller = core.workspace_controller.clone();
  26. let trash_controller = core.trash_controller.clone();
  27. let workspaces = conn.immediate_transaction::<_, FlowyError, _>(|| {
  28. let mut workspaces = workspace_controller.read_local_workspaces(params.workspace_id.clone(), &user_id, conn)?;
  29. for workspace in workspaces.iter_mut() {
  30. let apps = read_local_workspace_apps(&workspace.id, trash_controller.clone(), conn)?.into_inner();
  31. workspace.apps.items = apps;
  32. }
  33. Ok(workspaces)
  34. })?;
  35. let _ = read_workspaces_on_server(core, user_id, params);
  36. data_result(workspaces)
  37. }
  38. #[tracing::instrument(skip(core), err)]
  39. pub async fn read_cur_workspace_handler(
  40. core: Unit<Arc<CoreContext>>,
  41. ) -> DataResult<CurrentWorkspaceSetting, FlowyError> {
  42. let workspace_id = get_current_workspace()?;
  43. let user_id = core.user.user_id()?;
  44. let params = WorkspaceId {
  45. workspace_id: Some(workspace_id.clone()),
  46. };
  47. let conn = &*core.database.db_connection()?;
  48. let workspace = core
  49. .workspace_controller
  50. .read_local_workspace(workspace_id, &user_id, conn)?;
  51. let latest_view: Option<View> = core.view_controller.latest_visit_view().unwrap_or(None);
  52. let setting = CurrentWorkspaceSetting { workspace, latest_view };
  53. let _ = read_workspaces_on_server(core, user_id, params);
  54. data_result(setting)
  55. }
  56. #[tracing::instrument(level = "debug", skip(core), err)]
  57. fn read_workspaces_on_server(
  58. core: Unit<Arc<CoreContext>>,
  59. user_id: String,
  60. params: WorkspaceId,
  61. ) -> Result<(), FlowyError> {
  62. let (token, server) = (core.user.token()?, core.server.clone());
  63. let app_ctrl = core.app_controller.clone();
  64. let view_ctrl = core.view_controller.clone();
  65. let conn = core.database.db_connection()?;
  66. tokio::spawn(async move {
  67. // Opti: handle the error and retry?
  68. let workspaces = server.read_workspace(&token, params).await?;
  69. let _ = (&*conn).immediate_transaction::<_, FlowyError, _>(|| {
  70. tracing::debug!("Save {} workspace", workspaces.len());
  71. for workspace in &workspaces.items {
  72. let m_workspace = workspace.clone();
  73. let apps = m_workspace.apps.clone().into_inner();
  74. let workspace_table = WorkspaceTable::new(m_workspace, &user_id);
  75. let _ = WorkspaceTableSql::create_workspace(workspace_table, &*conn)?;
  76. tracing::debug!("Save {} apps", apps.len());
  77. for app in apps {
  78. let views = app.belongings.clone().into_inner();
  79. match app_ctrl.save_app(app, &*conn) {
  80. Ok(_) => {},
  81. Err(e) => log::error!("create app failed: {:?}", e),
  82. }
  83. tracing::debug!("Save {} views", views.len());
  84. for view in views {
  85. match view_ctrl.save_view(view, &*conn) {
  86. Ok(_) => {},
  87. Err(e) => log::error!("create view failed: {:?}", e),
  88. }
  89. }
  90. }
  91. }
  92. Ok(())
  93. })?;
  94. send_dart_notification(&token, WorkspaceNotification::WorkspaceListUpdated)
  95. .payload(workspaces)
  96. .send();
  97. Result::<(), FlowyError>::Ok(())
  98. });
  99. Ok(())
  100. }