event_handler.rs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449
  1. use crate::entities::*;
  2. use crate::manager::GridManager;
  3. use crate::services::cell::AnyCellData;
  4. use crate::services::field::{
  5. default_type_option_builder_from_type, select_option_operation, type_option_builder_from_json_str,
  6. DateChangesetParams, DateChangesetPayloadPB, SelectOptionCellChangeset, SelectOptionCellChangesetParams,
  7. SelectOptionCellChangesetPayloadPB, SelectOptionCellDataPB, SelectOptionChangeset, SelectOptionChangesetPayloadPB,
  8. SelectOptionPB,
  9. };
  10. use crate::services::row::make_row_from_row_rev;
  11. use flowy_error::{ErrorCode, FlowyError, FlowyResult};
  12. use flowy_grid_data_model::revision::FieldRevision;
  13. use lib_dispatch::prelude::{data_result, AppData, Data, 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: Data<GridIdPB>,
  18. manager: AppData<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_data().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: Data<GridIdPB>,
  28. manager: AppData<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_grid_setting().await?;
  33. data_result(grid_setting)
  34. }
  35. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  36. pub(crate) async fn get_grid_blocks_handler(
  37. data: Data<QueryBlocksPayloadPB>,
  38. manager: AppData<Arc<GridManager>>,
  39. ) -> DataResult<RepeatedBlockPB, FlowyError> {
  40. let params: QueryGridBlocksParams = data.into_inner().try_into()?;
  41. let editor = manager.get_grid_editor(&params.grid_id)?;
  42. let repeated_grid_block = editor.get_blocks(Some(params.block_ids)).await?;
  43. data_result(repeated_grid_block)
  44. }
  45. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  46. pub(crate) async fn get_fields_handler(
  47. data: Data<QueryFieldPayloadPB>,
  48. manager: AppData<Arc<GridManager>>,
  49. ) -> DataResult<RepeatedFieldPB, FlowyError> {
  50. let params: QueryFieldParams = data.into_inner().try_into()?;
  51. let editor = manager.get_grid_editor(&params.grid_id)?;
  52. let field_orders = params
  53. .field_ids
  54. .items
  55. .into_iter()
  56. .map(|field_order| field_order.field_id)
  57. .collect();
  58. let field_revs = editor.get_field_revs(Some(field_orders)).await?;
  59. let repeated_field: RepeatedFieldPB = field_revs.into_iter().map(FieldPB::from).collect::<Vec<_>>().into();
  60. data_result(repeated_field)
  61. }
  62. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  63. pub(crate) async fn update_field_handler(
  64. data: Data<FieldChangesetPayloadPB>,
  65. manager: AppData<Arc<GridManager>>,
  66. ) -> Result<(), FlowyError> {
  67. let changeset: FieldChangesetParams = data.into_inner().try_into()?;
  68. let editor = manager.get_grid_editor(&changeset.grid_id)?;
  69. let _ = editor.update_field(changeset).await?;
  70. Ok(())
  71. }
  72. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  73. pub(crate) async fn insert_field_handler(
  74. data: Data<InsertFieldPayloadPB>,
  75. manager: AppData<Arc<GridManager>>,
  76. ) -> Result<(), FlowyError> {
  77. let params: InsertFieldParams = data.into_inner().try_into()?;
  78. let editor = manager.get_grid_editor(&params.grid_id)?;
  79. let _ = editor.insert_field(params).await?;
  80. Ok(())
  81. }
  82. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  83. pub(crate) async fn update_field_type_option_handler(
  84. data: Data<UpdateFieldTypeOptionPayloadPB>,
  85. manager: AppData<Arc<GridManager>>,
  86. ) -> Result<(), FlowyError> {
  87. let params: UpdateFieldTypeOptionParams = data.into_inner().try_into()?;
  88. let editor = manager.get_grid_editor(&params.grid_id)?;
  89. let _ = editor
  90. .update_field_type_option(&params.grid_id, &params.field_id, params.type_option_data)
  91. .await?;
  92. Ok(())
  93. }
  94. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  95. pub(crate) async fn delete_field_handler(
  96. data: Data<DeleteFieldPayloadPB>,
  97. manager: AppData<Arc<GridManager>>,
  98. ) -> Result<(), FlowyError> {
  99. let params: FieldIdParams = data.into_inner().try_into()?;
  100. let editor = manager.get_grid_editor(&params.grid_id)?;
  101. let _ = editor.delete_field(&params.field_id).await?;
  102. Ok(())
  103. }
  104. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  105. pub(crate) async fn switch_to_field_handler(
  106. data: Data<EditFieldPayloadPB>,
  107. manager: AppData<Arc<GridManager>>,
  108. ) -> DataResult<FieldTypeOptionDataPB, FlowyError> {
  109. let params: EditFieldParams = data.into_inner().try_into()?;
  110. let editor = manager.get_grid_editor(&params.grid_id)?;
  111. editor
  112. .switch_to_field_type(&params.field_id, &params.field_type)
  113. .await?;
  114. // Get the FieldMeta with field_id, if it doesn't exist, we create the default FieldMeta from the FieldType.
  115. let field_rev = editor
  116. .get_field_rev(&params.field_id)
  117. .await
  118. .unwrap_or(Arc::new(editor.next_field_rev(&params.field_type).await?));
  119. let type_option_data = get_type_option_data(&field_rev, &params.field_type).await?;
  120. let data = FieldTypeOptionDataPB {
  121. grid_id: params.grid_id,
  122. field: field_rev.into(),
  123. type_option_data,
  124. };
  125. data_result(data)
  126. }
  127. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  128. pub(crate) async fn duplicate_field_handler(
  129. data: Data<DuplicateFieldPayloadPB>,
  130. manager: AppData<Arc<GridManager>>,
  131. ) -> Result<(), FlowyError> {
  132. let params: FieldIdParams = data.into_inner().try_into()?;
  133. let editor = manager.get_grid_editor(&params.grid_id)?;
  134. let _ = editor.duplicate_field(&params.field_id).await?;
  135. Ok(())
  136. }
  137. /// Return the FieldTypeOptionData if the Field exists otherwise return record not found error.
  138. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  139. pub(crate) async fn get_field_type_option_data_handler(
  140. data: Data<FieldTypeOptionIdPB>,
  141. manager: AppData<Arc<GridManager>>,
  142. ) -> DataResult<FieldTypeOptionDataPB, FlowyError> {
  143. let params: FieldTypeOptionIdParams = data.into_inner().try_into()?;
  144. let editor = manager.get_grid_editor(&params.grid_id)?;
  145. match editor.get_field_rev(&params.field_id).await {
  146. None => Err(FlowyError::record_not_found()),
  147. Some(field_rev) => {
  148. let field_type = field_rev.ty.into();
  149. let type_option_data = get_type_option_data(&field_rev, &field_type).await?;
  150. let data = FieldTypeOptionDataPB {
  151. grid_id: params.grid_id,
  152. field: field_rev.into(),
  153. type_option_data,
  154. };
  155. data_result(data)
  156. }
  157. }
  158. }
  159. /// Create FieldMeta and save it. Return the FieldTypeOptionData.
  160. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  161. pub(crate) async fn create_field_type_option_data_handler(
  162. data: Data<CreateFieldPayloadPB>,
  163. manager: AppData<Arc<GridManager>>,
  164. ) -> DataResult<FieldTypeOptionDataPB, FlowyError> {
  165. let params: CreateFieldParams = data.into_inner().try_into()?;
  166. let editor = manager.get_grid_editor(&params.grid_id)?;
  167. let field_rev = editor.create_next_field_rev(&params.field_type).await?;
  168. let field_type: FieldType = field_rev.ty.into();
  169. let type_option_data = get_type_option_data(&field_rev, &field_type).await?;
  170. data_result(FieldTypeOptionDataPB {
  171. grid_id: params.grid_id,
  172. field: field_rev.into(),
  173. type_option_data,
  174. })
  175. }
  176. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  177. pub(crate) async fn move_field_handler(
  178. data: Data<MoveFieldPayloadPB>,
  179. manager: AppData<Arc<GridManager>>,
  180. ) -> Result<(), FlowyError> {
  181. let params: MoveFieldParams = data.into_inner().try_into()?;
  182. let editor = manager.get_grid_editor(&params.grid_id)?;
  183. let _ = editor.move_field(params).await?;
  184. Ok(())
  185. }
  186. /// The FieldMeta contains multiple data, each of them belongs to a specific FieldType.
  187. async fn get_type_option_data(field_rev: &FieldRevision, field_type: &FieldType) -> FlowyResult<Vec<u8>> {
  188. let s = field_rev
  189. .get_type_option_str(field_type)
  190. .unwrap_or_else(|| default_type_option_builder_from_type(field_type).entry().json_str());
  191. let field_type: FieldType = field_rev.ty.into();
  192. let builder = type_option_builder_from_json_str(&s, &field_type);
  193. let type_option_data = builder.entry().protobuf_bytes().to_vec();
  194. Ok(type_option_data)
  195. }
  196. // #[tracing::instrument(level = "debug", skip(data, manager), err)]
  197. pub(crate) async fn get_row_handler(
  198. data: Data<RowIdPB>,
  199. manager: AppData<Arc<GridManager>>,
  200. ) -> DataResult<OptionalRowPB, FlowyError> {
  201. let params: RowIdParams = data.into_inner().try_into()?;
  202. let editor = manager.get_grid_editor(&params.grid_id)?;
  203. let row = editor.get_row_rev(&params.row_id).await?.map(make_row_from_row_rev);
  204. data_result(OptionalRowPB { row })
  205. }
  206. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  207. pub(crate) async fn delete_row_handler(
  208. data: Data<RowIdPB>,
  209. manager: AppData<Arc<GridManager>>,
  210. ) -> Result<(), FlowyError> {
  211. let params: RowIdParams = data.into_inner().try_into()?;
  212. let editor = manager.get_grid_editor(&params.grid_id)?;
  213. let _ = editor.delete_row(&params.row_id).await?;
  214. Ok(())
  215. }
  216. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  217. pub(crate) async fn duplicate_row_handler(
  218. data: Data<RowIdPB>,
  219. manager: AppData<Arc<GridManager>>,
  220. ) -> Result<(), FlowyError> {
  221. let params: RowIdParams = data.into_inner().try_into()?;
  222. let editor = manager.get_grid_editor(&params.grid_id)?;
  223. let _ = editor.duplicate_row(&params.row_id).await?;
  224. Ok(())
  225. }
  226. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  227. pub(crate) async fn move_row_handler(
  228. data: Data<MoveRowPayloadPB>,
  229. manager: AppData<Arc<GridManager>>,
  230. ) -> Result<(), FlowyError> {
  231. let params: MoveRowParams = data.into_inner().try_into()?;
  232. let editor = manager.get_grid_editor(&params.view_id)?;
  233. let _ = editor.move_row(params).await?;
  234. Ok(())
  235. }
  236. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  237. pub(crate) async fn create_table_row_handler(
  238. data: Data<CreateTableRowPayloadPB>,
  239. manager: AppData<Arc<GridManager>>,
  240. ) -> DataResult<RowPB, FlowyError> {
  241. let params: CreateRowParams = data.into_inner().try_into()?;
  242. let editor = manager.get_grid_editor(params.grid_id.as_ref())?;
  243. let row = editor.create_row(params).await?;
  244. data_result(row)
  245. }
  246. #[tracing::instrument(level = "trace", skip_all, err)]
  247. pub(crate) async fn get_cell_handler(
  248. data: Data<GridCellIdPB>,
  249. manager: AppData<Arc<GridManager>>,
  250. ) -> DataResult<GridCellPB, FlowyError> {
  251. let params: GridCellIdParams = data.into_inner().try_into()?;
  252. let editor = manager.get_grid_editor(&params.grid_id)?;
  253. match editor.get_cell(&params).await {
  254. None => data_result(GridCellPB::empty(&params.field_id)),
  255. Some(cell) => data_result(cell),
  256. }
  257. }
  258. #[tracing::instrument(level = "trace", skip_all, err)]
  259. pub(crate) async fn update_cell_handler(
  260. data: Data<CellChangesetPB>,
  261. manager: AppData<Arc<GridManager>>,
  262. ) -> Result<(), FlowyError> {
  263. let changeset: CellChangesetPB = data.into_inner();
  264. let editor = manager.get_grid_editor(&changeset.grid_id)?;
  265. let _ = editor.update_cell(changeset).await?;
  266. Ok(())
  267. }
  268. #[tracing::instrument(level = "trace", skip_all, err)]
  269. pub(crate) async fn new_select_option_handler(
  270. data: Data<CreateSelectOptionPayloadPB>,
  271. manager: AppData<Arc<GridManager>>,
  272. ) -> DataResult<SelectOptionPB, FlowyError> {
  273. let params: CreateSelectOptionParams = data.into_inner().try_into()?;
  274. let editor = manager.get_grid_editor(&params.grid_id)?;
  275. match editor.get_field_rev(&params.field_id).await {
  276. None => Err(ErrorCode::InvalidData.into()),
  277. Some(field_rev) => {
  278. let type_option = select_option_operation(&field_rev)?;
  279. let select_option = type_option.create_option(&params.option_name);
  280. data_result(select_option)
  281. }
  282. }
  283. }
  284. #[tracing::instrument(level = "trace", skip_all, err)]
  285. pub(crate) async fn update_select_option_handler(
  286. data: Data<SelectOptionChangesetPayloadPB>,
  287. manager: AppData<Arc<GridManager>>,
  288. ) -> Result<(), FlowyError> {
  289. let changeset: SelectOptionChangeset = data.into_inner().try_into()?;
  290. let editor = manager.get_grid_editor(&changeset.cell_identifier.grid_id)?;
  291. if let Some(mut field_rev) = editor.get_field_rev(&changeset.cell_identifier.field_id).await {
  292. let mut_field_rev = Arc::make_mut(&mut field_rev);
  293. let mut type_option = select_option_operation(mut_field_rev)?;
  294. let mut cell_content_changeset = None;
  295. if let Some(option) = changeset.insert_option {
  296. cell_content_changeset = Some(SelectOptionCellChangeset::from_insert(&option.id).to_str());
  297. type_option.insert_option(option);
  298. }
  299. if let Some(option) = changeset.update_option {
  300. type_option.insert_option(option);
  301. }
  302. if let Some(option) = changeset.delete_option {
  303. cell_content_changeset = Some(SelectOptionCellChangeset::from_delete(&option.id).to_str());
  304. type_option.delete_option(option);
  305. }
  306. mut_field_rev.insert_type_option_entry(&*type_option);
  307. let _ = editor.replace_field(field_rev).await?;
  308. if let Some(cell_content_changeset) = cell_content_changeset {
  309. let changeset = CellChangesetPB {
  310. grid_id: changeset.cell_identifier.grid_id,
  311. row_id: changeset.cell_identifier.row_id,
  312. field_id: changeset.cell_identifier.field_id,
  313. content: cell_content_changeset,
  314. };
  315. let _ = editor.update_cell(changeset).await?;
  316. }
  317. }
  318. Ok(())
  319. }
  320. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  321. pub(crate) async fn get_select_option_handler(
  322. data: Data<GridCellIdPB>,
  323. manager: AppData<Arc<GridManager>>,
  324. ) -> DataResult<SelectOptionCellDataPB, FlowyError> {
  325. let params: GridCellIdParams = data.into_inner().try_into()?;
  326. let editor = manager.get_grid_editor(&params.grid_id)?;
  327. match editor.get_field_rev(&params.field_id).await {
  328. None => {
  329. tracing::error!("Can't find the select option field with id: {}", params.field_id);
  330. data_result(SelectOptionCellDataPB::default())
  331. }
  332. Some(field_rev) => {
  333. //
  334. let cell_rev = editor.get_cell_rev(&params.row_id, &params.field_id).await?;
  335. let type_option = select_option_operation(&field_rev)?;
  336. let any_cell_data: AnyCellData = match cell_rev {
  337. None => AnyCellData {
  338. data: "".to_string(),
  339. field_type: field_rev.ty.into(),
  340. },
  341. Some(cell_rev) => cell_rev.try_into()?,
  342. };
  343. let option_context = type_option.selected_select_option(any_cell_data.into());
  344. data_result(option_context)
  345. }
  346. }
  347. }
  348. #[tracing::instrument(level = "trace", skip_all, err)]
  349. pub(crate) async fn update_select_option_cell_handler(
  350. data: Data<SelectOptionCellChangesetPayloadPB>,
  351. manager: AppData<Arc<GridManager>>,
  352. ) -> Result<(), FlowyError> {
  353. let params: SelectOptionCellChangesetParams = data.into_inner().try_into()?;
  354. let editor = manager.get_grid_editor(&params.cell_identifier.grid_id)?;
  355. let _ = editor.update_cell(params.into()).await?;
  356. Ok(())
  357. }
  358. #[tracing::instrument(level = "trace", skip_all, err)]
  359. pub(crate) async fn update_date_cell_handler(
  360. data: Data<DateChangesetPayloadPB>,
  361. manager: AppData<Arc<GridManager>>,
  362. ) -> Result<(), FlowyError> {
  363. let params: DateChangesetParams = data.into_inner().try_into()?;
  364. let editor = manager.get_grid_editor(&params.cell_identifier.grid_id)?;
  365. let _ = editor.update_cell(params.into()).await?;
  366. Ok(())
  367. }
  368. #[tracing::instrument(level = "trace", skip_all, err)]
  369. pub(crate) async fn get_groups_handler(
  370. data: Data<GridIdPB>,
  371. manager: AppData<Arc<GridManager>>,
  372. ) -> DataResult<RepeatedGridGroupPB, FlowyError> {
  373. let params: GridIdPB = data.into_inner();
  374. let editor = manager.get_grid_editor(&params.value)?;
  375. let group = editor.load_groups().await?;
  376. data_result(group)
  377. }
  378. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  379. pub(crate) async fn create_board_card_handler(
  380. data: Data<CreateBoardCardPayloadPB>,
  381. manager: AppData<Arc<GridManager>>,
  382. ) -> DataResult<RowPB, FlowyError> {
  383. let params: CreateRowParams = data.into_inner().try_into()?;
  384. let editor = manager.get_grid_editor(params.grid_id.as_ref())?;
  385. let row = editor.create_row(params).await?;
  386. data_result(row)
  387. }
  388. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  389. pub(crate) async fn move_group_handler(
  390. data: Data<MoveGroupPayloadPB>,
  391. manager: AppData<Arc<GridManager>>,
  392. ) -> FlowyResult<()> {
  393. let params: MoveGroupParams = data.into_inner().try_into()?;
  394. let editor = manager.get_grid_editor(params.view_id.as_ref())?;
  395. let _ = editor.move_group(params).await?;
  396. Ok(())
  397. }
  398. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  399. pub(crate) async fn move_group_row_handler(
  400. data: Data<MoveGroupRowPayloadPB>,
  401. manager: AppData<Arc<GridManager>>,
  402. ) -> FlowyResult<()> {
  403. let params: MoveGroupRowParams = data.into_inner().try_into()?;
  404. let editor = manager.get_grid_editor(params.view_id.as_ref())?;
  405. let _ = editor.move_group_row(params).await?;
  406. Ok(())
  407. }