event_handler.rs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. use crate::manager::GridManager;
  2. use crate::services::cell::cell_entities::*;
  3. use crate::services::field::field_entities::*;
  4. use crate::services::field::type_options::*;
  5. use crate::services::field::{default_type_option_builder_from_type, type_option_builder_from_json_str};
  6. use crate::services::grid_editor::ClientGridEditor;
  7. use crate::services::row::row_entities::*;
  8. use flowy_error::{ErrorCode, FlowyError, FlowyResult};
  9. use flowy_grid_data_model::entities::*;
  10. use lib_dispatch::prelude::{data_result, AppData, Data, DataResult};
  11. use std::sync::Arc;
  12. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  13. pub(crate) async fn get_grid_data_handler(
  14. data: Data<GridId>,
  15. manager: AppData<Arc<GridManager>>,
  16. ) -> DataResult<Grid, FlowyError> {
  17. let grid_id: GridId = data.into_inner();
  18. let editor = manager.open_grid(grid_id).await?;
  19. let grid = editor.grid_data().await?;
  20. data_result(grid)
  21. }
  22. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  23. pub(crate) async fn get_grid_blocks_handler(
  24. data: Data<QueryGridBlocksPayload>,
  25. manager: AppData<Arc<GridManager>>,
  26. ) -> DataResult<RepeatedGridBlock, FlowyError> {
  27. let params: QueryGridBlocksParams = data.into_inner().try_into()?;
  28. let editor = manager.get_grid_editor(&params.grid_id)?;
  29. let block_ids = params
  30. .block_orders
  31. .into_iter()
  32. .map(|block| block.block_id)
  33. .collect::<Vec<String>>();
  34. let repeated_grid_block = editor.get_blocks(Some(block_ids)).await?;
  35. data_result(repeated_grid_block)
  36. }
  37. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  38. pub(crate) async fn get_fields_handler(
  39. data: Data<QueryFieldPayload>,
  40. manager: AppData<Arc<GridManager>>,
  41. ) -> DataResult<RepeatedField, FlowyError> {
  42. let params: QueryFieldParams = data.into_inner().try_into()?;
  43. let editor = manager.get_grid_editor(&params.grid_id)?;
  44. let field_orders = params.field_orders.items;
  45. let field_metas = editor.get_field_metas(Some(field_orders)).await?;
  46. let repeated_field: RepeatedField = field_metas.into_iter().map(Field::from).collect::<Vec<_>>().into();
  47. data_result(repeated_field)
  48. }
  49. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  50. pub(crate) async fn update_field_handler(
  51. data: Data<FieldChangesetPayload>,
  52. manager: AppData<Arc<GridManager>>,
  53. ) -> Result<(), FlowyError> {
  54. let changeset: FieldChangesetParams = data.into_inner().try_into()?;
  55. let editor = manager.get_grid_editor(&changeset.grid_id)?;
  56. let _ = editor.update_field(changeset).await?;
  57. Ok(())
  58. }
  59. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  60. pub(crate) async fn create_field_handler(
  61. data: Data<CreateFieldPayload>,
  62. manager: AppData<Arc<GridManager>>,
  63. ) -> Result<(), FlowyError> {
  64. let params: CreateFieldParams = data.into_inner().try_into()?;
  65. let editor = manager.get_grid_editor(&params.grid_id)?;
  66. let _ = editor.create_field(params).await?;
  67. Ok(())
  68. }
  69. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  70. pub(crate) async fn delete_field_handler(
  71. data: Data<FieldIdentifierPayload>,
  72. manager: AppData<Arc<GridManager>>,
  73. ) -> Result<(), FlowyError> {
  74. let params: FieldIdentifier = data.into_inner().try_into()?;
  75. let editor = manager.get_grid_editor(&params.grid_id)?;
  76. let _ = editor.delete_field(&params.field_id).await?;
  77. Ok(())
  78. }
  79. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  80. pub(crate) async fn switch_to_field_handler(
  81. data: Data<EditFieldPayload>,
  82. manager: AppData<Arc<GridManager>>,
  83. ) -> DataResult<EditFieldContext, FlowyError> {
  84. let params: EditFieldParams = data.into_inner().try_into()?;
  85. let editor = manager.get_grid_editor(&params.grid_id)?;
  86. editor
  87. .switch_to_field_type(&params.field_id, &params.field_type)
  88. .await?;
  89. let field_meta = editor.get_field_meta(&params.field_id).await;
  90. let edit_context = make_field_edit_context(
  91. &params.grid_id,
  92. Some(params.field_id),
  93. params.field_type,
  94. editor,
  95. field_meta,
  96. )
  97. .await?;
  98. data_result(edit_context)
  99. }
  100. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  101. pub(crate) async fn duplicate_field_handler(
  102. data: Data<FieldIdentifierPayload>,
  103. manager: AppData<Arc<GridManager>>,
  104. ) -> Result<(), FlowyError> {
  105. let params: FieldIdentifier = data.into_inner().try_into()?;
  106. let editor = manager.get_grid_editor(&params.grid_id)?;
  107. let _ = editor.duplicate_field(&params.field_id).await?;
  108. Ok(())
  109. }
  110. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  111. pub(crate) async fn get_field_context_handler(
  112. data: Data<GetEditFieldContextPayload>,
  113. manager: AppData<Arc<GridManager>>,
  114. ) -> DataResult<EditFieldContext, FlowyError> {
  115. let params = data.into_inner();
  116. let editor = manager.get_grid_editor(&params.grid_id)?;
  117. let edit_context =
  118. make_field_edit_context(&params.grid_id, params.field_id, params.field_type, editor, None).await?;
  119. data_result(edit_context)
  120. }
  121. async fn make_field_edit_context(
  122. grid_id: &str,
  123. field_id: Option<String>,
  124. field_type: FieldType,
  125. editor: Arc<ClientGridEditor>,
  126. field_meta: Option<FieldMeta>,
  127. ) -> FlowyResult<EditFieldContext> {
  128. let field_meta = field_meta.unwrap_or(get_or_create_field_meta(field_id, &field_type, editor).await?);
  129. let s = field_meta
  130. .get_type_option_str(None)
  131. .unwrap_or_else(|| default_type_option_builder_from_type(&field_type).entry().json_str());
  132. let builder = type_option_builder_from_json_str(&s, &field_meta.field_type);
  133. let type_option_data = builder.entry().protobuf_bytes().to_vec();
  134. let field: Field = field_meta.into();
  135. Ok(EditFieldContext {
  136. grid_id: grid_id.to_string(),
  137. grid_field: field,
  138. type_option_data,
  139. })
  140. }
  141. async fn get_or_create_field_meta(
  142. field_id: Option<String>,
  143. field_type: &FieldType,
  144. editor: Arc<ClientGridEditor>,
  145. ) -> FlowyResult<FieldMeta> {
  146. match field_id {
  147. None => editor.create_next_field_meta(field_type).await,
  148. Some(field_id) => match editor.get_field_meta(&field_id).await {
  149. None => editor.create_next_field_meta(field_type).await,
  150. Some(field_meta) => Ok(field_meta),
  151. },
  152. }
  153. }
  154. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  155. pub(crate) async fn get_row_handler(
  156. data: Data<RowIdentifierPayload>,
  157. manager: AppData<Arc<GridManager>>,
  158. ) -> DataResult<Row, FlowyError> {
  159. let params: RowIdentifier = data.into_inner().try_into()?;
  160. let editor = manager.get_grid_editor(&params.grid_id)?;
  161. match editor.get_row(&params.row_id).await? {
  162. None => Err(FlowyError::record_not_found().context("Can not find the row")),
  163. Some(row) => data_result(row),
  164. }
  165. }
  166. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  167. pub(crate) async fn create_row_handler(
  168. data: Data<CreateRowPayload>,
  169. manager: AppData<Arc<GridManager>>,
  170. ) -> Result<(), FlowyError> {
  171. let params: CreateRowParams = data.into_inner().try_into()?;
  172. let editor = manager.get_grid_editor(params.grid_id.as_ref())?;
  173. let _ = editor.create_row(params.start_row_id).await?;
  174. Ok(())
  175. }
  176. #[tracing::instrument(level = "debug", skip_all, err)]
  177. pub(crate) async fn get_cell_handler(
  178. data: Data<CellIdentifierPayload>,
  179. manager: AppData<Arc<GridManager>>,
  180. ) -> DataResult<Cell, FlowyError> {
  181. let params: CellIdentifier = data.into_inner().try_into()?;
  182. let editor = manager.get_grid_editor(&params.grid_id)?;
  183. match editor.get_cell(&params).await {
  184. None => data_result(Cell::new(&params.field_id, "".to_owned())),
  185. Some(cell) => data_result(cell),
  186. }
  187. }
  188. #[tracing::instrument(level = "debug", skip_all, err)]
  189. pub(crate) async fn update_cell_handler(
  190. data: Data<CellMetaChangeset>,
  191. manager: AppData<Arc<GridManager>>,
  192. ) -> Result<(), FlowyError> {
  193. let changeset: CellMetaChangeset = data.into_inner();
  194. let editor = manager.get_grid_editor(&changeset.grid_id)?;
  195. let _ = editor.update_cell(changeset).await?;
  196. Ok(())
  197. }
  198. #[tracing::instrument(level = "debug", skip_all, err)]
  199. pub(crate) async fn new_select_option_handler(data: Data<SelectOptionName>) -> DataResult<SelectOption, FlowyError> {
  200. let params = data.into_inner();
  201. data_result(SelectOption::new(&params.name))
  202. }
  203. #[tracing::instrument(level = "debug", skip_all, err)]
  204. pub(crate) async fn select_option_changeset_handler(
  205. data: Data<SelectOptionChangesetPayload>,
  206. manager: AppData<Arc<GridManager>>,
  207. ) -> Result<(), FlowyError> {
  208. let changeset: SelectOptionChangeset = data.into_inner().try_into()?;
  209. let editor = manager.get_grid_editor(&changeset.cell_identifier.grid_id)?;
  210. if let Some(mut field_meta) = editor.get_field_meta(&changeset.cell_identifier.field_id).await {
  211. let mut type_option = select_option_operation(&field_meta)?;
  212. let mut cell_data = None;
  213. if let Some(option) = changeset.insert_option {
  214. cell_data = Some(SelectOptionCellChangeset::from_insert(&option.id).cell_data());
  215. type_option.insert_option(option);
  216. }
  217. if let Some(option) = changeset.update_option {
  218. type_option.insert_option(option);
  219. }
  220. if let Some(option) = changeset.delete_option {
  221. cell_data = Some(SelectOptionCellChangeset::from_delete(&option.id).cell_data());
  222. type_option.delete_option(option);
  223. }
  224. field_meta.insert_type_option_entry(&*type_option);
  225. let _ = editor.replace_field(field_meta).await?;
  226. let changeset = CellMetaChangeset {
  227. grid_id: changeset.cell_identifier.grid_id,
  228. row_id: changeset.cell_identifier.row_id,
  229. field_id: changeset.cell_identifier.field_id,
  230. data: cell_data,
  231. };
  232. let _ = editor.update_cell(changeset).await?;
  233. }
  234. Ok(())
  235. }
  236. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  237. pub(crate) async fn get_select_option_handler(
  238. data: Data<CellIdentifierPayload>,
  239. manager: AppData<Arc<GridManager>>,
  240. ) -> DataResult<SelectOptionContext, FlowyError> {
  241. let params: CellIdentifier = data.into_inner().try_into()?;
  242. let editor = manager.get_grid_editor(&params.grid_id)?;
  243. match editor.get_field_meta(&params.field_id).await {
  244. None => {
  245. tracing::error!("Can't find the corresponding field with id: {}", params.field_id);
  246. data_result(SelectOptionContext::default())
  247. }
  248. Some(field_meta) => {
  249. let cell_meta = editor.get_cell_meta(&params.row_id, &params.field_id).await?;
  250. let type_option = select_option_operation(&field_meta)?;
  251. let option_context = type_option.option_context(&cell_meta);
  252. data_result(option_context)
  253. }
  254. }
  255. }
  256. #[tracing::instrument(level = "debug", skip_all, err)]
  257. pub(crate) async fn select_option_cell_changeset_handler(
  258. data: Data<SelectOptionCellChangesetPayload>,
  259. manager: AppData<Arc<GridManager>>,
  260. ) -> Result<(), FlowyError> {
  261. let params: SelectOptionCellChangesetParams = data.into_inner().try_into()?;
  262. let editor = manager.get_grid_editor(&params.grid_id)?;
  263. let changeset: CellMetaChangeset = params.into();
  264. let _ = editor.update_cell(changeset).await?;
  265. Ok(())
  266. }
  267. fn select_option_operation(field_meta: &FieldMeta) -> FlowyResult<Box<dyn SelectOptionOperation>> {
  268. match &field_meta.field_type {
  269. FieldType::SingleSelect => {
  270. let type_option = SingleSelectTypeOption::from(field_meta);
  271. Ok(Box::new(type_option))
  272. }
  273. FieldType::MultiSelect => {
  274. let type_option = MultiSelectTypeOption::from(field_meta);
  275. Ok(Box::new(type_option))
  276. }
  277. ty => {
  278. tracing::error!("Unsupported field type: {:?} for this handler", ty);
  279. Err(ErrorCode::FieldInvalidOperation.into())
  280. }
  281. }
  282. }