event_handler.rs 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  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. if workspace_id.is_empty() {
  40. return Err(FlowyError::workspace_id().context("workspace id should not be empty"));
  41. } else {
  42. let workspace = folder.open_workspace(&workspace_id).await?;
  43. let views = folder.get_workspace_views(&workspace_id).await?;
  44. let workspace_pb: WorkspacePB = (workspace, views).into();
  45. data_result_ok(workspace_pb)
  46. }
  47. },
  48. }
  49. }
  50. #[tracing::instrument(level = "debug", skip(data, folder), err)]
  51. pub(crate) async fn read_workspaces_handler(
  52. data: AFPluginData<WorkspaceIdPB>,
  53. folder: AFPluginState<Arc<Folder2Manager>>,
  54. ) -> DataResult<RepeatedWorkspacePB, FlowyError> {
  55. let params: WorkspaceIdPB = data.into_inner();
  56. let workspaces = match params.value {
  57. None => folder.get_all_workspaces().await,
  58. Some(workspace_id) => folder
  59. .get_workspace(&workspace_id)
  60. .await
  61. .map(|workspace| vec![workspace])
  62. .unwrap_or_default(),
  63. };
  64. data_result_ok(workspaces.into())
  65. }
  66. #[tracing::instrument(level = "debug", skip(folder), err)]
  67. pub async fn read_current_workspace_setting_handler(
  68. folder: AFPluginState<Arc<Folder2Manager>>,
  69. ) -> DataResult<WorkspaceSettingPB, FlowyError> {
  70. let workspace = folder.get_current_workspace().await?;
  71. let latest_view: Option<ViewPB> = folder.get_current_view().await;
  72. data_result_ok(WorkspaceSettingPB {
  73. workspace,
  74. latest_view,
  75. })
  76. }
  77. pub(crate) async fn create_view_handler(
  78. data: AFPluginData<CreateViewPayloadPB>,
  79. folder: AFPluginState<Arc<Folder2Manager>>,
  80. ) -> DataResult<ViewPB, FlowyError> {
  81. let params: CreateViewParams = data.into_inner().try_into()?;
  82. let set_as_current = params.set_as_current;
  83. let view = folder.create_view_with_params(params).await?;
  84. if set_as_current {
  85. let _ = folder.set_current_view(&view.id).await;
  86. }
  87. data_result_ok(view_pb_without_child_views(view))
  88. }
  89. pub(crate) async fn read_view_handler(
  90. data: AFPluginData<ViewIdPB>,
  91. folder: AFPluginState<Arc<Folder2Manager>>,
  92. ) -> DataResult<ViewPB, FlowyError> {
  93. let view_id: ViewIdPB = data.into_inner();
  94. let view_pb = folder.get_view(&view_id.value).await?;
  95. data_result_ok(view_pb)
  96. }
  97. #[tracing::instrument(level = "debug", skip(data, folder), err)]
  98. pub(crate) async fn update_view_handler(
  99. data: AFPluginData<UpdateViewPayloadPB>,
  100. folder: AFPluginState<Arc<Folder2Manager>>,
  101. ) -> Result<(), FlowyError> {
  102. let params: UpdateViewParams = data.into_inner().try_into()?;
  103. folder.update_view_with_params(params).await?;
  104. Ok(())
  105. }
  106. pub(crate) async fn delete_view_handler(
  107. data: AFPluginData<RepeatedViewIdPB>,
  108. folder: AFPluginState<Arc<Folder2Manager>>,
  109. ) -> Result<(), FlowyError> {
  110. let params: RepeatedViewIdPB = data.into_inner();
  111. for view_id in &params.items {
  112. let _ = folder.move_view_to_trash(view_id).await;
  113. }
  114. Ok(())
  115. }
  116. pub(crate) async fn set_latest_view_handler(
  117. data: AFPluginData<ViewIdPB>,
  118. folder: AFPluginState<Arc<Folder2Manager>>,
  119. ) -> Result<(), FlowyError> {
  120. let view_id: ViewIdPB = data.into_inner();
  121. let _ = folder.set_current_view(&view_id.value).await;
  122. Ok(())
  123. }
  124. pub(crate) async fn close_view_handler(
  125. data: AFPluginData<ViewIdPB>,
  126. folder: AFPluginState<Arc<Folder2Manager>>,
  127. ) -> Result<(), FlowyError> {
  128. let view_id: ViewIdPB = data.into_inner();
  129. let _ = folder.close_view(&view_id.value).await;
  130. Ok(())
  131. }
  132. #[tracing::instrument(level = "debug", skip_all, err)]
  133. pub(crate) async fn move_view_handler(
  134. data: AFPluginData<MoveViewPayloadPB>,
  135. folder: AFPluginState<Arc<Folder2Manager>>,
  136. ) -> Result<(), FlowyError> {
  137. let params: MoveViewParams = data.into_inner().try_into()?;
  138. folder
  139. .move_view(&params.view_id, params.from, params.to)
  140. .await?;
  141. Ok(())
  142. }
  143. #[tracing::instrument(level = "debug", skip(data, folder), err)]
  144. pub(crate) async fn duplicate_view_handler(
  145. data: AFPluginData<ViewPB>,
  146. folder: AFPluginState<Arc<Folder2Manager>>,
  147. ) -> Result<(), FlowyError> {
  148. let view: ViewPB = data.into_inner();
  149. folder.duplicate_view(&view.id).await?;
  150. Ok(())
  151. }
  152. #[tracing::instrument(level = "debug", skip(folder), err)]
  153. pub(crate) async fn read_trash_handler(
  154. folder: AFPluginState<Arc<Folder2Manager>>,
  155. ) -> DataResult<RepeatedTrashPB, FlowyError> {
  156. let trash = folder.get_all_trash().await;
  157. data_result_ok(trash.into())
  158. }
  159. #[tracing::instrument(level = "debug", skip(identifier, folder), err)]
  160. pub(crate) async fn putback_trash_handler(
  161. identifier: AFPluginData<TrashIdPB>,
  162. folder: AFPluginState<Arc<Folder2Manager>>,
  163. ) -> Result<(), FlowyError> {
  164. folder.restore_trash(&identifier.id).await;
  165. Ok(())
  166. }
  167. #[tracing::instrument(level = "debug", skip(identifiers, folder), err)]
  168. pub(crate) async fn delete_trash_handler(
  169. identifiers: AFPluginData<RepeatedTrashIdPB>,
  170. folder: AFPluginState<Arc<Folder2Manager>>,
  171. ) -> Result<(), FlowyError> {
  172. let trash_ids = identifiers.into_inner().items;
  173. for trash_id in trash_ids {
  174. let _ = folder.delete_trash(&trash_id.id).await;
  175. }
  176. Ok(())
  177. }
  178. #[tracing::instrument(level = "debug", skip(folder), err)]
  179. pub(crate) async fn restore_all_trash_handler(
  180. folder: AFPluginState<Arc<Folder2Manager>>,
  181. ) -> Result<(), FlowyError> {
  182. folder.restore_all_trash().await;
  183. Ok(())
  184. }
  185. #[tracing::instrument(level = "debug", skip(folder), err)]
  186. pub(crate) async fn delete_all_trash_handler(
  187. folder: AFPluginState<Arc<Folder2Manager>>,
  188. ) -> Result<(), FlowyError> {
  189. folder.delete_all_trash().await;
  190. Ok(())
  191. }
  192. #[tracing::instrument(level = "debug", skip(data, folder), err)]
  193. pub(crate) async fn import_data_handler(
  194. data: AFPluginData<ImportPB>,
  195. folder: AFPluginState<Arc<Folder2Manager>>,
  196. ) -> Result<(), FlowyError> {
  197. let params: ImportParams = data.into_inner().try_into()?;
  198. folder.import(params).await?;
  199. Ok(())
  200. }