event_handler.rs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385
  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<FieldTypeOptionData, 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 data =
  103. make_field_type_option_data(&params.grid_id, Some(field_id), params.field_type, editor, field_meta).await?;
  104. data_result(data)
  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_type_option_data_handler(
  118. data: Data<EditFieldPayload>,
  119. manager: AppData<Arc<GridManager>>,
  120. ) -> DataResult<FieldTypeOptionData, FlowyError> {
  121. let params: EditFieldParams = data.into_inner().try_into()?;
  122. let editor = manager.get_grid_editor(&params.grid_id)?;
  123. let field_meta = get_or_create_field_meta(params.field_id, &params.field_type, editor).await?;
  124. let type_option_data = get_type_option_data(&field_meta, &field_meta.field_type).await?;
  125. data_result(FieldTypeOptionData {
  126. grid_id: params.grid_id,
  127. field: field_meta.into(),
  128. type_option_data,
  129. })
  130. }
  131. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  132. pub(crate) async fn move_item_handler(
  133. data: Data<MoveItemPayload>,
  134. manager: AppData<Arc<GridManager>>,
  135. ) -> Result<(), FlowyError> {
  136. let params: MoveItemParams = data.into_inner().try_into()?;
  137. let editor = manager.get_grid_editor(&params.grid_id)?;
  138. let _ = editor.move_item(params).await?;
  139. Ok(())
  140. }
  141. async fn make_field_type_option_data(
  142. grid_id: &str,
  143. field_id: Option<String>,
  144. field_type: FieldType,
  145. editor: Arc<ClientGridEditor>,
  146. field_meta: Option<FieldMeta>,
  147. ) -> FlowyResult<FieldTypeOptionData> {
  148. let field_meta = field_meta.unwrap_or(get_or_create_field_meta(field_id, &field_type, editor).await?);
  149. let type_option_data = get_type_option_data(&field_meta, &field_type).await?;
  150. Ok(FieldTypeOptionData {
  151. grid_id: grid_id.to_string(),
  152. field: field_meta.into(),
  153. type_option_data,
  154. })
  155. }
  156. /// The FieldMeta contains multiple data, each of them belongs to a specific FieldType.
  157. async fn get_type_option_data(field_meta: &FieldMeta, field_type: &FieldType) -> FlowyResult<Vec<u8>> {
  158. let s = field_meta
  159. .get_type_option_str(field_type)
  160. .unwrap_or_else(|| default_type_option_builder_from_type(field_type).entry().json_str());
  161. let builder = type_option_builder_from_json_str(&s, &field_meta.field_type);
  162. let type_option_data = builder.entry().protobuf_bytes().to_vec();
  163. Ok(type_option_data)
  164. }
  165. async fn get_or_create_field_meta(
  166. field_id: Option<String>,
  167. field_type: &FieldType,
  168. editor: Arc<ClientGridEditor>,
  169. ) -> FlowyResult<FieldMeta> {
  170. match field_id {
  171. None => editor.create_next_field_meta(field_type).await,
  172. Some(field_id) => match editor.get_field_meta(&field_id).await {
  173. None => editor.create_next_field_meta(field_type).await,
  174. Some(field_meta) => Ok(field_meta),
  175. },
  176. }
  177. }
  178. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  179. pub(crate) async fn get_row_handler(
  180. data: Data<RowIdentifierPayload>,
  181. manager: AppData<Arc<GridManager>>,
  182. ) -> DataResult<Row, FlowyError> {
  183. let params: RowIdentifier = data.into_inner().try_into()?;
  184. let editor = manager.get_grid_editor(&params.grid_id)?;
  185. match editor.get_row(&params.row_id).await? {
  186. None => Err(FlowyError::record_not_found().context("Can not find the row")),
  187. Some(row) => data_result(row),
  188. }
  189. }
  190. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  191. pub(crate) async fn delete_row_handler(
  192. data: Data<RowIdentifierPayload>,
  193. manager: AppData<Arc<GridManager>>,
  194. ) -> Result<(), FlowyError> {
  195. let params: RowIdentifier = data.into_inner().try_into()?;
  196. let editor = manager.get_grid_editor(&params.grid_id)?;
  197. let _ = editor.delete_row(&params.row_id).await?;
  198. Ok(())
  199. }
  200. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  201. pub(crate) async fn duplicate_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.duplicate_row(&params.row_id).await?;
  208. Ok(())
  209. }
  210. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  211. pub(crate) async fn create_row_handler(
  212. data: Data<CreateRowPayload>,
  213. manager: AppData<Arc<GridManager>>,
  214. ) -> Result<(), FlowyError> {
  215. let params: CreateRowParams = data.into_inner().try_into()?;
  216. let editor = manager.get_grid_editor(params.grid_id.as_ref())?;
  217. let _ = editor.create_row(params.start_row_id).await?;
  218. Ok(())
  219. }
  220. // #[tracing::instrument(level = "debug", skip_all, err)]
  221. pub(crate) async fn get_cell_handler(
  222. data: Data<CellIdentifierPayload>,
  223. manager: AppData<Arc<GridManager>>,
  224. ) -> DataResult<Cell, FlowyError> {
  225. let params: CellIdentifier = data.into_inner().try_into()?;
  226. let editor = manager.get_grid_editor(&params.grid_id)?;
  227. match editor.get_cell(&params).await {
  228. None => data_result(Cell::empty(&params.field_id)),
  229. Some(cell) => data_result(cell),
  230. }
  231. }
  232. #[tracing::instrument(level = "debug", skip_all, err)]
  233. pub(crate) async fn update_cell_handler(
  234. data: Data<CellChangeset>,
  235. manager: AppData<Arc<GridManager>>,
  236. ) -> Result<(), FlowyError> {
  237. let changeset: CellChangeset = data.into_inner();
  238. let editor = manager.get_grid_editor(&changeset.grid_id)?;
  239. let _ = editor.update_cell(changeset).await?;
  240. Ok(())
  241. }
  242. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  243. pub(crate) async fn get_date_cell_data_handler(
  244. data: Data<CellIdentifierPayload>,
  245. manager: AppData<Arc<GridManager>>,
  246. ) -> DataResult<DateCellData, FlowyError> {
  247. let params: CellIdentifier = data.into_inner().try_into()?;
  248. let editor = manager.get_grid_editor(&params.grid_id)?;
  249. match editor.get_field_meta(&params.field_id).await {
  250. None => {
  251. tracing::error!("Can't find the corresponding field with id: {}", params.field_id);
  252. data_result(DateCellData::default())
  253. }
  254. Some(field_meta) => {
  255. let cell_meta = editor.get_cell_meta(&params.row_id, &params.field_id).await?;
  256. let type_option = DateTypeOption::from(&field_meta);
  257. let date_cell_data = type_option.make_date_cell_data(&cell_meta)?;
  258. data_result(date_cell_data)
  259. }
  260. }
  261. }
  262. #[tracing::instrument(level = "debug", skip_all, err)]
  263. pub(crate) async fn new_select_option_handler(
  264. data: Data<CreateSelectOptionPayload>,
  265. manager: AppData<Arc<GridManager>>,
  266. ) -> DataResult<SelectOption, FlowyError> {
  267. let params: CreateSelectOptionParams = data.into_inner().try_into()?;
  268. let editor = manager.get_grid_editor(&params.grid_id)?;
  269. match editor.get_field_meta(&params.field_id).await {
  270. None => Err(ErrorCode::InvalidData.into()),
  271. Some(field_meta) => {
  272. let type_option = select_option_operation(&field_meta)?;
  273. let select_option = type_option.create_option(&params.option_name);
  274. data_result(select_option)
  275. }
  276. }
  277. }
  278. #[tracing::instrument(level = "debug", skip_all, err)]
  279. pub(crate) async fn update_select_option_handler(
  280. data: Data<SelectOptionChangesetPayload>,
  281. manager: AppData<Arc<GridManager>>,
  282. ) -> Result<(), FlowyError> {
  283. let changeset: SelectOptionChangeset = data.into_inner().try_into()?;
  284. let editor = manager.get_grid_editor(&changeset.cell_identifier.grid_id)?;
  285. if let Some(mut field_meta) = editor.get_field_meta(&changeset.cell_identifier.field_id).await {
  286. let mut type_option = select_option_operation(&field_meta)?;
  287. let mut cell_content_changeset = None;
  288. if let Some(option) = changeset.insert_option {
  289. cell_content_changeset = Some(SelectOptionCellContentChangeset::from_insert(&option.id).to_str());
  290. type_option.insert_option(option);
  291. }
  292. if let Some(option) = changeset.update_option {
  293. type_option.insert_option(option);
  294. }
  295. if let Some(option) = changeset.delete_option {
  296. cell_content_changeset = Some(SelectOptionCellContentChangeset::from_delete(&option.id).to_str());
  297. type_option.delete_option(option);
  298. }
  299. field_meta.insert_type_option_entry(&*type_option);
  300. let _ = editor.replace_field(field_meta).await?;
  301. let changeset = CellChangeset {
  302. grid_id: changeset.cell_identifier.grid_id,
  303. row_id: changeset.cell_identifier.row_id,
  304. field_id: changeset.cell_identifier.field_id,
  305. cell_content_changeset,
  306. };
  307. let _ = editor.update_cell(changeset).await?;
  308. }
  309. Ok(())
  310. }
  311. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  312. pub(crate) async fn get_select_option_handler(
  313. data: Data<CellIdentifierPayload>,
  314. manager: AppData<Arc<GridManager>>,
  315. ) -> DataResult<SelectOptionCellData, FlowyError> {
  316. let params: CellIdentifier = data.into_inner().try_into()?;
  317. let editor = manager.get_grid_editor(&params.grid_id)?;
  318. match editor.get_field_meta(&params.field_id).await {
  319. None => {
  320. tracing::error!("Can't find the corresponding field with id: {}", params.field_id);
  321. data_result(SelectOptionCellData::default())
  322. }
  323. Some(field_meta) => {
  324. let cell_meta = editor.get_cell_meta(&params.row_id, &params.field_id).await?;
  325. let type_option = select_option_operation(&field_meta)?;
  326. let option_context = type_option.select_option_cell_data(&cell_meta);
  327. data_result(option_context)
  328. }
  329. }
  330. }
  331. #[tracing::instrument(level = "debug", skip_all, err)]
  332. pub(crate) async fn update_select_option_cell_handler(
  333. data: Data<SelectOptionCellChangesetPayload>,
  334. manager: AppData<Arc<GridManager>>,
  335. ) -> Result<(), FlowyError> {
  336. let params: SelectOptionCellChangesetParams = 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. }
  341. #[tracing::instrument(level = "debug", skip_all, err)]
  342. pub(crate) async fn update_date_cell_handler(
  343. data: Data<DateChangesetPayload>,
  344. manager: AppData<Arc<GridManager>>,
  345. ) -> Result<(), FlowyError> {
  346. let params: DateChangesetParams = 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. }