event_handler.rs 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. use crate::entities::{
  2. view_pb_without_child_views, CreateViewParams, CreateViewPayloadPB, CreateWorkspaceParams,
  3. CreateWorkspacePayloadPB, MoveFolderItemPayloadPB, MoveViewParams, RepeatedTrashIdPB,
  4. RepeatedTrashPB, RepeatedViewIdPB, RepeatedViewPB, RepeatedWorkspacePB, TrashIdPB,
  5. UpdateViewParams, UpdateViewPayloadPB, ViewIdPB, ViewPB, WorkspaceIdPB, WorkspacePB,
  6. WorkspaceSettingPB,
  7. };
  8. use crate::manager::Folder2Manager;
  9. use flowy_error::FlowyError;
  10. use lib_dispatch::prelude::{data_result_ok, AFPluginData, AFPluginState, DataResult};
  11. use std::sync::Arc;
  12. #[tracing::instrument(level = "debug", skip(data, folder), err)]
  13. pub(crate) async fn create_workspace_handler(
  14. data: AFPluginData<CreateWorkspacePayloadPB>,
  15. folder: AFPluginState<Arc<Folder2Manager>>,
  16. ) -> DataResult<WorkspacePB, FlowyError> {
  17. let params: CreateWorkspaceParams = data.into_inner().try_into()?;
  18. let workspace = folder.create_workspace(params).await?;
  19. data_result_ok(workspace.into())
  20. }
  21. #[tracing::instrument(level = "debug", skip(folder), err)]
  22. pub(crate) async fn read_workspace_apps_handler(
  23. folder: AFPluginState<Arc<Folder2Manager>>,
  24. ) -> DataResult<RepeatedViewPB, FlowyError> {
  25. let child_views = folder.get_current_workspace_views().await?;
  26. let repeated_view: RepeatedViewPB = child_views.into();
  27. data_result_ok(repeated_view)
  28. }
  29. #[tracing::instrument(level = "debug", skip(data, folder), err)]
  30. pub(crate) async fn open_workspace_handler(
  31. data: AFPluginData<WorkspaceIdPB>,
  32. folder: AFPluginState<Arc<Folder2Manager>>,
  33. ) -> DataResult<WorkspacePB, FlowyError> {
  34. let params: WorkspaceIdPB = data.into_inner();
  35. match params.value {
  36. None => Err(FlowyError::workspace_id().context("workspace id should not be empty")),
  37. Some(workspace_id) => {
  38. let workspace = folder.open_workspace(&workspace_id).await?;
  39. let views = folder.get_workspace_views(&workspace_id).await?;
  40. let workspace_pb: WorkspacePB = (workspace, views).into();
  41. data_result_ok(workspace_pb)
  42. },
  43. }
  44. }
  45. #[tracing::instrument(level = "debug", skip(data, folder), err)]
  46. pub(crate) async fn read_workspaces_handler(
  47. data: AFPluginData<WorkspaceIdPB>,
  48. folder: AFPluginState<Arc<Folder2Manager>>,
  49. ) -> DataResult<RepeatedWorkspacePB, FlowyError> {
  50. let params: WorkspaceIdPB = data.into_inner();
  51. let workspaces = match params.value {
  52. None => folder.get_all_workspaces().await,
  53. Some(workspace_id) => folder
  54. .get_workspace(&workspace_id)
  55. .await
  56. .map(|workspace| vec![workspace])
  57. .unwrap_or_default(),
  58. };
  59. data_result_ok(workspaces.into())
  60. }
  61. #[tracing::instrument(level = "debug", skip(folder), err)]
  62. pub async fn read_cur_workspace_setting_handler(
  63. folder: AFPluginState<Arc<Folder2Manager>>,
  64. ) -> DataResult<WorkspaceSettingPB, FlowyError> {
  65. let workspace = folder.get_current_workspace().await?;
  66. let views = folder.get_workspace_views(&workspace.id).await?;
  67. let workspace: WorkspacePB = (workspace, views).into();
  68. let latest_view: Option<ViewPB> = folder.get_current_view().await;
  69. data_result_ok(WorkspaceSettingPB {
  70. workspace,
  71. latest_view,
  72. })
  73. }
  74. pub(crate) async fn create_view_handler(
  75. data: AFPluginData<CreateViewPayloadPB>,
  76. folder: AFPluginState<Arc<Folder2Manager>>,
  77. ) -> DataResult<ViewPB, FlowyError> {
  78. let params: CreateViewParams = data.into_inner().try_into()?;
  79. let view = folder.create_view_with_params(params).await?;
  80. let _ = folder.set_current_view(&view.id).await;
  81. data_result_ok(view_pb_without_child_views(view))
  82. }
  83. pub(crate) async fn read_view_handler(
  84. data: AFPluginData<ViewIdPB>,
  85. folder: AFPluginState<Arc<Folder2Manager>>,
  86. ) -> DataResult<ViewPB, FlowyError> {
  87. let view_id: ViewIdPB = data.into_inner();
  88. let view_pb = folder.get_view(&view_id.value).await?;
  89. data_result_ok(view_pb)
  90. }
  91. #[tracing::instrument(level = "debug", skip(data, folder), err)]
  92. pub(crate) async fn update_view_handler(
  93. data: AFPluginData<UpdateViewPayloadPB>,
  94. folder: AFPluginState<Arc<Folder2Manager>>,
  95. ) -> Result<(), FlowyError> {
  96. let params: UpdateViewParams = data.into_inner().try_into()?;
  97. folder.update_view_with_params(params).await?;
  98. Ok(())
  99. }
  100. pub(crate) async fn delete_view_handler(
  101. data: AFPluginData<RepeatedViewIdPB>,
  102. folder: AFPluginState<Arc<Folder2Manager>>,
  103. ) -> Result<(), FlowyError> {
  104. let params: RepeatedViewIdPB = data.into_inner();
  105. for view_id in &params.items {
  106. let _ = folder.move_view_to_trash(view_id).await;
  107. }
  108. Ok(())
  109. }
  110. pub(crate) async fn set_latest_view_handler(
  111. data: AFPluginData<ViewIdPB>,
  112. folder: AFPluginState<Arc<Folder2Manager>>,
  113. ) -> Result<(), FlowyError> {
  114. let view_id: ViewIdPB = data.into_inner();
  115. let _ = folder.set_current_view(&view_id.value).await;
  116. Ok(())
  117. }
  118. pub(crate) async fn close_view_handler(
  119. data: AFPluginData<ViewIdPB>,
  120. folder: AFPluginState<Arc<Folder2Manager>>,
  121. ) -> Result<(), FlowyError> {
  122. let view_id: ViewIdPB = data.into_inner();
  123. let _ = folder.close_view(&view_id.value).await;
  124. Ok(())
  125. }
  126. #[tracing::instrument(level = "debug", skip_all, err)]
  127. pub(crate) async fn move_view_handler(
  128. data: AFPluginData<MoveFolderItemPayloadPB>,
  129. folder: AFPluginState<Arc<Folder2Manager>>,
  130. ) -> Result<(), FlowyError> {
  131. let params: MoveViewParams = data.into_inner().try_into()?;
  132. folder
  133. .move_view(&params.item_id, params.from, params.to)
  134. .await?;
  135. Ok(())
  136. }
  137. #[tracing::instrument(level = "debug", skip(data, folder), err)]
  138. pub(crate) async fn duplicate_view_handler(
  139. data: AFPluginData<ViewPB>,
  140. folder: AFPluginState<Arc<Folder2Manager>>,
  141. ) -> Result<(), FlowyError> {
  142. let view: ViewPB = data.into_inner();
  143. folder.duplicate_view(&view.id).await?;
  144. Ok(())
  145. }
  146. #[tracing::instrument(level = "debug", skip(folder), err)]
  147. pub(crate) async fn read_trash_handler(
  148. folder: AFPluginState<Arc<Folder2Manager>>,
  149. ) -> DataResult<RepeatedTrashPB, FlowyError> {
  150. let trash = folder.get_all_trash().await;
  151. data_result_ok(trash.into())
  152. }
  153. #[tracing::instrument(level = "debug", skip(identifier, folder), err)]
  154. pub(crate) async fn putback_trash_handler(
  155. identifier: AFPluginData<TrashIdPB>,
  156. folder: AFPluginState<Arc<Folder2Manager>>,
  157. ) -> Result<(), FlowyError> {
  158. folder.restore_trash(&identifier.id).await;
  159. Ok(())
  160. }
  161. #[tracing::instrument(level = "debug", skip(identifiers, folder), err)]
  162. pub(crate) async fn delete_trash_handler(
  163. identifiers: AFPluginData<RepeatedTrashIdPB>,
  164. folder: AFPluginState<Arc<Folder2Manager>>,
  165. ) -> Result<(), FlowyError> {
  166. let trash_ids = identifiers.into_inner().items;
  167. for trash_id in trash_ids {
  168. folder.delete_trash(&trash_id.id).await;
  169. }
  170. Ok(())
  171. }
  172. #[tracing::instrument(level = "debug", skip(folder), err)]
  173. pub(crate) async fn restore_all_trash_handler(
  174. folder: AFPluginState<Arc<Folder2Manager>>,
  175. ) -> Result<(), FlowyError> {
  176. folder.restore_all_trash().await;
  177. Ok(())
  178. }
  179. #[tracing::instrument(level = "debug", skip(folder), err)]
  180. pub(crate) async fn delete_all_trash_handler(
  181. folder: AFPluginState<Arc<Folder2Manager>>,
  182. ) -> Result<(), FlowyError> {
  183. folder.delete_all_trash().await;
  184. Ok(())
  185. }