event_handler.rs 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542
  1. use crate::entities::*;
  2. use crate::manager::DatabaseManager;
  3. use crate::services::cell::{FromCellString, ToCellChangesetString, TypeCellData};
  4. use crate::services::field::{
  5. default_type_option_builder_from_type, select_type_option_from_field_rev, type_option_builder_from_json_str,
  6. DateCellChangeset, DateChangesetPB, SelectOptionCellChangeset, SelectOptionCellChangesetPB,
  7. SelectOptionCellChangesetParams, SelectOptionCellDataPB, SelectOptionChangeset, SelectOptionChangesetPB,
  8. SelectOptionIds, SelectOptionPB,
  9. };
  10. use crate::services::row::make_row_from_row_rev;
  11. use flowy_error::{ErrorCode, FlowyError, FlowyResult};
  12. use grid_model::FieldRevision;
  13. use lib_dispatch::prelude::{data_result, AFPluginData, AFPluginState, DataResult};
  14. use std::sync::Arc;
  15. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  16. pub(crate) async fn get_database_data_handler(
  17. data: AFPluginData<DatabaseIdPB>,
  18. manager: AFPluginState<Arc<DatabaseManager>>,
  19. ) -> DataResult<DatabasePB, FlowyError> {
  20. let database_id: DatabaseIdPB = data.into_inner();
  21. let editor = manager.open_database(database_id.as_ref()).await?;
  22. let database = editor.get_database(database_id.as_ref()).await?;
  23. data_result(database)
  24. }
  25. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  26. pub(crate) async fn get_database_setting_handler(
  27. data: AFPluginData<DatabaseIdPB>,
  28. manager: AFPluginState<Arc<DatabaseManager>>,
  29. ) -> DataResult<DatabaseViewSettingPB, FlowyError> {
  30. let database_id: DatabaseIdPB = data.into_inner();
  31. let editor = manager.open_database(database_id).await?;
  32. let database_setting = editor.get_setting().await?;
  33. data_result(database_setting)
  34. }
  35. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  36. pub(crate) async fn update_database_setting_handler(
  37. data: AFPluginData<DatabaseSettingChangesetPB>,
  38. manager: AFPluginState<Arc<DatabaseManager>>,
  39. ) -> Result<(), FlowyError> {
  40. let params: DatabaseSettingChangesetParams = data.into_inner().try_into()?;
  41. let editor = manager.get_database_editor(&params.database_id).await?;
  42. if let Some(insert_params) = params.insert_group {
  43. editor.insert_group(insert_params).await?;
  44. }
  45. if let Some(delete_params) = params.delete_group {
  46. editor.delete_group(delete_params).await?;
  47. }
  48. if let Some(alter_filter) = params.insert_filter {
  49. editor.create_or_update_filter(alter_filter).await?;
  50. }
  51. if let Some(delete_filter) = params.delete_filter {
  52. editor.delete_filter(delete_filter).await?;
  53. }
  54. if let Some(alter_sort) = params.alert_sort {
  55. let _ = editor.create_or_update_sort(alter_sort).await?;
  56. }
  57. if let Some(delete_sort) = params.delete_sort {
  58. editor.delete_sort(delete_sort).await?;
  59. }
  60. Ok(())
  61. }
  62. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  63. pub(crate) async fn get_all_filters_handler(
  64. data: AFPluginData<DatabaseIdPB>,
  65. manager: AFPluginState<Arc<DatabaseManager>>,
  66. ) -> DataResult<RepeatedFilterPB, FlowyError> {
  67. let database_id: DatabaseIdPB = data.into_inner();
  68. let editor = manager.open_database(database_id).await?;
  69. let filters = RepeatedFilterPB {
  70. items: editor.get_all_filters().await?,
  71. };
  72. data_result(filters)
  73. }
  74. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  75. pub(crate) async fn get_all_sorts_handler(
  76. data: AFPluginData<DatabaseIdPB>,
  77. manager: AFPluginState<Arc<DatabaseManager>>,
  78. ) -> DataResult<RepeatedSortPB, FlowyError> {
  79. let database_id: DatabaseIdPB = data.into_inner();
  80. let editor = manager.open_database(database_id.as_ref()).await?;
  81. let sorts = RepeatedSortPB {
  82. items: editor.get_all_sorts(database_id.as_ref()).await?,
  83. };
  84. data_result(sorts)
  85. }
  86. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  87. pub(crate) async fn delete_all_sorts_handler(
  88. data: AFPluginData<DatabaseIdPB>,
  89. manager: AFPluginState<Arc<DatabaseManager>>,
  90. ) -> Result<(), FlowyError> {
  91. let database_id: DatabaseIdPB = data.into_inner();
  92. let editor = manager.open_database(database_id.as_ref()).await?;
  93. editor.delete_all_sorts(database_id.as_ref()).await?;
  94. Ok(())
  95. }
  96. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  97. pub(crate) async fn get_fields_handler(
  98. data: AFPluginData<GetFieldPayloadPB>,
  99. manager: AFPluginState<Arc<DatabaseManager>>,
  100. ) -> DataResult<RepeatedFieldPB, FlowyError> {
  101. let params: GetFieldParams = data.into_inner().try_into()?;
  102. let editor = manager.get_database_editor(&params.database_id).await?;
  103. let field_revs = editor.get_field_revs(params.field_ids).await?;
  104. let repeated_field: RepeatedFieldPB = field_revs.into_iter().map(FieldPB::from).collect::<Vec<_>>().into();
  105. data_result(repeated_field)
  106. }
  107. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  108. pub(crate) async fn update_field_handler(
  109. data: AFPluginData<FieldChangesetPB>,
  110. manager: AFPluginState<Arc<DatabaseManager>>,
  111. ) -> Result<(), FlowyError> {
  112. let changeset: FieldChangesetParams = data.into_inner().try_into()?;
  113. let editor = manager.get_database_editor(&changeset.database_id).await?;
  114. editor.update_field(changeset).await?;
  115. Ok(())
  116. }
  117. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  118. pub(crate) async fn update_field_type_option_handler(
  119. data: AFPluginData<TypeOptionChangesetPB>,
  120. manager: AFPluginState<Arc<DatabaseManager>>,
  121. ) -> Result<(), FlowyError> {
  122. let params: TypeOptionChangesetParams = data.into_inner().try_into()?;
  123. let editor = manager.get_database_editor(&params.database_id).await?;
  124. let old_field_rev = editor.get_field_rev(&params.field_id).await;
  125. editor
  126. .update_field_type_option(
  127. &params.database_id,
  128. &params.field_id,
  129. params.type_option_data,
  130. old_field_rev,
  131. )
  132. .await?;
  133. Ok(())
  134. }
  135. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  136. pub(crate) async fn delete_field_handler(
  137. data: AFPluginData<DeleteFieldPayloadPB>,
  138. manager: AFPluginState<Arc<DatabaseManager>>,
  139. ) -> Result<(), FlowyError> {
  140. let params: FieldIdParams = data.into_inner().try_into()?;
  141. let editor = manager.get_database_editor(&params.database_id).await?;
  142. editor.delete_field(&params.field_id).await?;
  143. Ok(())
  144. }
  145. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  146. pub(crate) async fn switch_to_field_handler(
  147. data: AFPluginData<EditFieldChangesetPB>,
  148. manager: AFPluginState<Arc<DatabaseManager>>,
  149. ) -> Result<(), FlowyError> {
  150. let params: EditFieldParams = data.into_inner().try_into()?;
  151. let editor = manager.get_database_editor(&params.database_id).await?;
  152. let old_field_rev = editor.get_field_rev(&params.field_id).await;
  153. editor
  154. .switch_to_field_type(&params.field_id, &params.field_type)
  155. .await?;
  156. // Get the field_rev with field_id, if it doesn't exist, we create the default FieldRevision from the FieldType.
  157. let new_field_rev = editor
  158. .get_field_rev(&params.field_id)
  159. .await
  160. .unwrap_or(Arc::new(editor.next_field_rev(&params.field_type).await?));
  161. // Update the type-option data after the field type has been changed
  162. let type_option_data = get_type_option_data(&new_field_rev, &params.field_type).await?;
  163. editor
  164. .update_field_type_option(&params.database_id, &new_field_rev.id, type_option_data, old_field_rev)
  165. .await?;
  166. Ok(())
  167. }
  168. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  169. pub(crate) async fn duplicate_field_handler(
  170. data: AFPluginData<DuplicateFieldPayloadPB>,
  171. manager: AFPluginState<Arc<DatabaseManager>>,
  172. ) -> Result<(), FlowyError> {
  173. let params: FieldIdParams = data.into_inner().try_into()?;
  174. let editor = manager.get_database_editor(&params.database_id).await?;
  175. editor.duplicate_field(&params.field_id).await?;
  176. Ok(())
  177. }
  178. /// Return the FieldTypeOptionData if the Field exists otherwise return record not found error.
  179. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  180. pub(crate) async fn get_field_type_option_data_handler(
  181. data: AFPluginData<TypeOptionPathPB>,
  182. manager: AFPluginState<Arc<DatabaseManager>>,
  183. ) -> DataResult<TypeOptionPB, FlowyError> {
  184. let params: TypeOptionPathParams = data.into_inner().try_into()?;
  185. let editor = manager.get_database_editor(&params.database_id).await?;
  186. match editor.get_field_rev(&params.field_id).await {
  187. None => Err(FlowyError::record_not_found()),
  188. Some(field_rev) => {
  189. let field_type = field_rev.ty.into();
  190. let type_option_data = get_type_option_data(&field_rev, &field_type).await?;
  191. let data = TypeOptionPB {
  192. database_id: params.database_id,
  193. field: field_rev.into(),
  194. type_option_data,
  195. };
  196. data_result(data)
  197. }
  198. }
  199. }
  200. /// Create FieldMeta and save it. Return the FieldTypeOptionData.
  201. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  202. pub(crate) async fn create_field_type_option_data_handler(
  203. data: AFPluginData<CreateFieldPayloadPB>,
  204. manager: AFPluginState<Arc<DatabaseManager>>,
  205. ) -> DataResult<TypeOptionPB, FlowyError> {
  206. let params: CreateFieldParams = data.into_inner().try_into()?;
  207. let editor = manager.get_database_editor(&params.database_id).await?;
  208. let field_rev = editor
  209. .create_new_field_rev_with_type_option(&params.field_type, params.type_option_data)
  210. .await?;
  211. let field_type: FieldType = field_rev.ty.into();
  212. let type_option_data = get_type_option_data(&field_rev, &field_type).await?;
  213. data_result(TypeOptionPB {
  214. database_id: params.database_id,
  215. field: field_rev.into(),
  216. type_option_data,
  217. })
  218. }
  219. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  220. pub(crate) async fn move_field_handler(
  221. data: AFPluginData<MoveFieldPayloadPB>,
  222. manager: AFPluginState<Arc<DatabaseManager>>,
  223. ) -> Result<(), FlowyError> {
  224. let params: MoveFieldParams = data.into_inner().try_into()?;
  225. let editor = manager.get_database_editor(&params.view_id).await?;
  226. editor.move_field(params).await?;
  227. Ok(())
  228. }
  229. /// The [FieldRevision] contains multiple data, each of them belongs to a specific FieldType.
  230. async fn get_type_option_data(field_rev: &FieldRevision, field_type: &FieldType) -> FlowyResult<Vec<u8>> {
  231. let s = field_rev
  232. .get_type_option_str(field_type)
  233. .map(|value| value.to_owned())
  234. .unwrap_or_else(|| {
  235. default_type_option_builder_from_type(field_type)
  236. .serializer()
  237. .json_str()
  238. });
  239. let field_type: FieldType = field_rev.ty.into();
  240. let builder = type_option_builder_from_json_str(&s, &field_type);
  241. let type_option_data = builder.serializer().protobuf_bytes().to_vec();
  242. Ok(type_option_data)
  243. }
  244. // #[tracing::instrument(level = "debug", skip(data, manager), err)]
  245. pub(crate) async fn get_row_handler(
  246. data: AFPluginData<RowIdPB>,
  247. manager: AFPluginState<Arc<DatabaseManager>>,
  248. ) -> DataResult<OptionalRowPB, FlowyError> {
  249. let params: RowIdParams = data.into_inner().try_into()?;
  250. let editor = manager.get_database_editor(&params.database_id).await?;
  251. let row = editor.get_row_rev(&params.row_id).await?.map(make_row_from_row_rev);
  252. data_result(OptionalRowPB { row })
  253. }
  254. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  255. pub(crate) async fn delete_row_handler(
  256. data: AFPluginData<RowIdPB>,
  257. manager: AFPluginState<Arc<DatabaseManager>>,
  258. ) -> Result<(), FlowyError> {
  259. let params: RowIdParams = data.into_inner().try_into()?;
  260. let editor = manager.get_database_editor(&params.database_id).await?;
  261. editor.delete_row(&params.row_id).await?;
  262. Ok(())
  263. }
  264. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  265. pub(crate) async fn duplicate_row_handler(
  266. data: AFPluginData<RowIdPB>,
  267. manager: AFPluginState<Arc<DatabaseManager>>,
  268. ) -> Result<(), FlowyError> {
  269. let params: RowIdParams = data.into_inner().try_into()?;
  270. let editor = manager.get_database_editor(&params.database_id).await?;
  271. editor.duplicate_row(&params.row_id).await?;
  272. Ok(())
  273. }
  274. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  275. pub(crate) async fn move_row_handler(
  276. data: AFPluginData<MoveRowPayloadPB>,
  277. manager: AFPluginState<Arc<DatabaseManager>>,
  278. ) -> Result<(), FlowyError> {
  279. let params: MoveRowParams = data.into_inner().try_into()?;
  280. let editor = manager.get_database_editor(&params.view_id).await?;
  281. editor.move_row(params).await?;
  282. Ok(())
  283. }
  284. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  285. pub(crate) async fn create_table_row_handler(
  286. data: AFPluginData<CreateTableRowPayloadPB>,
  287. manager: AFPluginState<Arc<DatabaseManager>>,
  288. ) -> DataResult<RowPB, FlowyError> {
  289. let params: CreateRowParams = data.into_inner().try_into()?;
  290. let editor = manager.get_database_editor(params.database_id.as_ref()).await?;
  291. let row = editor.create_row(params).await?;
  292. data_result(row)
  293. }
  294. #[tracing::instrument(level = "trace", skip_all, err)]
  295. pub(crate) async fn get_cell_handler(
  296. data: AFPluginData<CellPathPB>,
  297. manager: AFPluginState<Arc<DatabaseManager>>,
  298. ) -> DataResult<CellPB, FlowyError> {
  299. let params: CellPathParams = data.into_inner().try_into()?;
  300. let editor = manager.get_database_editor(&params.database_id).await?;
  301. match editor.get_cell(&params).await {
  302. None => data_result(CellPB::empty(&params.field_id, &params.row_id)),
  303. Some(cell) => data_result(cell),
  304. }
  305. }
  306. #[tracing::instrument(level = "trace", skip_all, err)]
  307. pub(crate) async fn update_cell_handler(
  308. data: AFPluginData<CellChangesetPB>,
  309. manager: AFPluginState<Arc<DatabaseManager>>,
  310. ) -> Result<(), FlowyError> {
  311. let changeset: CellChangesetPB = data.into_inner();
  312. let editor = manager.get_database_editor(&changeset.database_id).await?;
  313. editor
  314. .update_cell_with_changeset(&changeset.row_id, &changeset.field_id, changeset.type_cell_data)
  315. .await?;
  316. Ok(())
  317. }
  318. #[tracing::instrument(level = "trace", skip_all, err)]
  319. pub(crate) async fn new_select_option_handler(
  320. data: AFPluginData<CreateSelectOptionPayloadPB>,
  321. manager: AFPluginState<Arc<DatabaseManager>>,
  322. ) -> DataResult<SelectOptionPB, FlowyError> {
  323. let params: CreateSelectOptionParams = data.into_inner().try_into()?;
  324. let editor = manager.get_database_editor(&params.database_id).await?;
  325. match editor.get_field_rev(&params.field_id).await {
  326. None => Err(ErrorCode::InvalidData.into()),
  327. Some(field_rev) => {
  328. let type_option = select_type_option_from_field_rev(&field_rev)?;
  329. let select_option = type_option.create_option(&params.option_name);
  330. data_result(select_option)
  331. }
  332. }
  333. }
  334. #[tracing::instrument(level = "trace", skip_all, err)]
  335. pub(crate) async fn update_select_option_handler(
  336. data: AFPluginData<SelectOptionChangesetPB>,
  337. manager: AFPluginState<Arc<DatabaseManager>>,
  338. ) -> Result<(), FlowyError> {
  339. let changeset: SelectOptionChangeset = data.into_inner().try_into()?;
  340. let editor = manager.get_database_editor(&changeset.cell_path.database_id).await?;
  341. let field_id = changeset.cell_path.field_id.clone();
  342. let (tx, rx) = tokio::sync::oneshot::channel();
  343. editor
  344. .modify_field_rev(&field_id, |field_rev| {
  345. let mut type_option = select_type_option_from_field_rev(field_rev)?;
  346. let mut cell_changeset_str = None;
  347. let mut is_changed = None;
  348. for option in changeset.insert_options {
  349. cell_changeset_str =
  350. Some(SelectOptionCellChangeset::from_insert_option_id(&option.id).to_cell_changeset_str());
  351. type_option.insert_option(option);
  352. is_changed = Some(());
  353. }
  354. for option in changeset.update_options {
  355. type_option.insert_option(option);
  356. is_changed = Some(());
  357. }
  358. for option in changeset.delete_options {
  359. cell_changeset_str =
  360. Some(SelectOptionCellChangeset::from_delete_option_id(&option.id).to_cell_changeset_str());
  361. type_option.delete_option(option);
  362. is_changed = Some(());
  363. }
  364. if is_changed.is_some() {
  365. field_rev.insert_type_option(&*type_option);
  366. }
  367. let _ = tx.send(cell_changeset_str);
  368. Ok(is_changed)
  369. })
  370. .await?;
  371. if let Ok(Some(cell_changeset_str)) = rx.await {
  372. match editor
  373. .update_cell_with_changeset(
  374. &changeset.cell_path.row_id,
  375. &changeset.cell_path.field_id,
  376. cell_changeset_str,
  377. )
  378. .await
  379. {
  380. Ok(_) => {}
  381. Err(e) => tracing::error!("{}", e),
  382. }
  383. }
  384. Ok(())
  385. }
  386. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  387. pub(crate) async fn get_select_option_handler(
  388. data: AFPluginData<CellPathPB>,
  389. manager: AFPluginState<Arc<DatabaseManager>>,
  390. ) -> DataResult<SelectOptionCellDataPB, FlowyError> {
  391. let params: CellPathParams = data.into_inner().try_into()?;
  392. let editor = manager.get_database_editor(&params.database_id).await?;
  393. match editor.get_field_rev(&params.field_id).await {
  394. None => {
  395. tracing::error!("Can't find the select option field with id: {}", params.field_id);
  396. data_result(SelectOptionCellDataPB::default())
  397. }
  398. Some(field_rev) => {
  399. //
  400. let cell_rev = editor.get_cell_rev(&params.row_id, &params.field_id).await?;
  401. let type_option = select_type_option_from_field_rev(&field_rev)?;
  402. let type_cell_data: TypeCellData = match cell_rev {
  403. None => TypeCellData {
  404. cell_str: "".to_string(),
  405. field_type: field_rev.ty.into(),
  406. },
  407. Some(cell_rev) => cell_rev.try_into()?,
  408. };
  409. let ids = SelectOptionIds::from_cell_str(&type_cell_data.cell_str)?;
  410. let selected_options = type_option.get_selected_options(ids);
  411. data_result(selected_options)
  412. }
  413. }
  414. }
  415. #[tracing::instrument(level = "trace", skip_all, err)]
  416. pub(crate) async fn update_select_option_cell_handler(
  417. data: AFPluginData<SelectOptionCellChangesetPB>,
  418. manager: AFPluginState<Arc<DatabaseManager>>,
  419. ) -> Result<(), FlowyError> {
  420. let params: SelectOptionCellChangesetParams = data.into_inner().try_into()?;
  421. let editor = manager.get_database_editor(&params.cell_identifier.database_id).await?;
  422. let changeset = SelectOptionCellChangeset {
  423. insert_option_ids: params.insert_option_ids,
  424. delete_option_ids: params.delete_option_ids,
  425. };
  426. editor
  427. .update_cell_with_changeset(
  428. &params.cell_identifier.row_id,
  429. &params.cell_identifier.field_id,
  430. changeset,
  431. )
  432. .await?;
  433. Ok(())
  434. }
  435. #[tracing::instrument(level = "trace", skip_all, err)]
  436. pub(crate) async fn update_date_cell_handler(
  437. data: AFPluginData<DateChangesetPB>,
  438. manager: AFPluginState<Arc<DatabaseManager>>,
  439. ) -> Result<(), FlowyError> {
  440. let data = data.into_inner();
  441. let cell_path: CellPathParams = data.cell_path.try_into()?;
  442. let cell_changeset = DateCellChangeset {
  443. date: data.date,
  444. time: data.time,
  445. is_utc: data.is_utc,
  446. };
  447. let editor = manager.get_database_editor(&cell_path.database_id).await?;
  448. editor
  449. .update_cell(cell_path.row_id, cell_path.field_id, cell_changeset)
  450. .await?;
  451. Ok(())
  452. }
  453. #[tracing::instrument(level = "trace", skip_all, err)]
  454. pub(crate) async fn get_groups_handler(
  455. data: AFPluginData<DatabaseIdPB>,
  456. manager: AFPluginState<Arc<DatabaseManager>>,
  457. ) -> DataResult<RepeatedGroupPB, FlowyError> {
  458. let params: DatabaseIdPB = data.into_inner();
  459. let editor = manager.get_database_editor(&params.value).await?;
  460. let group = editor.load_groups().await?;
  461. data_result(group)
  462. }
  463. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  464. pub(crate) async fn create_board_card_handler(
  465. data: AFPluginData<CreateBoardCardPayloadPB>,
  466. manager: AFPluginState<Arc<DatabaseManager>>,
  467. ) -> DataResult<RowPB, FlowyError> {
  468. let params: CreateRowParams = data.into_inner().try_into()?;
  469. let editor = manager.get_database_editor(params.database_id.as_ref()).await?;
  470. let row = editor.create_row(params).await?;
  471. data_result(row)
  472. }
  473. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  474. pub(crate) async fn move_group_handler(
  475. data: AFPluginData<MoveGroupPayloadPB>,
  476. manager: AFPluginState<Arc<DatabaseManager>>,
  477. ) -> FlowyResult<()> {
  478. let params: MoveGroupParams = data.into_inner().try_into()?;
  479. let editor = manager.get_database_editor(params.view_id.as_ref()).await?;
  480. editor.move_group(params).await?;
  481. Ok(())
  482. }
  483. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  484. pub(crate) async fn move_group_row_handler(
  485. data: AFPluginData<MoveGroupRowPayloadPB>,
  486. manager: AFPluginState<Arc<DatabaseManager>>,
  487. ) -> FlowyResult<()> {
  488. let params: MoveGroupRowParams = data.into_inner().try_into()?;
  489. let editor = manager.get_database_editor(params.view_id.as_ref()).await?;
  490. editor.move_group_row(params).await?;
  491. Ok(())
  492. }