event_handler.rs 7.5 KB

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