event_handler.rs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. use std::sync::{Arc, Weak};
  2. use flowy_error::{FlowyError, FlowyResult};
  3. use lib_dispatch::prelude::{data_result_ok, AFPluginData, AFPluginState, DataResult};
  4. use crate::entities::*;
  5. use crate::manager::FolderManager;
  6. use crate::share::ImportParams;
  7. fn upgrade_folder(
  8. folder_manager: AFPluginState<Weak<FolderManager>>,
  9. ) -> FlowyResult<Arc<FolderManager>> {
  10. let folder = folder_manager
  11. .upgrade()
  12. .ok_or(FlowyError::internal().with_context("The folder manager is already dropped"))?;
  13. Ok(folder)
  14. }
  15. #[tracing::instrument(level = "debug", skip(data, folder), err)]
  16. pub(crate) async fn create_workspace_handler(
  17. data: AFPluginData<CreateWorkspacePayloadPB>,
  18. folder: AFPluginState<Weak<FolderManager>>,
  19. ) -> DataResult<WorkspacePB, FlowyError> {
  20. let folder = upgrade_folder(folder)?;
  21. let params: CreateWorkspaceParams = data.into_inner().try_into()?;
  22. let workspace = folder.create_workspace(params).await?;
  23. data_result_ok(workspace.into())
  24. }
  25. #[tracing::instrument(level = "debug", skip(folder), err)]
  26. pub(crate) async fn get_workspace_views_handler(
  27. folder: AFPluginState<Weak<FolderManager>>,
  28. ) -> DataResult<RepeatedViewPB, FlowyError> {
  29. let folder = upgrade_folder(folder)?;
  30. let child_views = folder.get_current_workspace_views().await?;
  31. let repeated_view: RepeatedViewPB = child_views.into();
  32. data_result_ok(repeated_view)
  33. }
  34. #[tracing::instrument(level = "debug", skip(data, folder), err)]
  35. pub(crate) async fn open_workspace_handler(
  36. data: AFPluginData<WorkspaceIdPB>,
  37. folder: AFPluginState<Weak<FolderManager>>,
  38. ) -> DataResult<WorkspacePB, FlowyError> {
  39. let folder = upgrade_folder(folder)?;
  40. let params: WorkspaceIdPB = data.into_inner();
  41. match params.value {
  42. None => Err(FlowyError::workspace_id().with_context("workspace id should not be empty")),
  43. Some(workspace_id) => {
  44. if workspace_id.is_empty() {
  45. Err(FlowyError::workspace_id().with_context("workspace id should not be empty"))
  46. } else {
  47. let workspace = folder.open_workspace(&workspace_id).await?;
  48. let views = folder.get_workspace_views(&workspace_id).await?;
  49. let workspace_pb: WorkspacePB = (workspace, views).into();
  50. data_result_ok(workspace_pb)
  51. }
  52. },
  53. }
  54. }
  55. #[tracing::instrument(level = "debug", skip(data, folder), err)]
  56. pub(crate) async fn read_workspaces_handler(
  57. data: AFPluginData<WorkspaceIdPB>,
  58. folder: AFPluginState<Weak<FolderManager>>,
  59. ) -> DataResult<RepeatedWorkspacePB, FlowyError> {
  60. let folder = upgrade_folder(folder)?;
  61. let params: WorkspaceIdPB = data.into_inner();
  62. let workspaces = match params.value {
  63. None => folder.get_all_workspaces().await,
  64. Some(workspace_id) => folder
  65. .get_workspace(&workspace_id)
  66. .await
  67. .map(|workspace| vec![workspace])
  68. .unwrap_or_default(),
  69. };
  70. data_result_ok(workspaces.into())
  71. }
  72. #[tracing::instrument(level = "debug", skip(folder), err)]
  73. pub async fn get_current_workspace_setting_handler(
  74. folder: AFPluginState<Weak<FolderManager>>,
  75. ) -> DataResult<WorkspaceSettingPB, FlowyError> {
  76. let folder = upgrade_folder(folder)?;
  77. let workspace = folder.get_current_workspace().await?;
  78. let latest_view: Option<ViewPB> = folder.get_current_view().await;
  79. data_result_ok(WorkspaceSettingPB {
  80. workspace,
  81. latest_view,
  82. })
  83. }
  84. pub(crate) async fn create_view_handler(
  85. data: AFPluginData<CreateViewPayloadPB>,
  86. folder: AFPluginState<Weak<FolderManager>>,
  87. ) -> DataResult<ViewPB, FlowyError> {
  88. let folder = upgrade_folder(folder)?;
  89. let params: CreateViewParams = data.into_inner().try_into()?;
  90. let set_as_current = params.set_as_current;
  91. let view = folder.create_view_with_params(params).await?;
  92. if set_as_current {
  93. let _ = folder.set_current_view(&view.id).await;
  94. }
  95. data_result_ok(view_pb_without_child_views(Arc::new(view)))
  96. }
  97. pub(crate) async fn create_orphan_view_handler(
  98. data: AFPluginData<CreateOrphanViewPayloadPB>,
  99. folder: AFPluginState<Weak<FolderManager>>,
  100. ) -> DataResult<ViewPB, FlowyError> {
  101. let folder = upgrade_folder(folder)?;
  102. let params: CreateViewParams = data.into_inner().try_into()?;
  103. let set_as_current = params.set_as_current;
  104. let view = folder.create_orphan_view_with_params(params).await?;
  105. if set_as_current {
  106. let _ = folder.set_current_view(&view.id).await;
  107. }
  108. data_result_ok(view_pb_without_child_views(Arc::new(view)))
  109. }
  110. pub(crate) async fn read_view_handler(
  111. data: AFPluginData<ViewIdPB>,
  112. folder: AFPluginState<Weak<FolderManager>>,
  113. ) -> DataResult<ViewPB, FlowyError> {
  114. let folder = upgrade_folder(folder)?;
  115. let view_id: ViewIdPB = data.into_inner();
  116. let view_pb = folder.get_view(&view_id.value).await?;
  117. data_result_ok(view_pb)
  118. }
  119. #[tracing::instrument(level = "debug", skip(data, folder), err)]
  120. pub(crate) async fn update_view_handler(
  121. data: AFPluginData<UpdateViewPayloadPB>,
  122. folder: AFPluginState<Weak<FolderManager>>,
  123. ) -> Result<(), FlowyError> {
  124. let folder = upgrade_folder(folder)?;
  125. let params: UpdateViewParams = data.into_inner().try_into()?;
  126. folder.update_view_with_params(params).await?;
  127. Ok(())
  128. }
  129. #[tracing::instrument(level = "debug", skip(data, folder), err)]
  130. pub(crate) async fn update_view_icon_handler(
  131. data: AFPluginData<UpdateViewIconPayloadPB>,
  132. folder: AFPluginState<Weak<FolderManager>>,
  133. ) -> Result<(), FlowyError> {
  134. let folder = upgrade_folder(folder)?;
  135. let params: UpdateViewIconParams = data.into_inner().try_into()?;
  136. folder.update_view_icon_with_params(params).await?;
  137. Ok(())
  138. }
  139. pub(crate) async fn delete_view_handler(
  140. data: AFPluginData<RepeatedViewIdPB>,
  141. folder: AFPluginState<Weak<FolderManager>>,
  142. ) -> Result<(), FlowyError> {
  143. let folder = upgrade_folder(folder)?;
  144. let params: RepeatedViewIdPB = data.into_inner();
  145. for view_id in &params.items {
  146. let _ = folder.move_view_to_trash(view_id).await;
  147. }
  148. Ok(())
  149. }
  150. pub(crate) async fn toggle_favorites_handler(
  151. data: AFPluginData<RepeatedViewIdPB>,
  152. folder: AFPluginState<Weak<FolderManager>>,
  153. ) -> Result<(), FlowyError> {
  154. let params: RepeatedViewIdPB = data.into_inner();
  155. let folder = upgrade_folder(folder)?;
  156. for view_id in &params.items {
  157. let _ = folder.toggle_favorites(view_id).await;
  158. }
  159. Ok(())
  160. }
  161. pub(crate) async fn set_latest_view_handler(
  162. data: AFPluginData<ViewIdPB>,
  163. folder: AFPluginState<Weak<FolderManager>>,
  164. ) -> Result<(), FlowyError> {
  165. let folder = upgrade_folder(folder)?;
  166. let view_id: ViewIdPB = data.into_inner();
  167. let _ = folder.set_current_view(&view_id.value).await;
  168. Ok(())
  169. }
  170. pub(crate) async fn close_view_handler(
  171. data: AFPluginData<ViewIdPB>,
  172. folder: AFPluginState<Weak<FolderManager>>,
  173. ) -> Result<(), FlowyError> {
  174. let folder = upgrade_folder(folder)?;
  175. let view_id: ViewIdPB = data.into_inner();
  176. let _ = folder.close_view(&view_id.value).await;
  177. Ok(())
  178. }
  179. #[tracing::instrument(level = "debug", skip_all, err)]
  180. pub(crate) async fn move_view_handler(
  181. data: AFPluginData<MoveViewPayloadPB>,
  182. folder: AFPluginState<Weak<FolderManager>>,
  183. ) -> Result<(), FlowyError> {
  184. let folder = upgrade_folder(folder)?;
  185. let params: MoveViewParams = data.into_inner().try_into()?;
  186. folder
  187. .move_view(&params.view_id, params.from, params.to)
  188. .await?;
  189. Ok(())
  190. }
  191. pub(crate) async fn move_nested_view_handler(
  192. data: AFPluginData<MoveNestedViewPayloadPB>,
  193. folder: AFPluginState<Weak<FolderManager>>,
  194. ) -> Result<(), FlowyError> {
  195. let folder = upgrade_folder(folder)?;
  196. let params: MoveNestedViewParams = data.into_inner().try_into()?;
  197. folder
  198. .move_nested_view(params.view_id, params.new_parent_id, params.prev_view_id)
  199. .await?;
  200. Ok(())
  201. }
  202. #[tracing::instrument(level = "debug", skip(data, folder), err)]
  203. pub(crate) async fn duplicate_view_handler(
  204. data: AFPluginData<ViewPB>,
  205. folder: AFPluginState<Weak<FolderManager>>,
  206. ) -> Result<(), FlowyError> {
  207. let folder = upgrade_folder(folder)?;
  208. let view: ViewPB = data.into_inner();
  209. folder.duplicate_view(&view.id).await?;
  210. Ok(())
  211. }
  212. #[tracing::instrument(level = "debug", skip(folder), err)]
  213. pub(crate) async fn read_favorites_handler(
  214. folder: AFPluginState<Weak<FolderManager>>,
  215. ) -> DataResult<RepeatedViewPB, FlowyError> {
  216. let folder = upgrade_folder(folder)?;
  217. let favorites = folder.get_all_favorites().await;
  218. let mut views = vec![];
  219. for info in favorites {
  220. let view = folder.get_view(&info.id).await;
  221. match view {
  222. Ok(view) => {
  223. views.push(view);
  224. },
  225. Err(err) => {
  226. return Err(err);
  227. },
  228. }
  229. }
  230. data_result_ok(RepeatedViewPB { items: views })
  231. }
  232. #[tracing::instrument(level = "debug", skip(folder), err)]
  233. pub(crate) async fn read_trash_handler(
  234. folder: AFPluginState<Weak<FolderManager>>,
  235. ) -> DataResult<RepeatedTrashPB, FlowyError> {
  236. let folder = upgrade_folder(folder)?;
  237. let trash = folder.get_all_trash().await;
  238. data_result_ok(trash.into())
  239. }
  240. #[tracing::instrument(level = "debug", skip(identifier, folder), err)]
  241. pub(crate) async fn putback_trash_handler(
  242. identifier: AFPluginData<TrashIdPB>,
  243. folder: AFPluginState<Weak<FolderManager>>,
  244. ) -> Result<(), FlowyError> {
  245. let folder = upgrade_folder(folder)?;
  246. folder.restore_trash(&identifier.id).await;
  247. Ok(())
  248. }
  249. #[tracing::instrument(level = "debug", skip(identifiers, folder), err)]
  250. pub(crate) async fn delete_trash_handler(
  251. identifiers: AFPluginData<RepeatedTrashIdPB>,
  252. folder: AFPluginState<Weak<FolderManager>>,
  253. ) -> Result<(), FlowyError> {
  254. let folder = upgrade_folder(folder)?;
  255. let trash_ids = identifiers.into_inner().items;
  256. for trash_id in trash_ids {
  257. let _ = folder.delete_trash(&trash_id.id).await;
  258. }
  259. Ok(())
  260. }
  261. #[tracing::instrument(level = "debug", skip(folder), err)]
  262. pub(crate) async fn restore_all_trash_handler(
  263. folder: AFPluginState<Weak<FolderManager>>,
  264. ) -> Result<(), FlowyError> {
  265. let folder = upgrade_folder(folder)?;
  266. folder.restore_all_trash().await;
  267. Ok(())
  268. }
  269. #[tracing::instrument(level = "debug", skip(folder), err)]
  270. pub(crate) async fn delete_all_trash_handler(
  271. folder: AFPluginState<Weak<FolderManager>>,
  272. ) -> Result<(), FlowyError> {
  273. let folder = upgrade_folder(folder)?;
  274. folder.delete_all_trash().await;
  275. Ok(())
  276. }
  277. #[tracing::instrument(level = "debug", skip(data, folder), err)]
  278. pub(crate) async fn import_data_handler(
  279. data: AFPluginData<ImportPB>,
  280. folder: AFPluginState<Weak<FolderManager>>,
  281. ) -> Result<(), FlowyError> {
  282. let folder = upgrade_folder(folder)?;
  283. let params: ImportParams = data.into_inner().try_into()?;
  284. folder.import(params).await?;
  285. Ok(())
  286. }
  287. #[tracing::instrument(level = "debug", skip(folder), err)]
  288. pub(crate) async fn get_folder_snapshots_handler(
  289. data: AFPluginData<WorkspaceIdPB>,
  290. folder: AFPluginState<Weak<FolderManager>>,
  291. ) -> DataResult<RepeatedFolderSnapshotPB, FlowyError> {
  292. let folder = upgrade_folder(folder)?;
  293. if let Some(workspace_id) = &data.value {
  294. let snapshots = folder.get_folder_snapshots(workspace_id, 10).await?;
  295. data_result_ok(RepeatedFolderSnapshotPB { items: snapshots })
  296. } else {
  297. data_result_ok(RepeatedFolderSnapshotPB { items: vec![] })
  298. }
  299. }