event_handler.rs 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504
  1. use crate::entities::*;
  2. use crate::manager::GridManager;
  3. use crate::services::cell::TypeCellData;
  4. use crate::services::field::{
  5. default_type_option_builder_from_type, select_type_option_from_field_rev, type_option_builder_from_json_str,
  6. DateCellChangeset, DateChangesetPB, SelectOptionCellChangeset, SelectOptionCellChangesetPB,
  7. SelectOptionCellChangesetParams, SelectOptionCellDataPB, SelectOptionChangeset, SelectOptionChangesetPB,
  8. SelectOptionPB,
  9. };
  10. use crate::services::row::{make_block_pbs, make_row_from_row_rev};
  11. use flowy_error::{ErrorCode, FlowyError, FlowyResult};
  12. use grid_rev_model::FieldRevision;
  13. use lib_dispatch::prelude::{data_result, AFPluginData, AFPluginState, DataResult};
  14. use std::sync::Arc;
  15. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  16. pub(crate) async fn get_grid_handler(
  17. data: AFPluginData<GridIdPB>,
  18. manager: AFPluginState<Arc<GridManager>>,
  19. ) -> DataResult<GridPB, FlowyError> {
  20. let grid_id: GridIdPB = data.into_inner();
  21. let editor = manager.open_grid(grid_id).await?;
  22. let grid = editor.get_grid().await?;
  23. data_result(grid)
  24. }
  25. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  26. pub(crate) async fn get_grid_setting_handler(
  27. data: AFPluginData<GridIdPB>,
  28. manager: AFPluginState<Arc<GridManager>>,
  29. ) -> DataResult<GridSettingPB, FlowyError> {
  30. let grid_id: GridIdPB = data.into_inner();
  31. let editor = manager.open_grid(grid_id).await?;
  32. let grid_setting = editor.get_setting().await?;
  33. data_result(grid_setting)
  34. }
  35. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  36. pub(crate) async fn update_grid_setting_handler(
  37. data: AFPluginData<GridSettingChangesetPB>,
  38. manager: AFPluginState<Arc<GridManager>>,
  39. ) -> Result<(), FlowyError> {
  40. let params: GridSettingChangesetParams = data.into_inner().try_into()?;
  41. let editor = manager.get_grid_editor(&params.grid_id).await?;
  42. if let Some(insert_params) = params.insert_group {
  43. let _ = editor.insert_group(insert_params).await?;
  44. }
  45. if let Some(delete_params) = params.delete_group {
  46. let _ = editor.delete_group(delete_params).await?;
  47. }
  48. if let Some(alter_filter) = params.insert_filter {
  49. let _ = editor.create_or_update_filter(alter_filter).await?;
  50. }
  51. if let Some(delete_filter) = params.delete_filter {
  52. let _ = editor.delete_filter(delete_filter).await?;
  53. }
  54. Ok(())
  55. }
  56. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  57. pub(crate) async fn get_all_filters_handler(
  58. data: AFPluginData<GridIdPB>,
  59. manager: AFPluginState<Arc<GridManager>>,
  60. ) -> DataResult<RepeatedFilterPB, FlowyError> {
  61. let grid_id: GridIdPB = data.into_inner();
  62. let editor = manager.open_grid(grid_id).await?;
  63. let filters = RepeatedFilterPB {
  64. items: editor.get_all_filters().await?,
  65. };
  66. data_result(filters)
  67. }
  68. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  69. pub(crate) async fn get_grid_blocks_handler(
  70. data: AFPluginData<QueryBlocksPayloadPB>,
  71. manager: AFPluginState<Arc<GridManager>>,
  72. ) -> DataResult<RepeatedBlockPB, FlowyError> {
  73. let params: QueryGridBlocksParams = data.into_inner().try_into()?;
  74. let editor = manager.get_grid_editor(&params.grid_id).await?;
  75. let blocks = editor.get_blocks(Some(params.block_ids)).await?;
  76. data_result(make_block_pbs(blocks))
  77. }
  78. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  79. pub(crate) async fn get_fields_handler(
  80. data: AFPluginData<GetFieldPayloadPB>,
  81. manager: AFPluginState<Arc<GridManager>>,
  82. ) -> DataResult<RepeatedFieldPB, FlowyError> {
  83. let params: GetFieldParams = data.into_inner().try_into()?;
  84. let editor = manager.get_grid_editor(&params.grid_id).await?;
  85. let field_revs = editor.get_field_revs(params.field_ids).await?;
  86. let repeated_field: RepeatedFieldPB = field_revs.into_iter().map(FieldPB::from).collect::<Vec<_>>().into();
  87. data_result(repeated_field)
  88. }
  89. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  90. pub(crate) async fn update_field_handler(
  91. data: AFPluginData<FieldChangesetPB>,
  92. manager: AFPluginState<Arc<GridManager>>,
  93. ) -> Result<(), FlowyError> {
  94. let changeset: FieldChangesetParams = data.into_inner().try_into()?;
  95. let editor = manager.get_grid_editor(&changeset.grid_id).await?;
  96. let _ = editor.update_field(changeset).await?;
  97. Ok(())
  98. }
  99. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  100. pub(crate) async fn update_field_type_option_handler(
  101. data: AFPluginData<TypeOptionChangesetPB>,
  102. manager: AFPluginState<Arc<GridManager>>,
  103. ) -> Result<(), FlowyError> {
  104. let params: TypeOptionChangesetParams = data.into_inner().try_into()?;
  105. let editor = manager.get_grid_editor(&params.grid_id).await?;
  106. let old_field_rev = editor.get_field_rev(&params.field_id).await;
  107. let _ = editor
  108. .update_field_type_option(
  109. &params.grid_id,
  110. &params.field_id,
  111. params.type_option_data,
  112. old_field_rev,
  113. )
  114. .await?;
  115. Ok(())
  116. }
  117. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  118. pub(crate) async fn delete_field_handler(
  119. data: AFPluginData<DeleteFieldPayloadPB>,
  120. manager: AFPluginState<Arc<GridManager>>,
  121. ) -> Result<(), FlowyError> {
  122. let params: FieldIdParams = data.into_inner().try_into()?;
  123. let editor = manager.get_grid_editor(&params.grid_id).await?;
  124. let _ = editor.delete_field(&params.field_id).await?;
  125. Ok(())
  126. }
  127. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  128. pub(crate) async fn switch_to_field_handler(
  129. data: AFPluginData<EditFieldChangesetPB>,
  130. manager: AFPluginState<Arc<GridManager>>,
  131. ) -> Result<(), FlowyError> {
  132. let params: EditFieldParams = data.into_inner().try_into()?;
  133. let editor = manager.get_grid_editor(&params.grid_id).await?;
  134. let old_field_rev = editor.get_field_rev(&params.field_id).await;
  135. editor
  136. .switch_to_field_type(&params.field_id, &params.field_type)
  137. .await?;
  138. // Get the field_rev with field_id, if it doesn't exist, we create the default FieldRevision from the FieldType.
  139. let new_field_rev = editor
  140. .get_field_rev(&params.field_id)
  141. .await
  142. .unwrap_or(Arc::new(editor.next_field_rev(&params.field_type).await?));
  143. // Update the type-option data after the field type has been changed
  144. let type_option_data = get_type_option_data(&new_field_rev, &params.field_type).await?;
  145. let _ = editor
  146. .update_field_type_option(&params.grid_id, &new_field_rev.id, type_option_data, old_field_rev)
  147. .await?;
  148. Ok(())
  149. }
  150. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  151. pub(crate) async fn duplicate_field_handler(
  152. data: AFPluginData<DuplicateFieldPayloadPB>,
  153. manager: AFPluginState<Arc<GridManager>>,
  154. ) -> Result<(), FlowyError> {
  155. let params: FieldIdParams = data.into_inner().try_into()?;
  156. let editor = manager.get_grid_editor(&params.grid_id).await?;
  157. let _ = editor.duplicate_field(&params.field_id).await?;
  158. Ok(())
  159. }
  160. /// Return the FieldTypeOptionData if the Field exists otherwise return record not found error.
  161. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  162. pub(crate) async fn get_field_type_option_data_handler(
  163. data: AFPluginData<TypeOptionPathPB>,
  164. manager: AFPluginState<Arc<GridManager>>,
  165. ) -> DataResult<TypeOptionPB, FlowyError> {
  166. let params: TypeOptionPathParams = data.into_inner().try_into()?;
  167. let editor = manager.get_grid_editor(&params.grid_id).await?;
  168. match editor.get_field_rev(&params.field_id).await {
  169. None => Err(FlowyError::record_not_found()),
  170. Some(field_rev) => {
  171. let field_type = field_rev.ty.into();
  172. let type_option_data = get_type_option_data(&field_rev, &field_type).await?;
  173. let data = TypeOptionPB {
  174. grid_id: params.grid_id,
  175. field: field_rev.into(),
  176. type_option_data,
  177. };
  178. data_result(data)
  179. }
  180. }
  181. }
  182. /// Create FieldMeta and save it. Return the FieldTypeOptionData.
  183. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  184. pub(crate) async fn create_field_type_option_data_handler(
  185. data: AFPluginData<CreateFieldPayloadPB>,
  186. manager: AFPluginState<Arc<GridManager>>,
  187. ) -> DataResult<TypeOptionPB, FlowyError> {
  188. let params: CreateFieldParams = data.into_inner().try_into()?;
  189. let editor = manager.get_grid_editor(&params.grid_id).await?;
  190. let field_rev = editor
  191. .create_new_field_rev_with_type_option(&params.field_type, params.type_option_data)
  192. .await?;
  193. let field_type: FieldType = field_rev.ty.into();
  194. let type_option_data = get_type_option_data(&field_rev, &field_type).await?;
  195. data_result(TypeOptionPB {
  196. grid_id: params.grid_id,
  197. field: field_rev.into(),
  198. type_option_data,
  199. })
  200. }
  201. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  202. pub(crate) async fn move_field_handler(
  203. data: AFPluginData<MoveFieldPayloadPB>,
  204. manager: AFPluginState<Arc<GridManager>>,
  205. ) -> Result<(), FlowyError> {
  206. let params: MoveFieldParams = data.into_inner().try_into()?;
  207. let editor = manager.get_grid_editor(&params.grid_id).await?;
  208. let _ = editor.move_field(params).await?;
  209. Ok(())
  210. }
  211. /// The [FieldRevision] contains multiple data, each of them belongs to a specific FieldType.
  212. async fn get_type_option_data(field_rev: &FieldRevision, field_type: &FieldType) -> FlowyResult<Vec<u8>> {
  213. let s = field_rev.get_type_option_str(field_type).unwrap_or_else(|| {
  214. default_type_option_builder_from_type(field_type)
  215. .serializer()
  216. .json_str()
  217. });
  218. let field_type: FieldType = field_rev.ty.into();
  219. let builder = type_option_builder_from_json_str(&s, &field_type);
  220. let type_option_data = builder.serializer().protobuf_bytes().to_vec();
  221. Ok(type_option_data)
  222. }
  223. // #[tracing::instrument(level = "debug", skip(data, manager), err)]
  224. pub(crate) async fn get_row_handler(
  225. data: AFPluginData<RowIdPB>,
  226. manager: AFPluginState<Arc<GridManager>>,
  227. ) -> DataResult<OptionalRowPB, FlowyError> {
  228. let params: RowIdParams = data.into_inner().try_into()?;
  229. let editor = manager.get_grid_editor(&params.grid_id).await?;
  230. let row = editor.get_row_rev(&params.row_id).await?.map(make_row_from_row_rev);
  231. data_result(OptionalRowPB { row })
  232. }
  233. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  234. pub(crate) async fn delete_row_handler(
  235. data: AFPluginData<RowIdPB>,
  236. manager: AFPluginState<Arc<GridManager>>,
  237. ) -> Result<(), FlowyError> {
  238. let params: RowIdParams = data.into_inner().try_into()?;
  239. let editor = manager.get_grid_editor(&params.grid_id).await?;
  240. let _ = editor.delete_row(&params.row_id).await?;
  241. Ok(())
  242. }
  243. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  244. pub(crate) async fn duplicate_row_handler(
  245. data: AFPluginData<RowIdPB>,
  246. manager: AFPluginState<Arc<GridManager>>,
  247. ) -> Result<(), FlowyError> {
  248. let params: RowIdParams = data.into_inner().try_into()?;
  249. let editor = manager.get_grid_editor(&params.grid_id).await?;
  250. let _ = editor.duplicate_row(&params.row_id).await?;
  251. Ok(())
  252. }
  253. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  254. pub(crate) async fn move_row_handler(
  255. data: AFPluginData<MoveRowPayloadPB>,
  256. manager: AFPluginState<Arc<GridManager>>,
  257. ) -> Result<(), FlowyError> {
  258. let params: MoveRowParams = data.into_inner().try_into()?;
  259. let editor = manager.get_grid_editor(&params.view_id).await?;
  260. let _ = editor.move_row(params).await?;
  261. Ok(())
  262. }
  263. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  264. pub(crate) async fn create_table_row_handler(
  265. data: AFPluginData<CreateTableRowPayloadPB>,
  266. manager: AFPluginState<Arc<GridManager>>,
  267. ) -> DataResult<RowPB, FlowyError> {
  268. let params: CreateRowParams = data.into_inner().try_into()?;
  269. let editor = manager.get_grid_editor(params.grid_id.as_ref()).await?;
  270. let row = editor.create_row(params).await?;
  271. data_result(row)
  272. }
  273. #[tracing::instrument(level = "trace", skip_all, err)]
  274. pub(crate) async fn get_cell_handler(
  275. data: AFPluginData<CellPathPB>,
  276. manager: AFPluginState<Arc<GridManager>>,
  277. ) -> DataResult<CellPB, FlowyError> {
  278. let params: CellPathParams = data.into_inner().try_into()?;
  279. let editor = manager.get_grid_editor(&params.grid_id).await?;
  280. match editor.get_cell(&params).await {
  281. None => data_result(CellPB::empty(&params.field_id)),
  282. Some(cell) => data_result(cell),
  283. }
  284. }
  285. #[tracing::instrument(level = "trace", skip_all, err)]
  286. pub(crate) async fn update_cell_handler(
  287. data: AFPluginData<CellChangesetPB>,
  288. manager: AFPluginState<Arc<GridManager>>,
  289. ) -> Result<(), FlowyError> {
  290. let changeset: CellChangesetPB = data.into_inner();
  291. let editor = manager.get_grid_editor(&changeset.grid_id).await?;
  292. let _ = editor.update_cell_with_changeset(changeset).await?;
  293. Ok(())
  294. }
  295. #[tracing::instrument(level = "trace", skip_all, err)]
  296. pub(crate) async fn new_select_option_handler(
  297. data: AFPluginData<CreateSelectOptionPayloadPB>,
  298. manager: AFPluginState<Arc<GridManager>>,
  299. ) -> DataResult<SelectOptionPB, FlowyError> {
  300. let params: CreateSelectOptionParams = data.into_inner().try_into()?;
  301. let editor = manager.get_grid_editor(&params.grid_id).await?;
  302. match editor.get_field_rev(&params.field_id).await {
  303. None => Err(ErrorCode::InvalidData.into()),
  304. Some(field_rev) => {
  305. let type_option = select_type_option_from_field_rev(&field_rev)?;
  306. let select_option = type_option.create_option(&params.option_name);
  307. data_result(select_option)
  308. }
  309. }
  310. }
  311. #[tracing::instrument(level = "trace", skip_all, err)]
  312. pub(crate) async fn update_select_option_handler(
  313. data: AFPluginData<SelectOptionChangesetPB>,
  314. manager: AFPluginState<Arc<GridManager>>,
  315. ) -> Result<(), FlowyError> {
  316. let changeset: SelectOptionChangeset = data.into_inner().try_into()?;
  317. let editor = manager.get_grid_editor(&changeset.cell_identifier.grid_id).await?;
  318. let _ = editor
  319. .modify_field_rev(&changeset.cell_identifier.field_id, |field_rev| {
  320. let mut type_option = select_type_option_from_field_rev(field_rev)?;
  321. let mut cell_content_changeset = None;
  322. let mut is_changed = None;
  323. for option in changeset.insert_options {
  324. cell_content_changeset = Some(SelectOptionCellChangeset::from_insert_option_id(&option.id).to_str());
  325. type_option.insert_option(option);
  326. is_changed = Some(());
  327. }
  328. for option in changeset.update_options {
  329. type_option.insert_option(option);
  330. is_changed = Some(());
  331. }
  332. for option in changeset.delete_options {
  333. cell_content_changeset = Some(SelectOptionCellChangeset::from_delete_option_id(&option.id).to_str());
  334. type_option.delete_option(option);
  335. is_changed = Some(());
  336. }
  337. if is_changed.is_some() {
  338. field_rev.insert_type_option(&*type_option);
  339. }
  340. if let Some(cell_content_changeset) = cell_content_changeset {
  341. let changeset = CellChangesetPB {
  342. grid_id: changeset.cell_identifier.grid_id,
  343. row_id: changeset.cell_identifier.row_id,
  344. field_id: changeset.cell_identifier.field_id.clone(),
  345. content: cell_content_changeset,
  346. };
  347. let cloned_editor = editor.clone();
  348. tokio::spawn(async move {
  349. match cloned_editor.update_cell_with_changeset(changeset).await {
  350. Ok(_) => {}
  351. Err(e) => tracing::error!("{}", e),
  352. }
  353. });
  354. }
  355. Ok(is_changed)
  356. })
  357. .await?;
  358. Ok(())
  359. }
  360. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  361. pub(crate) async fn get_select_option_handler(
  362. data: AFPluginData<CellPathPB>,
  363. manager: AFPluginState<Arc<GridManager>>,
  364. ) -> DataResult<SelectOptionCellDataPB, FlowyError> {
  365. let params: CellPathParams = data.into_inner().try_into()?;
  366. let editor = manager.get_grid_editor(&params.grid_id).await?;
  367. match editor.get_field_rev(&params.field_id).await {
  368. None => {
  369. tracing::error!("Can't find the select option field with id: {}", params.field_id);
  370. data_result(SelectOptionCellDataPB::default())
  371. }
  372. Some(field_rev) => {
  373. //
  374. let cell_rev = editor.get_cell_rev(&params.row_id, &params.field_id).await?;
  375. let type_option = select_type_option_from_field_rev(&field_rev)?;
  376. let any_cell_data: TypeCellData = match cell_rev {
  377. None => TypeCellData {
  378. data: "".to_string(),
  379. field_type: field_rev.ty.into(),
  380. },
  381. Some(cell_rev) => cell_rev.try_into()?,
  382. };
  383. let selected_options = type_option.get_selected_options(any_cell_data.into());
  384. data_result(selected_options)
  385. }
  386. }
  387. }
  388. #[tracing::instrument(level = "trace", skip_all, err)]
  389. pub(crate) async fn update_select_option_cell_handler(
  390. data: AFPluginData<SelectOptionCellChangesetPB>,
  391. manager: AFPluginState<Arc<GridManager>>,
  392. ) -> Result<(), FlowyError> {
  393. let params: SelectOptionCellChangesetParams = data.into_inner().try_into()?;
  394. let editor = manager.get_grid_editor(&params.cell_identifier.grid_id).await?;
  395. let _ = editor.update_cell_with_changeset(params.into()).await?;
  396. Ok(())
  397. }
  398. #[tracing::instrument(level = "trace", skip_all, err)]
  399. pub(crate) async fn update_date_cell_handler(
  400. data: AFPluginData<DateChangesetPB>,
  401. manager: AFPluginState<Arc<GridManager>>,
  402. ) -> Result<(), FlowyError> {
  403. let data = data.into_inner();
  404. let cell_path: CellPathParams = data.cell_path.try_into()?;
  405. let content = DateCellChangeset {
  406. date: data.date,
  407. time: data.time,
  408. is_utc: data.is_utc,
  409. };
  410. let editor = manager.get_grid_editor(&cell_path.grid_id).await?;
  411. let _ = editor
  412. .update_cell(cell_path.grid_id, cell_path.row_id, cell_path.field_id, content)
  413. .await?;
  414. Ok(())
  415. }
  416. #[tracing::instrument(level = "trace", skip_all, err)]
  417. pub(crate) async fn get_groups_handler(
  418. data: AFPluginData<GridIdPB>,
  419. manager: AFPluginState<Arc<GridManager>>,
  420. ) -> DataResult<RepeatedGroupPB, FlowyError> {
  421. let params: GridIdPB = data.into_inner();
  422. let editor = manager.get_grid_editor(&params.value).await?;
  423. let group = editor.load_groups().await?;
  424. data_result(group)
  425. }
  426. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  427. pub(crate) async fn create_board_card_handler(
  428. data: AFPluginData<CreateBoardCardPayloadPB>,
  429. manager: AFPluginState<Arc<GridManager>>,
  430. ) -> DataResult<RowPB, FlowyError> {
  431. let params: CreateRowParams = data.into_inner().try_into()?;
  432. let editor = manager.get_grid_editor(params.grid_id.as_ref()).await?;
  433. let row = editor.create_row(params).await?;
  434. data_result(row)
  435. }
  436. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  437. pub(crate) async fn move_group_handler(
  438. data: AFPluginData<MoveGroupPayloadPB>,
  439. manager: AFPluginState<Arc<GridManager>>,
  440. ) -> FlowyResult<()> {
  441. let params: MoveGroupParams = data.into_inner().try_into()?;
  442. let editor = manager.get_grid_editor(params.view_id.as_ref()).await?;
  443. let _ = editor.move_group(params).await?;
  444. Ok(())
  445. }
  446. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  447. pub(crate) async fn move_group_row_handler(
  448. data: AFPluginData<MoveGroupRowPayloadPB>,
  449. manager: AFPluginState<Arc<GridManager>>,
  450. ) -> FlowyResult<()> {
  451. let params: MoveGroupRowParams = data.into_inner().try_into()?;
  452. let editor = manager.get_grid_editor(params.view_id.as_ref()).await?;
  453. let _ = editor.move_group_row(params).await?;
  454. Ok(())
  455. }