event_handler.rs 17 KB

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