event_handler.rs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396
  1. use crate::manager::GridManager;
  2. use crate::services::entities::*;
  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 crate::services::grid_editor::ClientGridEditor;
  6. use flowy_error::{ErrorCode, FlowyError, FlowyResult};
  7. use flowy_grid_data_model::entities::*;
  8. use lib_dispatch::prelude::{data_result, AppData, Data, DataResult};
  9. use std::sync::Arc;
  10. #[tracing::instrument(level = "debug", 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.grid_data().await?;
  18. data_result(grid)
  19. }
  20. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  21. pub(crate) async fn get_grid_blocks_handler(
  22. data: Data<QueryGridBlocksPayload>,
  23. manager: AppData<Arc<GridManager>>,
  24. ) -> DataResult<RepeatedGridBlock, FlowyError> {
  25. let params: QueryGridBlocksParams = data.into_inner().try_into()?;
  26. let editor = manager.get_grid_editor(&params.grid_id)?;
  27. let block_ids = params
  28. .block_orders
  29. .into_iter()
  30. .map(|block| block.block_id)
  31. .collect::<Vec<String>>();
  32. let repeated_grid_block = editor.get_blocks(Some(block_ids)).await?;
  33. data_result(repeated_grid_block)
  34. }
  35. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  36. pub(crate) async fn get_fields_handler(
  37. data: Data<QueryFieldPayload>,
  38. manager: AppData<Arc<GridManager>>,
  39. ) -> DataResult<RepeatedField, FlowyError> {
  40. let params: QueryFieldParams = data.into_inner().try_into()?;
  41. let editor = manager.get_grid_editor(&params.grid_id)?;
  42. let field_orders = params.field_orders.items;
  43. let field_metas = editor.get_field_metas(Some(field_orders)).await?;
  44. let repeated_field: RepeatedField = field_metas.into_iter().map(Field::from).collect::<Vec<_>>().into();
  45. data_result(repeated_field)
  46. }
  47. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  48. pub(crate) async fn update_field_handler(
  49. data: Data<FieldChangesetPayload>,
  50. manager: AppData<Arc<GridManager>>,
  51. ) -> Result<(), FlowyError> {
  52. let changeset: FieldChangesetParams = data.into_inner().try_into()?;
  53. let editor = manager.get_grid_editor(&changeset.grid_id)?;
  54. let _ = editor.update_field(changeset).await?;
  55. Ok(())
  56. }
  57. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  58. pub(crate) async fn insert_field_handler(
  59. data: Data<InsertFieldPayload>,
  60. manager: AppData<Arc<GridManager>>,
  61. ) -> Result<(), FlowyError> {
  62. let params: InsertFieldParams = data.into_inner().try_into()?;
  63. let editor = manager.get_grid_editor(&params.grid_id)?;
  64. let _ = editor.insert_field(params).await?;
  65. Ok(())
  66. }
  67. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  68. pub(crate) async fn update_field_type_option_handler(
  69. data: Data<UpdateFieldTypeOptionPayload>,
  70. manager: AppData<Arc<GridManager>>,
  71. ) -> Result<(), FlowyError> {
  72. let params: UpdateFieldTypeOptionParams = data.into_inner().try_into()?;
  73. let editor = manager.get_grid_editor(&params.grid_id)?;
  74. let _ = editor
  75. .update_field_type_option(&params.grid_id, &params.field_id, params.type_option_data)
  76. .await?;
  77. Ok(())
  78. }
  79. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  80. pub(crate) async fn delete_field_handler(
  81. data: Data<FieldIdentifierPayload>,
  82. manager: AppData<Arc<GridManager>>,
  83. ) -> Result<(), FlowyError> {
  84. let params: FieldIdentifier = data.into_inner().try_into()?;
  85. let editor = manager.get_grid_editor(&params.grid_id)?;
  86. let _ = editor.delete_field(&params.field_id).await?;
  87. Ok(())
  88. }
  89. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  90. pub(crate) async fn switch_to_field_handler(
  91. data: Data<EditFieldPayload>,
  92. manager: AppData<Arc<GridManager>>,
  93. ) -> DataResult<EditFieldContext, FlowyError> {
  94. let params: EditFieldParams = data.into_inner().try_into()?;
  95. if params.field_id.is_none() {
  96. return Err(ErrorCode::FieldIdIsEmpty.into());
  97. }
  98. let field_id = params.field_id.unwrap();
  99. let editor = manager.get_grid_editor(&params.grid_id)?;
  100. editor.switch_to_field_type(&field_id, &params.field_type).await?;
  101. let field_meta = editor.get_field_meta(&field_id).await;
  102. let edit_context =
  103. make_edit_field_context(&params.grid_id, Some(field_id), params.field_type, editor, field_meta).await?;
  104. data_result(edit_context)
  105. }
  106. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  107. pub(crate) async fn duplicate_field_handler(
  108. data: Data<FieldIdentifierPayload>,
  109. manager: AppData<Arc<GridManager>>,
  110. ) -> Result<(), FlowyError> {
  111. let params: FieldIdentifier = data.into_inner().try_into()?;
  112. let editor = manager.get_grid_editor(&params.grid_id)?;
  113. let _ = editor.duplicate_field(&params.field_id).await?;
  114. Ok(())
  115. }
  116. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  117. pub(crate) async fn get_field_context_handler(
  118. data: Data<EditFieldPayload>,
  119. manager: AppData<Arc<GridManager>>,
  120. ) -> DataResult<EditFieldContext, FlowyError> {
  121. let params: EditFieldParams = data.into_inner().try_into()?;
  122. let editor = manager.get_grid_editor(&params.grid_id)?;
  123. let edit_context =
  124. make_edit_field_context(&params.grid_id, params.field_id, params.field_type, editor, None).await?;
  125. data_result(edit_context)
  126. }
  127. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  128. pub(crate) async fn get_field_type_option_data_handler(
  129. data: Data<EditFieldPayload>,
  130. manager: AppData<Arc<GridManager>>,
  131. ) -> DataResult<FieldTypeOptionData, FlowyError> {
  132. let params: EditFieldParams = data.into_inner().try_into()?;
  133. let editor = manager.get_grid_editor(&params.grid_id)?;
  134. let field_meta = get_or_create_field_meta(params.field_id, &params.field_type, editor).await?;
  135. let type_option_data = get_type_option_data(&field_meta, &field_meta.field_type).await?;
  136. data_result(FieldTypeOptionData {
  137. field_id: field_meta.id.clone(),
  138. type_option_data,
  139. })
  140. }
  141. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  142. pub(crate) async fn move_item_handler(
  143. data: Data<MoveItemPayload>,
  144. manager: AppData<Arc<GridManager>>,
  145. ) -> Result<(), FlowyError> {
  146. let params: MoveItemParams = data.into_inner().try_into()?;
  147. let editor = manager.get_grid_editor(&params.grid_id)?;
  148. let _ = editor.move_item(params).await?;
  149. Ok(())
  150. }
  151. async fn make_edit_field_context(
  152. grid_id: &str,
  153. field_id: Option<String>,
  154. field_type: FieldType,
  155. editor: Arc<ClientGridEditor>,
  156. field_meta: Option<FieldMeta>,
  157. ) -> FlowyResult<EditFieldContext> {
  158. let field_meta = field_meta.unwrap_or(get_or_create_field_meta(field_id, &field_type, editor).await?);
  159. let type_option_data = get_type_option_data(&field_meta, &field_type).await?;
  160. let field: Field = field_meta.into();
  161. Ok(EditFieldContext {
  162. grid_id: grid_id.to_string(),
  163. grid_field: field,
  164. type_option_data,
  165. })
  166. }
  167. async fn get_type_option_data(field_meta: &FieldMeta, field_type: &FieldType) -> FlowyResult<Vec<u8>> {
  168. let s = field_meta
  169. .get_type_option_str(field_type)
  170. .unwrap_or_else(|| default_type_option_builder_from_type(field_type).entry().json_str());
  171. let builder = type_option_builder_from_json_str(&s, &field_meta.field_type);
  172. let type_option_data = builder.entry().protobuf_bytes().to_vec();
  173. Ok(type_option_data)
  174. }
  175. async fn get_or_create_field_meta(
  176. field_id: Option<String>,
  177. field_type: &FieldType,
  178. editor: Arc<ClientGridEditor>,
  179. ) -> FlowyResult<FieldMeta> {
  180. match field_id {
  181. None => editor.create_next_field_meta(field_type).await,
  182. Some(field_id) => match editor.get_field_meta(&field_id).await {
  183. None => editor.create_next_field_meta(field_type).await,
  184. Some(field_meta) => Ok(field_meta),
  185. },
  186. }
  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 = "debug", 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 = "debug", skip(data, manager), err)]
  253. pub(crate) async fn get_date_cell_data_handler(
  254. data: Data<CellIdentifierPayload>,
  255. manager: AppData<Arc<GridManager>>,
  256. ) -> DataResult<DateCellData, FlowyError> {
  257. let params: CellIdentifier = data.into_inner().try_into()?;
  258. let editor = manager.get_grid_editor(&params.grid_id)?;
  259. match editor.get_field_meta(&params.field_id).await {
  260. None => {
  261. tracing::error!("Can't find the corresponding field with id: {}", params.field_id);
  262. data_result(DateCellData::default())
  263. }
  264. Some(field_meta) => {
  265. let cell_meta = editor.get_cell_meta(&params.row_id, &params.field_id).await?;
  266. let type_option = DateTypeOption::from(&field_meta);
  267. let date_cell_data = type_option.make_date_cell_data(&cell_meta)?;
  268. data_result(date_cell_data)
  269. }
  270. }
  271. }
  272. #[tracing::instrument(level = "debug", skip_all, err)]
  273. pub(crate) async fn new_select_option_handler(
  274. data: Data<CreateSelectOptionPayload>,
  275. manager: AppData<Arc<GridManager>>,
  276. ) -> DataResult<SelectOption, FlowyError> {
  277. let params: CreateSelectOptionParams = data.into_inner().try_into()?;
  278. let editor = manager.get_grid_editor(&params.grid_id)?;
  279. match editor.get_field_meta(&params.field_id).await {
  280. None => Err(ErrorCode::InvalidData.into()),
  281. Some(field_meta) => {
  282. let type_option = select_option_operation(&field_meta)?;
  283. let select_option = type_option.create_option(&params.option_name);
  284. data_result(select_option)
  285. }
  286. }
  287. }
  288. #[tracing::instrument(level = "debug", skip_all, err)]
  289. pub(crate) async fn update_select_option_handler(
  290. data: Data<SelectOptionChangesetPayload>,
  291. manager: AppData<Arc<GridManager>>,
  292. ) -> Result<(), FlowyError> {
  293. let changeset: SelectOptionChangeset = data.into_inner().try_into()?;
  294. let editor = manager.get_grid_editor(&changeset.cell_identifier.grid_id)?;
  295. if let Some(mut field_meta) = editor.get_field_meta(&changeset.cell_identifier.field_id).await {
  296. let mut type_option = select_option_operation(&field_meta)?;
  297. let mut cell_content_changeset = None;
  298. if let Some(option) = changeset.insert_option {
  299. cell_content_changeset = Some(SelectOptionCellContentChangeset::from_insert(&option.id).to_str());
  300. type_option.insert_option(option);
  301. }
  302. if let Some(option) = changeset.update_option {
  303. type_option.insert_option(option);
  304. }
  305. if let Some(option) = changeset.delete_option {
  306. cell_content_changeset = Some(SelectOptionCellContentChangeset::from_delete(&option.id).to_str());
  307. type_option.delete_option(option);
  308. }
  309. field_meta.insert_type_option_entry(&*type_option);
  310. let _ = editor.replace_field(field_meta).await?;
  311. let changeset = CellChangeset {
  312. grid_id: changeset.cell_identifier.grid_id,
  313. row_id: changeset.cell_identifier.row_id,
  314. field_id: changeset.cell_identifier.field_id,
  315. cell_content_changeset,
  316. };
  317. let _ = editor.update_cell(changeset).await?;
  318. }
  319. Ok(())
  320. }
  321. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  322. pub(crate) async fn get_select_option_handler(
  323. data: Data<CellIdentifierPayload>,
  324. manager: AppData<Arc<GridManager>>,
  325. ) -> DataResult<SelectOptionCellData, FlowyError> {
  326. let params: CellIdentifier = data.into_inner().try_into()?;
  327. let editor = manager.get_grid_editor(&params.grid_id)?;
  328. match editor.get_field_meta(&params.field_id).await {
  329. None => {
  330. tracing::error!("Can't find the corresponding field with id: {}", params.field_id);
  331. data_result(SelectOptionCellData::default())
  332. }
  333. Some(field_meta) => {
  334. let cell_meta = editor.get_cell_meta(&params.row_id, &params.field_id).await?;
  335. let type_option = select_option_operation(&field_meta)?;
  336. let option_context = type_option.select_option_cell_data(&cell_meta);
  337. data_result(option_context)
  338. }
  339. }
  340. }
  341. #[tracing::instrument(level = "debug", skip_all, err)]
  342. pub(crate) async fn update_select_option_cell_handler(
  343. data: Data<SelectOptionCellChangesetPayload>,
  344. manager: AppData<Arc<GridManager>>,
  345. ) -> Result<(), FlowyError> {
  346. let params: SelectOptionCellChangesetParams = data.into_inner().try_into()?;
  347. let editor = manager.get_grid_editor(&params.cell_identifier.grid_id)?;
  348. let _ = editor.update_cell(params.into()).await?;
  349. Ok(())
  350. }
  351. #[tracing::instrument(level = "debug", skip_all, err)]
  352. pub(crate) async fn update_date_cell_handler(
  353. data: Data<DateChangesetPayload>,
  354. manager: AppData<Arc<GridManager>>,
  355. ) -> Result<(), FlowyError> {
  356. let params: DateChangesetParams = data.into_inner().try_into()?;
  357. let editor = manager.get_grid_editor(&params.cell_identifier.grid_id)?;
  358. let _ = editor.update_cell(params.into()).await?;
  359. Ok(())
  360. }