event_handler.rs 7.2 KB

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