event_handler.rs 19 KB

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