event_handler.rs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376
  1. use crate::entities::*;
  2. use crate::manager::GridManager;
  3. use crate::services::field::type_options::*;
  4. use crate::services::field::{default_type_option_builder_from_type, type_option_builder_from_json_str};
  5. use flowy_error::{ErrorCode, FlowyError, FlowyResult};
  6. use flowy_grid_data_model::entities::*;
  7. use flowy_grid_data_model::revision::FieldRevision;
  8. use lib_dispatch::prelude::{data_result, AppData, Data, DataResult};
  9. use std::sync::Arc;
  10. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  11. pub(crate) async fn get_grid_data_handler(
  12. data: Data<GridId>,
  13. manager: AppData<Arc<GridManager>>,
  14. ) -> DataResult<Grid, FlowyError> {
  15. let grid_id: GridId = data.into_inner();
  16. let editor = manager.open_grid(grid_id).await?;
  17. let grid = editor.get_grid_data().await?;
  18. data_result(grid)
  19. }
  20. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  21. pub(crate) async fn get_grid_setting_handler(
  22. data: Data<GridId>,
  23. manager: AppData<Arc<GridManager>>,
  24. ) -> DataResult<GridSetting, FlowyError> {
  25. let grid_id: GridId = data.into_inner();
  26. let editor = manager.open_grid(grid_id).await?;
  27. let grid_setting = editor.get_grid_setting().await?;
  28. data_result(grid_setting)
  29. }
  30. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  31. pub(crate) async fn get_grid_blocks_handler(
  32. data: Data<QueryGridBlocksPayload>,
  33. manager: AppData<Arc<GridManager>>,
  34. ) -> DataResult<RepeatedGridBlock, FlowyError> {
  35. let params: QueryGridBlocksParams = data.into_inner().try_into()?;
  36. let editor = manager.get_grid_editor(&params.grid_id)?;
  37. let block_ids = params
  38. .block_orders
  39. .into_iter()
  40. .map(|block| block.block_id)
  41. .collect::<Vec<String>>();
  42. let repeated_grid_block = editor.get_blocks(Some(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<QueryFieldPayload>,
  48. manager: AppData<Arc<GridManager>>,
  49. ) -> DataResult<RepeatedField, 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.field_orders.items;
  53. let field_revs = editor.get_field_revs(Some(field_orders)).await?;
  54. let repeated_field: RepeatedField = field_revs.into_iter().map(Field::from).collect::<Vec<_>>().into();
  55. data_result(repeated_field)
  56. }
  57. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  58. pub(crate) async fn update_field_handler(
  59. data: Data<FieldChangesetPayload>,
  60. manager: AppData<Arc<GridManager>>,
  61. ) -> Result<(), FlowyError> {
  62. let changeset: FieldChangesetParams = data.into_inner().try_into()?;
  63. let editor = manager.get_grid_editor(&changeset.grid_id)?;
  64. let _ = editor.update_field(changeset).await?;
  65. Ok(())
  66. }
  67. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  68. pub(crate) async fn insert_field_handler(
  69. data: Data<InsertFieldPayload>,
  70. manager: AppData<Arc<GridManager>>,
  71. ) -> Result<(), FlowyError> {
  72. let params: InsertFieldParams = data.into_inner().try_into()?;
  73. let editor = manager.get_grid_editor(&params.grid_id)?;
  74. let _ = editor.insert_field(params).await?;
  75. Ok(())
  76. }
  77. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  78. pub(crate) async fn update_field_type_option_handler(
  79. data: Data<UpdateFieldTypeOptionPayload>,
  80. manager: AppData<Arc<GridManager>>,
  81. ) -> Result<(), FlowyError> {
  82. let params: UpdateFieldTypeOptionParams = data.into_inner().try_into()?;
  83. let editor = manager.get_grid_editor(&params.grid_id)?;
  84. let _ = editor
  85. .update_field_type_option(&params.grid_id, &params.field_id, params.type_option_data)
  86. .await?;
  87. Ok(())
  88. }
  89. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  90. pub(crate) async fn delete_field_handler(
  91. data: Data<FieldIdentifierPayload>,
  92. manager: AppData<Arc<GridManager>>,
  93. ) -> Result<(), FlowyError> {
  94. let params: FieldIdentifier = data.into_inner().try_into()?;
  95. let editor = manager.get_grid_editor(&params.grid_id)?;
  96. let _ = editor.delete_field(&params.field_id).await?;
  97. Ok(())
  98. }
  99. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  100. pub(crate) async fn switch_to_field_handler(
  101. data: Data<EditFieldPayload>,
  102. manager: AppData<Arc<GridManager>>,
  103. ) -> DataResult<FieldTypeOptionData, FlowyError> {
  104. let params: EditFieldParams = data.into_inner().try_into()?;
  105. let editor = manager.get_grid_editor(&params.grid_id)?;
  106. editor
  107. .switch_to_field_type(&params.field_id, &params.field_type)
  108. .await?;
  109. // Get the FieldMeta with field_id, if it doesn't exist, we create the default FieldMeta from the FieldType.
  110. let field_rev = editor
  111. .get_field_rev(&params.field_id)
  112. .await
  113. .unwrap_or(editor.next_field_rev(&params.field_type).await?);
  114. let type_option_data = get_type_option_data(&field_rev, &params.field_type).await?;
  115. let data = FieldTypeOptionData {
  116. grid_id: params.grid_id,
  117. field: field_rev.into(),
  118. type_option_data,
  119. };
  120. data_result(data)
  121. }
  122. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  123. pub(crate) async fn duplicate_field_handler(
  124. data: Data<FieldIdentifierPayload>,
  125. manager: AppData<Arc<GridManager>>,
  126. ) -> Result<(), FlowyError> {
  127. let params: FieldIdentifier = data.into_inner().try_into()?;
  128. let editor = manager.get_grid_editor(&params.grid_id)?;
  129. let _ = editor.duplicate_field(&params.field_id).await?;
  130. Ok(())
  131. }
  132. /// Return the FieldTypeOptionData if the Field exists otherwise return record not found error.
  133. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  134. pub(crate) async fn get_field_type_option_data_handler(
  135. data: Data<EditFieldPayload>,
  136. manager: AppData<Arc<GridManager>>,
  137. ) -> DataResult<FieldTypeOptionData, FlowyError> {
  138. let params: EditFieldParams = data.into_inner().try_into()?;
  139. let editor = manager.get_grid_editor(&params.grid_id)?;
  140. match editor.get_field_rev(&params.field_id).await {
  141. None => Err(FlowyError::record_not_found()),
  142. Some(field_rev) => {
  143. let type_option_data = get_type_option_data(&field_rev, &field_rev.field_type).await?;
  144. let data = FieldTypeOptionData {
  145. grid_id: params.grid_id,
  146. field: field_rev.into(),
  147. type_option_data,
  148. };
  149. data_result(data)
  150. }
  151. }
  152. }
  153. /// Create FieldMeta and save it. Return the FieldTypeOptionData.
  154. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  155. pub(crate) async fn create_field_type_option_data_handler(
  156. data: Data<EditFieldPayload>,
  157. manager: AppData<Arc<GridManager>>,
  158. ) -> DataResult<FieldTypeOptionData, FlowyError> {
  159. let params: CreateFieldParams = data.into_inner().try_into()?;
  160. let editor = manager.get_grid_editor(&params.grid_id)?;
  161. let field_rev = editor.create_next_field_rev(&params.field_type).await?;
  162. let type_option_data = get_type_option_data(&field_rev, &field_rev.field_type).await?;
  163. data_result(FieldTypeOptionData {
  164. grid_id: params.grid_id,
  165. field: field_rev.into(),
  166. type_option_data,
  167. })
  168. }
  169. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  170. pub(crate) async fn move_item_handler(
  171. data: Data<MoveItemPayload>,
  172. manager: AppData<Arc<GridManager>>,
  173. ) -> Result<(), FlowyError> {
  174. let params: MoveItemParams = data.into_inner().try_into()?;
  175. let editor = manager.get_grid_editor(&params.grid_id)?;
  176. let _ = editor.move_item(params).await?;
  177. Ok(())
  178. }
  179. /// The FieldMeta contains multiple data, each of them belongs to a specific FieldType.
  180. async fn get_type_option_data(field_rev: &FieldRevision, field_type: &FieldType) -> FlowyResult<Vec<u8>> {
  181. let s = field_rev
  182. .get_type_option_str(field_type)
  183. .unwrap_or_else(|| default_type_option_builder_from_type(field_type).entry().json_str());
  184. let builder = type_option_builder_from_json_str(&s, &field_rev.field_type);
  185. let type_option_data = builder.entry().protobuf_bytes().to_vec();
  186. Ok(type_option_data)
  187. }
  188. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  189. pub(crate) async fn get_row_handler(
  190. data: Data<RowIdentifierPayload>,
  191. manager: AppData<Arc<GridManager>>,
  192. ) -> DataResult<Row, FlowyError> {
  193. let params: RowIdentifier = data.into_inner().try_into()?;
  194. let editor = manager.get_grid_editor(&params.grid_id)?;
  195. match editor.get_row(&params.row_id).await? {
  196. None => Err(FlowyError::record_not_found().context("Can not find the row")),
  197. Some(row) => data_result(row),
  198. }
  199. }
  200. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  201. pub(crate) async fn delete_row_handler(
  202. data: Data<RowIdentifierPayload>,
  203. manager: AppData<Arc<GridManager>>,
  204. ) -> Result<(), FlowyError> {
  205. let params: RowIdentifier = data.into_inner().try_into()?;
  206. let editor = manager.get_grid_editor(&params.grid_id)?;
  207. let _ = editor.delete_row(&params.row_id).await?;
  208. Ok(())
  209. }
  210. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  211. pub(crate) async fn duplicate_row_handler(
  212. data: Data<RowIdentifierPayload>,
  213. manager: AppData<Arc<GridManager>>,
  214. ) -> Result<(), FlowyError> {
  215. let params: RowIdentifier = data.into_inner().try_into()?;
  216. let editor = manager.get_grid_editor(&params.grid_id)?;
  217. let _ = editor.duplicate_row(&params.row_id).await?;
  218. Ok(())
  219. }
  220. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  221. pub(crate) async fn create_row_handler(
  222. data: Data<CreateRowPayload>,
  223. manager: AppData<Arc<GridManager>>,
  224. ) -> Result<(), FlowyError> {
  225. let params: CreateRowParams = data.into_inner().try_into()?;
  226. let editor = manager.get_grid_editor(params.grid_id.as_ref())?;
  227. let _ = editor.create_row(params.start_row_id).await?;
  228. Ok(())
  229. }
  230. // #[tracing::instrument(level = "debug", skip_all, err)]
  231. pub(crate) async fn get_cell_handler(
  232. data: Data<CellIdentifierPayload>,
  233. manager: AppData<Arc<GridManager>>,
  234. ) -> DataResult<Cell, FlowyError> {
  235. let params: CellIdentifier = data.into_inner().try_into()?;
  236. let editor = manager.get_grid_editor(&params.grid_id)?;
  237. match editor.get_cell(&params).await {
  238. None => data_result(Cell::empty(&params.field_id)),
  239. Some(cell) => data_result(cell),
  240. }
  241. }
  242. #[tracing::instrument(level = "trace", skip_all, err)]
  243. pub(crate) async fn update_cell_handler(
  244. data: Data<CellChangeset>,
  245. manager: AppData<Arc<GridManager>>,
  246. ) -> Result<(), FlowyError> {
  247. let changeset: CellChangeset = data.into_inner();
  248. let editor = manager.get_grid_editor(&changeset.grid_id)?;
  249. let _ = editor.update_cell(changeset).await?;
  250. Ok(())
  251. }
  252. #[tracing::instrument(level = "trace", skip_all, err)]
  253. pub(crate) async fn new_select_option_handler(
  254. data: Data<CreateSelectOptionPayload>,
  255. manager: AppData<Arc<GridManager>>,
  256. ) -> DataResult<SelectOption, FlowyError> {
  257. let params: CreateSelectOptionParams = data.into_inner().try_into()?;
  258. let editor = manager.get_grid_editor(&params.grid_id)?;
  259. match editor.get_field_rev(&params.field_id).await {
  260. None => Err(ErrorCode::InvalidData.into()),
  261. Some(field_rev) => {
  262. let type_option = select_option_operation(&field_rev)?;
  263. let select_option = type_option.create_option(&params.option_name);
  264. data_result(select_option)
  265. }
  266. }
  267. }
  268. #[tracing::instrument(level = "trace", skip_all, err)]
  269. pub(crate) async fn update_select_option_handler(
  270. data: Data<SelectOptionChangesetPayload>,
  271. manager: AppData<Arc<GridManager>>,
  272. ) -> Result<(), FlowyError> {
  273. let changeset: SelectOptionChangeset = data.into_inner().try_into()?;
  274. let editor = manager.get_grid_editor(&changeset.cell_identifier.grid_id)?;
  275. if let Some(mut field_rev) = editor.get_field_rev(&changeset.cell_identifier.field_id).await {
  276. let mut type_option = select_option_operation(&field_rev)?;
  277. let mut cell_content_changeset = None;
  278. if let Some(option) = changeset.insert_option {
  279. cell_content_changeset = Some(SelectOptionCellContentChangeset::from_insert(&option.id).to_str());
  280. type_option.insert_option(option);
  281. }
  282. if let Some(option) = changeset.update_option {
  283. type_option.insert_option(option);
  284. }
  285. if let Some(option) = changeset.delete_option {
  286. cell_content_changeset = Some(SelectOptionCellContentChangeset::from_delete(&option.id).to_str());
  287. type_option.delete_option(option);
  288. }
  289. field_rev.insert_type_option_entry(&*type_option);
  290. let _ = editor.replace_field(field_rev).await?;
  291. let changeset = CellChangeset {
  292. grid_id: changeset.cell_identifier.grid_id,
  293. row_id: changeset.cell_identifier.row_id,
  294. field_id: changeset.cell_identifier.field_id,
  295. cell_content_changeset,
  296. };
  297. let _ = editor.update_cell(changeset).await?;
  298. }
  299. Ok(())
  300. }
  301. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  302. pub(crate) async fn get_select_option_handler(
  303. data: Data<CellIdentifierPayload>,
  304. manager: AppData<Arc<GridManager>>,
  305. ) -> DataResult<SelectOptionCellData, FlowyError> {
  306. let params: CellIdentifier = data.into_inner().try_into()?;
  307. let editor = manager.get_grid_editor(&params.grid_id)?;
  308. match editor.get_field_rev(&params.field_id).await {
  309. None => {
  310. tracing::error!("Can't find the select option field with id: {}", params.field_id);
  311. data_result(SelectOptionCellData::default())
  312. }
  313. Some(field_rev) => {
  314. let cell_rev = editor.get_cell_rev(&params.row_id, &params.field_id).await?;
  315. let type_option = select_option_operation(&field_rev)?;
  316. let option_context = type_option.select_option_cell_data(&cell_rev);
  317. data_result(option_context)
  318. }
  319. }
  320. }
  321. #[tracing::instrument(level = "trace", skip_all, err)]
  322. pub(crate) async fn update_select_option_cell_handler(
  323. data: Data<SelectOptionCellChangesetPayload>,
  324. manager: AppData<Arc<GridManager>>,
  325. ) -> Result<(), FlowyError> {
  326. let params: SelectOptionCellChangesetParams = data.into_inner().try_into()?;
  327. let editor = manager.get_grid_editor(&params.cell_identifier.grid_id)?;
  328. let _ = editor.update_cell(params.into()).await?;
  329. Ok(())
  330. }
  331. #[tracing::instrument(level = "trace", skip_all, err)]
  332. pub(crate) async fn update_date_cell_handler(
  333. data: Data<DateChangesetPayload>,
  334. manager: AppData<Arc<GridManager>>,
  335. ) -> Result<(), FlowyError> {
  336. let params: DateChangesetParams = data.into_inner().try_into()?;
  337. let editor = manager.get_grid_editor(&params.cell_identifier.grid_id)?;
  338. let _ = editor.update_cell(params.into()).await?;
  339. Ok(())
  340. }