event_handler.rs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  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 update_cell_handler(
  178. data: Data<CellMetaChangeset>,
  179. manager: AppData<Arc<GridManager>>,
  180. ) -> Result<(), FlowyError> {
  181. let changeset: CellMetaChangeset = data.into_inner();
  182. let editor = manager.get_grid_editor(&changeset.grid_id)?;
  183. let _ = editor.update_cell(changeset).await?;
  184. Ok(())
  185. }
  186. #[tracing::instrument(level = "debug", skip_all, err)]
  187. pub(crate) async fn new_select_option_handler(data: Data<SelectOptionName>) -> DataResult<SelectOption, FlowyError> {
  188. let params = data.into_inner();
  189. data_result(SelectOption::new(&params.name))
  190. }
  191. #[tracing::instrument(level = "debug", skip_all, err)]
  192. pub(crate) async fn select_option_changeset_handler(
  193. data: Data<SelectOptionChangesetPayload>,
  194. manager: AppData<Arc<GridManager>>,
  195. ) -> Result<(), FlowyError> {
  196. let changeset: SelectOptionChangeset = data.into_inner().try_into()?;
  197. let editor = manager.get_grid_editor(&changeset.cell_identifier.grid_id)?;
  198. if let Some(mut field_meta) = editor.get_field_meta(&changeset.cell_identifier.field_id).await {
  199. let mut type_option = select_option_operation(&field_meta)?;
  200. let mut cell_data = None;
  201. if let Some(option) = changeset.insert_option {
  202. cell_data = Some(SelectOptionCellChangeset::from_insert(&option.id).cell_data());
  203. type_option.insert_option(option);
  204. }
  205. if let Some(option) = changeset.delete_option {
  206. cell_data = Some(SelectOptionCellChangeset::from_delete(&option.id).cell_data());
  207. type_option.delete_option(option);
  208. }
  209. field_meta.insert_type_option_entry(&*type_option);
  210. let _ = editor.replace_field(field_meta).await?;
  211. let changeset = CellMetaChangeset {
  212. grid_id: changeset.cell_identifier.grid_id,
  213. row_id: changeset.cell_identifier.row_id,
  214. field_id: changeset.cell_identifier.field_id,
  215. data: cell_data,
  216. };
  217. let _ = editor.update_cell(changeset).await?;
  218. }
  219. Ok(())
  220. }
  221. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  222. pub(crate) async fn get_select_option_handler(
  223. data: Data<CellIdentifierPayload>,
  224. manager: AppData<Arc<GridManager>>,
  225. ) -> DataResult<SelectOptionContext, FlowyError> {
  226. let params: CellIdentifier = data.into_inner().try_into()?;
  227. let editor = manager.get_grid_editor(&params.grid_id)?;
  228. match editor.get_field_meta(&params.field_id).await {
  229. None => {
  230. tracing::error!("Can't find the corresponding field with id: {}", params.field_id);
  231. data_result(SelectOptionContext::default())
  232. }
  233. Some(field_meta) => {
  234. let cell_meta = editor.get_cell_meta(&params.row_id, &params.field_id).await?;
  235. let type_option = select_option_operation(&field_meta)?;
  236. let option_context = type_option.option_context(&cell_meta);
  237. data_result(option_context)
  238. }
  239. }
  240. }
  241. #[tracing::instrument(level = "debug", skip_all, err)]
  242. pub(crate) async fn select_option_cell_changeset_handler(
  243. data: Data<SelectOptionCellChangesetPayload>,
  244. manager: AppData<Arc<GridManager>>,
  245. ) -> Result<(), FlowyError> {
  246. let params: SelectOptionCellChangesetParams = data.into_inner().try_into()?;
  247. let editor = manager.get_grid_editor(&params.grid_id)?;
  248. let changeset: CellMetaChangeset = params.into();
  249. let _ = editor.update_cell(changeset).await?;
  250. Ok(())
  251. }
  252. fn select_option_operation(field_meta: &FieldMeta) -> FlowyResult<Box<dyn SelectOptionOperation>> {
  253. match &field_meta.field_type {
  254. FieldType::SingleSelect => {
  255. let type_option = SingleSelectTypeOption::from(field_meta);
  256. Ok(Box::new(type_option))
  257. }
  258. FieldType::MultiSelect => {
  259. let type_option = MultiSelectTypeOption::from(field_meta);
  260. Ok(Box::new(type_option))
  261. }
  262. ty => {
  263. tracing::error!("Unsupported field type: {:?} for this handler", ty);
  264. Err(ErrorCode::FieldInvalidOperation.into())
  265. }
  266. }
  267. }