event_handler.rs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481
  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_type_option_from_field_rev, 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 = "trace", skip(data, manager), err)]
  36. pub(crate) async fn update_grid_setting_handler(
  37. data: Data<GridSettingChangesetPayloadPB>,
  38. manager: AppData<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(create_filter) = params.insert_filter {
  49. let _ = editor.create_filter(create_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 = "debug", skip(data, manager), err)]
  57. pub(crate) async fn get_grid_blocks_handler(
  58. data: Data<QueryBlocksPayloadPB>,
  59. manager: AppData<Arc<GridManager>>,
  60. ) -> DataResult<RepeatedBlockPB, FlowyError> {
  61. let params: QueryGridBlocksParams = data.into_inner().try_into()?;
  62. let editor = manager.get_grid_editor(&params.grid_id).await?;
  63. let repeated_grid_block = editor.get_blocks(Some(params.block_ids)).await?;
  64. data_result(repeated_grid_block)
  65. }
  66. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  67. pub(crate) async fn get_fields_handler(
  68. data: Data<QueryFieldPayloadPB>,
  69. manager: AppData<Arc<GridManager>>,
  70. ) -> DataResult<RepeatedFieldPB, FlowyError> {
  71. let params: QueryFieldParams = data.into_inner().try_into()?;
  72. let editor = manager.get_grid_editor(&params.grid_id).await?;
  73. let field_orders = params
  74. .field_ids
  75. .items
  76. .into_iter()
  77. .map(|field_order| field_order.field_id)
  78. .collect();
  79. let field_revs = editor.get_field_revs(Some(field_orders)).await?;
  80. let repeated_field: RepeatedFieldPB = field_revs.into_iter().map(FieldPB::from).collect::<Vec<_>>().into();
  81. data_result(repeated_field)
  82. }
  83. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  84. pub(crate) async fn update_field_handler(
  85. data: Data<FieldChangesetPayloadPB>,
  86. manager: AppData<Arc<GridManager>>,
  87. ) -> Result<(), FlowyError> {
  88. let changeset: FieldChangesetParams = data.into_inner().try_into()?;
  89. let editor = manager.get_grid_editor(&changeset.grid_id).await?;
  90. let _ = editor.update_field(changeset).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).await?;
  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).await?;
  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. ) -> Result<(), FlowyError> {
  120. let params: EditFieldParams = data.into_inner().try_into()?;
  121. let editor = manager.get_grid_editor(&params.grid_id).await?;
  122. editor
  123. .switch_to_field_type(&params.field_id, &params.field_type)
  124. .await?;
  125. // Get the field_rev with field_id, if it doesn't exist, we create the default FieldRevision 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. // Update the type-option data after the field type has been changed
  131. let type_option_data = get_type_option_data(&field_rev, &params.field_type).await?;
  132. let _ = editor
  133. .update_field_type_option(&params.grid_id, &field_rev.id, type_option_data)
  134. .await?;
  135. Ok(())
  136. }
  137. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  138. pub(crate) async fn duplicate_field_handler(
  139. data: Data<DuplicateFieldPayloadPB>,
  140. manager: AppData<Arc<GridManager>>,
  141. ) -> Result<(), FlowyError> {
  142. let params: FieldIdParams = data.into_inner().try_into()?;
  143. let editor = manager.get_grid_editor(&params.grid_id).await?;
  144. let _ = editor.duplicate_field(&params.field_id).await?;
  145. Ok(())
  146. }
  147. /// Return the FieldTypeOptionData if the Field exists otherwise return record not found error.
  148. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  149. pub(crate) async fn get_field_type_option_data_handler(
  150. data: Data<FieldTypeOptionIdPB>,
  151. manager: AppData<Arc<GridManager>>,
  152. ) -> DataResult<FieldTypeOptionDataPB, FlowyError> {
  153. let params: FieldTypeOptionIdParams = data.into_inner().try_into()?;
  154. let editor = manager.get_grid_editor(&params.grid_id).await?;
  155. match editor.get_field_rev(&params.field_id).await {
  156. None => Err(FlowyError::record_not_found()),
  157. Some(field_rev) => {
  158. let field_type = field_rev.ty.into();
  159. let type_option_data = get_type_option_data(&field_rev, &field_type).await?;
  160. let data = FieldTypeOptionDataPB {
  161. grid_id: params.grid_id,
  162. field: field_rev.into(),
  163. type_option_data,
  164. };
  165. data_result(data)
  166. }
  167. }
  168. }
  169. /// Create FieldMeta and save it. Return the FieldTypeOptionData.
  170. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  171. pub(crate) async fn create_field_type_option_data_handler(
  172. data: Data<CreateFieldPayloadPB>,
  173. manager: AppData<Arc<GridManager>>,
  174. ) -> DataResult<FieldTypeOptionDataPB, FlowyError> {
  175. let params: CreateFieldParams = data.into_inner().try_into()?;
  176. let editor = manager.get_grid_editor(&params.grid_id).await?;
  177. let field_rev = editor
  178. .create_new_field_rev(&params.field_type, params.type_option_data)
  179. .await?;
  180. let field_type: FieldType = field_rev.ty.into();
  181. let type_option_data = get_type_option_data(&field_rev, &field_type).await?;
  182. data_result(FieldTypeOptionDataPB {
  183. grid_id: params.grid_id,
  184. field: field_rev.into(),
  185. type_option_data,
  186. })
  187. }
  188. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  189. pub(crate) async fn move_field_handler(
  190. data: Data<MoveFieldPayloadPB>,
  191. manager: AppData<Arc<GridManager>>,
  192. ) -> Result<(), FlowyError> {
  193. let params: MoveFieldParams = data.into_inner().try_into()?;
  194. let editor = manager.get_grid_editor(&params.grid_id).await?;
  195. let _ = editor.move_field(params).await?;
  196. Ok(())
  197. }
  198. /// The [FieldRevision] contains multiple data, each of them belongs to a specific FieldType.
  199. async fn get_type_option_data(field_rev: &FieldRevision, field_type: &FieldType) -> FlowyResult<Vec<u8>> {
  200. let s = field_rev.get_type_option_str(field_type).unwrap_or_else(|| {
  201. default_type_option_builder_from_type(field_type)
  202. .serializer()
  203. .json_str()
  204. });
  205. let field_type: FieldType = field_rev.ty.into();
  206. let builder = type_option_builder_from_json_str(&s, &field_type);
  207. let type_option_data = builder.serializer().protobuf_bytes().to_vec();
  208. Ok(type_option_data)
  209. }
  210. // #[tracing::instrument(level = "debug", skip(data, manager), err)]
  211. pub(crate) async fn get_row_handler(
  212. data: Data<RowIdPB>,
  213. manager: AppData<Arc<GridManager>>,
  214. ) -> DataResult<OptionalRowPB, FlowyError> {
  215. let params: RowIdParams = data.into_inner().try_into()?;
  216. let editor = manager.get_grid_editor(&params.grid_id).await?;
  217. let row = editor.get_row_rev(&params.row_id).await?.map(make_row_from_row_rev);
  218. data_result(OptionalRowPB { row })
  219. }
  220. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  221. pub(crate) async fn delete_row_handler(
  222. data: Data<RowIdPB>,
  223. manager: AppData<Arc<GridManager>>,
  224. ) -> Result<(), FlowyError> {
  225. let params: RowIdParams = data.into_inner().try_into()?;
  226. let editor = manager.get_grid_editor(&params.grid_id).await?;
  227. let _ = editor.delete_row(&params.row_id).await?;
  228. Ok(())
  229. }
  230. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  231. pub(crate) async fn duplicate_row_handler(
  232. data: Data<RowIdPB>,
  233. manager: AppData<Arc<GridManager>>,
  234. ) -> Result<(), FlowyError> {
  235. let params: RowIdParams = data.into_inner().try_into()?;
  236. let editor = manager.get_grid_editor(&params.grid_id).await?;
  237. let _ = editor.duplicate_row(&params.row_id).await?;
  238. Ok(())
  239. }
  240. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  241. pub(crate) async fn move_row_handler(
  242. data: Data<MoveRowPayloadPB>,
  243. manager: AppData<Arc<GridManager>>,
  244. ) -> Result<(), FlowyError> {
  245. let params: MoveRowParams = data.into_inner().try_into()?;
  246. let editor = manager.get_grid_editor(&params.view_id).await?;
  247. let _ = editor.move_row(params).await?;
  248. Ok(())
  249. }
  250. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  251. pub(crate) async fn create_table_row_handler(
  252. data: Data<CreateTableRowPayloadPB>,
  253. manager: AppData<Arc<GridManager>>,
  254. ) -> DataResult<RowPB, FlowyError> {
  255. let params: CreateRowParams = data.into_inner().try_into()?;
  256. let editor = manager.get_grid_editor(params.grid_id.as_ref()).await?;
  257. let row = editor.create_row(params).await?;
  258. data_result(row)
  259. }
  260. #[tracing::instrument(level = "trace", skip_all, err)]
  261. pub(crate) async fn get_cell_handler(
  262. data: Data<GridCellIdPB>,
  263. manager: AppData<Arc<GridManager>>,
  264. ) -> DataResult<GridCellPB, FlowyError> {
  265. let params: GridCellIdParams = data.into_inner().try_into()?;
  266. let editor = manager.get_grid_editor(&params.grid_id).await?;
  267. match editor.get_cell(&params).await {
  268. None => data_result(GridCellPB::empty(&params.field_id)),
  269. Some(cell) => data_result(cell),
  270. }
  271. }
  272. #[tracing::instrument(level = "trace", skip_all, err)]
  273. pub(crate) async fn update_cell_handler(
  274. data: Data<CellChangesetPB>,
  275. manager: AppData<Arc<GridManager>>,
  276. ) -> Result<(), FlowyError> {
  277. let changeset: CellChangesetPB = data.into_inner();
  278. let editor = manager.get_grid_editor(&changeset.grid_id).await?;
  279. let _ = editor.update_cell(changeset).await?;
  280. Ok(())
  281. }
  282. #[tracing::instrument(level = "trace", skip_all, err)]
  283. pub(crate) async fn new_select_option_handler(
  284. data: Data<CreateSelectOptionPayloadPB>,
  285. manager: AppData<Arc<GridManager>>,
  286. ) -> DataResult<SelectOptionPB, FlowyError> {
  287. let params: CreateSelectOptionParams = data.into_inner().try_into()?;
  288. let editor = manager.get_grid_editor(&params.grid_id).await?;
  289. match editor.get_field_rev(&params.field_id).await {
  290. None => Err(ErrorCode::InvalidData.into()),
  291. Some(field_rev) => {
  292. let type_option = select_type_option_from_field_rev(&field_rev)?;
  293. let select_option = type_option.create_option(&params.option_name);
  294. data_result(select_option)
  295. }
  296. }
  297. }
  298. #[tracing::instrument(level = "trace", skip_all, err)]
  299. pub(crate) async fn update_select_option_handler(
  300. data: Data<SelectOptionChangesetPayloadPB>,
  301. manager: AppData<Arc<GridManager>>,
  302. ) -> Result<(), FlowyError> {
  303. let changeset: SelectOptionChangeset = data.into_inner().try_into()?;
  304. let editor = manager.get_grid_editor(&changeset.cell_identifier.grid_id).await?;
  305. let _ = editor
  306. .modify_field_rev(&changeset.cell_identifier.field_id, |field_rev| {
  307. let mut type_option = select_type_option_from_field_rev(field_rev)?;
  308. let mut cell_content_changeset = None;
  309. let mut is_changed = None;
  310. for option in changeset.insert_options {
  311. cell_content_changeset = Some(SelectOptionCellChangeset::from_insert_option_id(&option.id).to_str());
  312. type_option.insert_option(option);
  313. is_changed = Some(());
  314. }
  315. for option in changeset.update_options {
  316. type_option.insert_option(option);
  317. is_changed = Some(());
  318. }
  319. for option in changeset.delete_options {
  320. cell_content_changeset = Some(SelectOptionCellChangeset::from_delete_option_id(&option.id).to_str());
  321. type_option.delete_option(option);
  322. is_changed = Some(());
  323. }
  324. if is_changed.is_some() {
  325. field_rev.insert_type_option(&*type_option);
  326. }
  327. if let Some(cell_content_changeset) = cell_content_changeset {
  328. let changeset = CellChangesetPB {
  329. grid_id: changeset.cell_identifier.grid_id,
  330. row_id: changeset.cell_identifier.row_id,
  331. field_id: changeset.cell_identifier.field_id.clone(),
  332. content: cell_content_changeset,
  333. };
  334. let cloned_editor = editor.clone();
  335. tokio::spawn(async move {
  336. match cloned_editor.update_cell(changeset).await {
  337. Ok(_) => {}
  338. Err(e) => tracing::error!("{}", e),
  339. }
  340. });
  341. }
  342. Ok(is_changed)
  343. })
  344. .await?;
  345. Ok(())
  346. }
  347. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  348. pub(crate) async fn get_select_option_handler(
  349. data: Data<GridCellIdPB>,
  350. manager: AppData<Arc<GridManager>>,
  351. ) -> DataResult<SelectOptionCellDataPB, FlowyError> {
  352. let params: GridCellIdParams = data.into_inner().try_into()?;
  353. let editor = manager.get_grid_editor(&params.grid_id).await?;
  354. match editor.get_field_rev(&params.field_id).await {
  355. None => {
  356. tracing::error!("Can't find the select option field with id: {}", params.field_id);
  357. data_result(SelectOptionCellDataPB::default())
  358. }
  359. Some(field_rev) => {
  360. //
  361. let cell_rev = editor.get_cell_rev(&params.row_id, &params.field_id).await?;
  362. let type_option = select_type_option_from_field_rev(&field_rev)?;
  363. let any_cell_data: AnyCellData = match cell_rev {
  364. None => AnyCellData {
  365. data: "".to_string(),
  366. field_type: field_rev.ty.into(),
  367. },
  368. Some(cell_rev) => cell_rev.try_into()?,
  369. };
  370. let selected_options = type_option.get_selected_options(any_cell_data.into());
  371. data_result(selected_options)
  372. }
  373. }
  374. }
  375. #[tracing::instrument(level = "trace", skip_all, err)]
  376. pub(crate) async fn update_select_option_cell_handler(
  377. data: Data<SelectOptionCellChangesetPayloadPB>,
  378. manager: AppData<Arc<GridManager>>,
  379. ) -> Result<(), FlowyError> {
  380. let params: SelectOptionCellChangesetParams = data.into_inner().try_into()?;
  381. let editor = manager.get_grid_editor(&params.cell_identifier.grid_id).await?;
  382. let _ = editor.update_cell(params.into()).await?;
  383. Ok(())
  384. }
  385. #[tracing::instrument(level = "trace", skip_all, err)]
  386. pub(crate) async fn update_date_cell_handler(
  387. data: Data<DateChangesetPayloadPB>,
  388. manager: AppData<Arc<GridManager>>,
  389. ) -> Result<(), FlowyError> {
  390. let params: DateChangesetParams = data.into_inner().try_into()?;
  391. let editor = manager.get_grid_editor(&params.cell_identifier.grid_id).await?;
  392. let _ = editor.update_cell(params.into()).await?;
  393. Ok(())
  394. }
  395. #[tracing::instrument(level = "trace", skip_all, err)]
  396. pub(crate) async fn get_groups_handler(
  397. data: Data<GridIdPB>,
  398. manager: AppData<Arc<GridManager>>,
  399. ) -> DataResult<RepeatedGridGroupPB, FlowyError> {
  400. let params: GridIdPB = data.into_inner();
  401. let editor = manager.get_grid_editor(&params.value).await?;
  402. let group = editor.load_groups().await?;
  403. data_result(group)
  404. }
  405. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  406. pub(crate) async fn create_board_card_handler(
  407. data: Data<CreateBoardCardPayloadPB>,
  408. manager: AppData<Arc<GridManager>>,
  409. ) -> DataResult<RowPB, FlowyError> {
  410. let params: CreateRowParams = data.into_inner().try_into()?;
  411. let editor = manager.get_grid_editor(params.grid_id.as_ref()).await?;
  412. let row = editor.create_row(params).await?;
  413. data_result(row)
  414. }
  415. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  416. pub(crate) async fn move_group_handler(
  417. data: Data<MoveGroupPayloadPB>,
  418. manager: AppData<Arc<GridManager>>,
  419. ) -> FlowyResult<()> {
  420. let params: MoveGroupParams = data.into_inner().try_into()?;
  421. let editor = manager.get_grid_editor(params.view_id.as_ref()).await?;
  422. let _ = editor.move_group(params).await?;
  423. Ok(())
  424. }
  425. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  426. pub(crate) async fn move_group_row_handler(
  427. data: Data<MoveGroupRowPayloadPB>,
  428. manager: AppData<Arc<GridManager>>,
  429. ) -> FlowyResult<()> {
  430. let params: MoveGroupRowParams = data.into_inner().try_into()?;
  431. let editor = manager.get_grid_editor(params.view_id.as_ref()).await?;
  432. let _ = editor.move_group_row(params).await?;
  433. Ok(())
  434. }