event_handler.rs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402
  1. use crate::entities::*;
  2. use crate::manager::GridManager;
  3. use crate::services::cell::AnyCellData;
  4. use crate::services::field::select_option::*;
  5. use crate::services::field::{
  6. default_type_option_builder_from_type, type_option_builder_from_json_str, DateChangesetParams, DateChangesetPayload,
  7. };
  8. use flowy_error::{ErrorCode, FlowyError, FlowyResult};
  9. use flowy_grid_data_model::revision::FieldRevision;
  10. use flowy_sync::entities::grid::{FieldChangesetParams, GridSettingChangesetParams};
  11. use lib_dispatch::prelude::{data_result, AppData, Data, DataResult};
  12. use std::sync::Arc;
  13. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  14. pub(crate) async fn get_grid_handler(
  15. data: Data<GridId>,
  16. manager: AppData<Arc<GridManager>>,
  17. ) -> DataResult<Grid, FlowyError> {
  18. let grid_id: GridId = data.into_inner();
  19. let editor = manager.open_grid(grid_id).await?;
  20. let grid = editor.get_grid_data().await?;
  21. data_result(grid)
  22. }
  23. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  24. pub(crate) async fn get_grid_setting_handler(
  25. data: Data<GridId>,
  26. manager: AppData<Arc<GridManager>>,
  27. ) -> DataResult<GridSetting, FlowyError> {
  28. let grid_id: GridId = data.into_inner();
  29. let editor = manager.open_grid(grid_id).await?;
  30. let grid_setting = editor.get_grid_setting().await?;
  31. data_result(grid_setting)
  32. }
  33. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  34. pub(crate) async fn update_grid_setting_handler(
  35. data: Data<GridSettingChangesetPayload>,
  36. manager: AppData<Arc<GridManager>>,
  37. ) -> Result<(), FlowyError> {
  38. let params: GridSettingChangesetParams = data.into_inner().try_into()?;
  39. let editor = manager.open_grid(&params.grid_id).await?;
  40. let _ = editor.update_grid_setting(params).await?;
  41. Ok(())
  42. }
  43. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  44. pub(crate) async fn get_grid_blocks_handler(
  45. data: Data<QueryGridBlocksPayload>,
  46. manager: AppData<Arc<GridManager>>,
  47. ) -> DataResult<RepeatedGridBlock, FlowyError> {
  48. let params: QueryGridBlocksParams = data.into_inner().try_into()?;
  49. let editor = manager.get_grid_editor(&params.grid_id)?;
  50. let repeated_grid_block = editor.get_blocks(Some(params.block_ids)).await?;
  51. data_result(repeated_grid_block)
  52. }
  53. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  54. pub(crate) async fn get_fields_handler(
  55. data: Data<QueryFieldPayload>,
  56. manager: AppData<Arc<GridManager>>,
  57. ) -> DataResult<RepeatedField, FlowyError> {
  58. let params: QueryFieldParams = data.into_inner().try_into()?;
  59. let editor = manager.get_grid_editor(&params.grid_id)?;
  60. let field_orders = params
  61. .field_orders
  62. .items
  63. .into_iter()
  64. .map(|field_order| field_order.field_id)
  65. .collect();
  66. let field_revs = editor.get_field_revs(Some(field_orders)).await?;
  67. let repeated_field: RepeatedField = field_revs.into_iter().map(Field::from).collect::<Vec<_>>().into();
  68. data_result(repeated_field)
  69. }
  70. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  71. pub(crate) async fn update_field_handler(
  72. data: Data<FieldChangesetPayload>,
  73. manager: AppData<Arc<GridManager>>,
  74. ) -> Result<(), FlowyError> {
  75. let changeset: FieldChangesetParams = data.into_inner().try_into()?;
  76. let editor = manager.get_grid_editor(&changeset.grid_id)?;
  77. let _ = editor.update_field(changeset).await?;
  78. Ok(())
  79. }
  80. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  81. pub(crate) async fn insert_field_handler(
  82. data: Data<InsertFieldPayload>,
  83. manager: AppData<Arc<GridManager>>,
  84. ) -> Result<(), FlowyError> {
  85. let params: InsertFieldParams = data.into_inner().try_into()?;
  86. let editor = manager.get_grid_editor(&params.grid_id)?;
  87. let _ = editor.insert_field(params).await?;
  88. Ok(())
  89. }
  90. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  91. pub(crate) async fn update_field_type_option_handler(
  92. data: Data<UpdateFieldTypeOptionPayload>,
  93. manager: AppData<Arc<GridManager>>,
  94. ) -> Result<(), FlowyError> {
  95. let params: UpdateFieldTypeOptionParams = data.into_inner().try_into()?;
  96. let editor = manager.get_grid_editor(&params.grid_id)?;
  97. let _ = editor
  98. .update_field_type_option(&params.grid_id, &params.field_id, params.type_option_data)
  99. .await?;
  100. Ok(())
  101. }
  102. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  103. pub(crate) async fn delete_field_handler(
  104. data: Data<FieldIdentifierPayload>,
  105. manager: AppData<Arc<GridManager>>,
  106. ) -> Result<(), FlowyError> {
  107. let params: FieldIdentifier = data.into_inner().try_into()?;
  108. let editor = manager.get_grid_editor(&params.grid_id)?;
  109. let _ = editor.delete_field(&params.field_id).await?;
  110. Ok(())
  111. }
  112. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  113. pub(crate) async fn switch_to_field_handler(
  114. data: Data<EditFieldPayload>,
  115. manager: AppData<Arc<GridManager>>,
  116. ) -> DataResult<FieldTypeOptionData, FlowyError> {
  117. let params: EditFieldParams = data.into_inner().try_into()?;
  118. let editor = manager.get_grid_editor(&params.grid_id)?;
  119. editor
  120. .switch_to_field_type(&params.field_id, &params.field_type)
  121. .await?;
  122. // Get the FieldMeta with field_id, if it doesn't exist, we create the default FieldMeta from the FieldType.
  123. let field_rev = editor
  124. .get_field_rev(&params.field_id)
  125. .await
  126. .unwrap_or(Arc::new(editor.next_field_rev(&params.field_type).await?));
  127. let type_option_data = get_type_option_data(&field_rev, &params.field_type).await?;
  128. let data = FieldTypeOptionData {
  129. grid_id: params.grid_id,
  130. field: field_rev.into(),
  131. type_option_data,
  132. };
  133. data_result(data)
  134. }
  135. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  136. pub(crate) async fn duplicate_field_handler(
  137. data: Data<FieldIdentifierPayload>,
  138. manager: AppData<Arc<GridManager>>,
  139. ) -> Result<(), FlowyError> {
  140. let params: FieldIdentifier = data.into_inner().try_into()?;
  141. let editor = manager.get_grid_editor(&params.grid_id)?;
  142. let _ = editor.duplicate_field(&params.field_id).await?;
  143. Ok(())
  144. }
  145. /// Return the FieldTypeOptionData if the Field exists otherwise return record not found error.
  146. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  147. pub(crate) async fn get_field_type_option_data_handler(
  148. data: Data<EditFieldPayload>,
  149. manager: AppData<Arc<GridManager>>,
  150. ) -> DataResult<FieldTypeOptionData, FlowyError> {
  151. let params: EditFieldParams = data.into_inner().try_into()?;
  152. let editor = manager.get_grid_editor(&params.grid_id)?;
  153. match editor.get_field_rev(&params.field_id).await {
  154. None => Err(FlowyError::record_not_found()),
  155. Some(field_rev) => {
  156. let field_type = field_rev.field_type_rev.into();
  157. let type_option_data = get_type_option_data(&field_rev, &field_type).await?;
  158. let data = FieldTypeOptionData {
  159. grid_id: params.grid_id,
  160. field: field_rev.into(),
  161. type_option_data,
  162. };
  163. data_result(data)
  164. }
  165. }
  166. }
  167. /// Create FieldMeta and save it. Return the FieldTypeOptionData.
  168. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  169. pub(crate) async fn create_field_type_option_data_handler(
  170. data: Data<EditFieldPayload>,
  171. manager: AppData<Arc<GridManager>>,
  172. ) -> DataResult<FieldTypeOptionData, FlowyError> {
  173. let params: CreateFieldParams = data.into_inner().try_into()?;
  174. let editor = manager.get_grid_editor(&params.grid_id)?;
  175. let field_rev = editor.create_next_field_rev(&params.field_type).await?;
  176. let field_type: FieldType = field_rev.field_type_rev.into();
  177. let type_option_data = get_type_option_data(&field_rev, &field_type).await?;
  178. data_result(FieldTypeOptionData {
  179. grid_id: params.grid_id,
  180. field: field_rev.into(),
  181. type_option_data,
  182. })
  183. }
  184. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  185. pub(crate) async fn move_item_handler(
  186. data: Data<MoveItemPayload>,
  187. manager: AppData<Arc<GridManager>>,
  188. ) -> Result<(), FlowyError> {
  189. let params: MoveItemParams = data.into_inner().try_into()?;
  190. let editor = manager.get_grid_editor(&params.grid_id)?;
  191. let _ = editor.move_item(params).await?;
  192. Ok(())
  193. }
  194. /// The FieldMeta contains multiple data, each of them belongs to a specific FieldType.
  195. async fn get_type_option_data(field_rev: &FieldRevision, field_type: &FieldType) -> FlowyResult<Vec<u8>> {
  196. let s = field_rev
  197. .get_type_option_str(field_type)
  198. .unwrap_or_else(|| default_type_option_builder_from_type(field_type).entry().json_str());
  199. let field_type: FieldType = field_rev.field_type_rev.into();
  200. let builder = type_option_builder_from_json_str(&s, &field_type);
  201. let type_option_data = builder.entry().protobuf_bytes().to_vec();
  202. Ok(type_option_data)
  203. }
  204. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  205. pub(crate) async fn get_row_handler(
  206. data: Data<GridRowIdPayload>,
  207. manager: AppData<Arc<GridManager>>,
  208. ) -> DataResult<OptionalRow, FlowyError> {
  209. let params: GridRowId = data.into_inner().try_into()?;
  210. let editor = manager.get_grid_editor(&params.grid_id)?;
  211. let row = OptionalRow {
  212. row: editor.get_row(&params.row_id).await?,
  213. };
  214. data_result(row)
  215. }
  216. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  217. pub(crate) async fn delete_row_handler(
  218. data: Data<GridRowIdPayload>,
  219. manager: AppData<Arc<GridManager>>,
  220. ) -> Result<(), FlowyError> {
  221. let params: GridRowId = data.into_inner().try_into()?;
  222. let editor = manager.get_grid_editor(&params.grid_id)?;
  223. let _ = editor.delete_row(&params.row_id).await?;
  224. Ok(())
  225. }
  226. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  227. pub(crate) async fn duplicate_row_handler(
  228. data: Data<GridRowIdPayload>,
  229. manager: AppData<Arc<GridManager>>,
  230. ) -> Result<(), FlowyError> {
  231. let params: GridRowId = data.into_inner().try_into()?;
  232. let editor = manager.get_grid_editor(&params.grid_id)?;
  233. let _ = editor.duplicate_row(&params.row_id).await?;
  234. Ok(())
  235. }
  236. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  237. pub(crate) async fn create_row_handler(
  238. data: Data<CreateRowPayload>,
  239. manager: AppData<Arc<GridManager>>,
  240. ) -> Result<(), FlowyError> {
  241. let params: CreateRowParams = data.into_inner().try_into()?;
  242. let editor = manager.get_grid_editor(params.grid_id.as_ref())?;
  243. let _ = editor.create_row(params.start_row_id).await?;
  244. Ok(())
  245. }
  246. // #[tracing::instrument(level = "debug", skip_all, err)]
  247. pub(crate) async fn get_cell_handler(
  248. data: Data<CellIdentifierPayload>,
  249. manager: AppData<Arc<GridManager>>,
  250. ) -> DataResult<Cell, FlowyError> {
  251. let params: CellIdentifier = 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(Cell::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<CellChangeset>,
  261. manager: AppData<Arc<GridManager>>,
  262. ) -> Result<(), FlowyError> {
  263. let changeset: CellChangeset = 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<CreateSelectOptionPayload>,
  271. manager: AppData<Arc<GridManager>>,
  272. ) -> DataResult<SelectOption, 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<SelectOptionChangesetPayload>,
  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. let changeset = CellChangeset {
  309. grid_id: changeset.cell_identifier.grid_id,
  310. row_id: changeset.cell_identifier.row_id,
  311. field_id: changeset.cell_identifier.field_id,
  312. content: cell_content_changeset,
  313. };
  314. let _ = editor.update_cell(changeset).await?;
  315. }
  316. Ok(())
  317. }
  318. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  319. pub(crate) async fn get_select_option_handler(
  320. data: Data<CellIdentifierPayload>,
  321. manager: AppData<Arc<GridManager>>,
  322. ) -> DataResult<SelectOptionCellData, FlowyError> {
  323. let params: CellIdentifier = data.into_inner().try_into()?;
  324. let editor = manager.get_grid_editor(&params.grid_id)?;
  325. match editor.get_field_rev(&params.field_id).await {
  326. None => {
  327. tracing::error!("Can't find the select option field with id: {}", params.field_id);
  328. data_result(SelectOptionCellData::default())
  329. }
  330. Some(field_rev) => {
  331. //
  332. let cell_rev = editor.get_cell_rev(&params.row_id, &params.field_id).await?;
  333. let type_option = select_option_operation(&field_rev)?;
  334. let any_cell_data: AnyCellData = match cell_rev {
  335. None => AnyCellData {
  336. data: "".to_string(),
  337. field_type: field_rev.field_type_rev.into(),
  338. },
  339. Some(cell_rev) => cell_rev.try_into()?,
  340. };
  341. let option_context = type_option.selected_select_option(any_cell_data);
  342. data_result(option_context)
  343. }
  344. }
  345. }
  346. #[tracing::instrument(level = "trace", skip_all, err)]
  347. pub(crate) async fn update_select_option_cell_handler(
  348. data: Data<SelectOptionCellChangesetPayload>,
  349. manager: AppData<Arc<GridManager>>,
  350. ) -> Result<(), FlowyError> {
  351. let params: SelectOptionCellChangesetParams = data.into_inner().try_into()?;
  352. let editor = manager.get_grid_editor(&params.cell_identifier.grid_id)?;
  353. let _ = editor.update_cell(params.into()).await?;
  354. Ok(())
  355. }
  356. #[tracing::instrument(level = "trace", skip_all, err)]
  357. pub(crate) async fn update_date_cell_handler(
  358. data: Data<DateChangesetPayload>,
  359. manager: AppData<Arc<GridManager>>,
  360. ) -> Result<(), FlowyError> {
  361. let params: DateChangesetParams = data.into_inner().try_into()?;
  362. let editor = manager.get_grid_editor(&params.cell_identifier.grid_id)?;
  363. let _ = editor.update_cell(params.into()).await?;
  364. Ok(())
  365. }