event_handler.rs 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646
  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,
  6. type_option_builder_from_json_str, DateCellChangeset, DateChangesetPB, SelectOptionCellChangeset,
  7. SelectOptionCellChangesetPB, SelectOptionCellChangesetParams, SelectOptionCellDataPB,
  8. SelectOptionChangeset, SelectOptionChangesetPB, SelectOptionIds, SelectOptionPB,
  9. };
  10. use crate::services::row::make_row_from_row_rev;
  11. use database_model::FieldRevision;
  12. use flowy_error::{ErrorCode, FlowyError, FlowyResult};
  13. use lib_dispatch::prelude::{data_result_ok, 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<DatabaseViewIdPB>,
  18. manager: AFPluginState<Arc<DatabaseManager>>,
  19. ) -> DataResult<DatabasePB, FlowyError> {
  20. let view_id: DatabaseViewIdPB = data.into_inner();
  21. let editor = manager.open_database_view(view_id.as_ref()).await?;
  22. let database = editor.get_database(view_id.as_ref()).await?;
  23. data_result_ok(database)
  24. }
  25. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  26. pub(crate) async fn get_database_setting_handler(
  27. data: AFPluginData<DatabaseViewIdPB>,
  28. manager: AFPluginState<Arc<DatabaseManager>>,
  29. ) -> DataResult<DatabaseViewSettingPB, FlowyError> {
  30. let view_id: DatabaseViewIdPB = data.into_inner();
  31. let editor = manager.open_database_view(view_id.as_ref()).await?;
  32. let database_setting = editor.get_setting(view_id.as_ref()).await?;
  33. data_result_ok(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.view_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<DatabaseViewIdPB>,
  65. manager: AFPluginState<Arc<DatabaseManager>>,
  66. ) -> DataResult<RepeatedFilterPB, FlowyError> {
  67. let view_id: DatabaseViewIdPB = data.into_inner();
  68. let editor = manager.open_database_view(view_id.as_ref()).await?;
  69. let filters = RepeatedFilterPB {
  70. items: editor.get_all_filters(view_id.as_ref()).await?,
  71. };
  72. data_result_ok(filters)
  73. }
  74. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  75. pub(crate) async fn get_all_sorts_handler(
  76. data: AFPluginData<DatabaseViewIdPB>,
  77. manager: AFPluginState<Arc<DatabaseManager>>,
  78. ) -> DataResult<RepeatedSortPB, FlowyError> {
  79. let view_id: DatabaseViewIdPB = data.into_inner();
  80. let editor = manager.open_database_view(view_id.as_ref()).await?;
  81. let sorts = RepeatedSortPB {
  82. items: editor.get_all_sorts(view_id.as_ref()).await?,
  83. };
  84. data_result_ok(sorts)
  85. }
  86. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  87. pub(crate) async fn delete_all_sorts_handler(
  88. data: AFPluginData<DatabaseViewIdPB>,
  89. manager: AFPluginState<Arc<DatabaseManager>>,
  90. ) -> Result<(), FlowyError> {
  91. let view_id: DatabaseViewIdPB = data.into_inner();
  92. let editor = manager.open_database_view(view_id.as_ref()).await?;
  93. editor.delete_all_sorts(view_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.view_id).await?;
  103. let field_revs = editor.get_field_revs(params.field_ids).await?;
  104. let repeated_field: RepeatedFieldPB = field_revs
  105. .into_iter()
  106. .map(FieldPB::from)
  107. .collect::<Vec<_>>()
  108. .into();
  109. data_result_ok(repeated_field)
  110. }
  111. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  112. pub(crate) async fn update_field_handler(
  113. data: AFPluginData<FieldChangesetPB>,
  114. manager: AFPluginState<Arc<DatabaseManager>>,
  115. ) -> Result<(), FlowyError> {
  116. let changeset: FieldChangesetParams = data.into_inner().try_into()?;
  117. let editor = manager.get_database_editor(&changeset.view_id).await?;
  118. editor.update_field(changeset).await?;
  119. Ok(())
  120. }
  121. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  122. pub(crate) async fn update_field_type_option_handler(
  123. data: AFPluginData<TypeOptionChangesetPB>,
  124. manager: AFPluginState<Arc<DatabaseManager>>,
  125. ) -> Result<(), FlowyError> {
  126. let params: TypeOptionChangesetParams = data.into_inner().try_into()?;
  127. let editor = manager.get_database_editor(&params.view_id).await?;
  128. let old_field_rev = editor.get_field_rev(&params.field_id).await;
  129. editor
  130. .update_field_type_option(
  131. &params.view_id,
  132. &params.field_id,
  133. params.type_option_data,
  134. old_field_rev,
  135. )
  136. .await?;
  137. Ok(())
  138. }
  139. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  140. pub(crate) async fn delete_field_handler(
  141. data: AFPluginData<DeleteFieldPayloadPB>,
  142. manager: AFPluginState<Arc<DatabaseManager>>,
  143. ) -> Result<(), FlowyError> {
  144. let params: FieldIdParams = data.into_inner().try_into()?;
  145. let editor = manager.get_database_editor(&params.view_id).await?;
  146. editor.delete_field(&params.field_id).await?;
  147. Ok(())
  148. }
  149. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  150. pub(crate) async fn switch_to_field_handler(
  151. data: AFPluginData<UpdateFieldTypePayloadPB>,
  152. manager: AFPluginState<Arc<DatabaseManager>>,
  153. ) -> Result<(), FlowyError> {
  154. let params: EditFieldParams = data.into_inner().try_into()?;
  155. let editor = manager.get_database_editor(&params.view_id).await?;
  156. let old_field_rev = editor.get_field_rev(&params.field_id).await;
  157. editor
  158. .switch_to_field_type(&params.field_id, &params.field_type)
  159. .await?;
  160. // Get the field_rev with field_id, if it doesn't exist, we create the default FieldRevision from the FieldType.
  161. let new_field_rev = editor
  162. .get_field_rev(&params.field_id)
  163. .await
  164. .unwrap_or(Arc::new(editor.next_field_rev(&params.field_type).await?));
  165. // Update the type-option data after the field type has been changed
  166. let type_option_data = get_type_option_data(&new_field_rev, &params.field_type).await?;
  167. editor
  168. .update_field_type_option(
  169. &params.view_id,
  170. &new_field_rev.id,
  171. type_option_data,
  172. old_field_rev,
  173. )
  174. .await?;
  175. Ok(())
  176. }
  177. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  178. pub(crate) async fn duplicate_field_handler(
  179. data: AFPluginData<DuplicateFieldPayloadPB>,
  180. manager: AFPluginState<Arc<DatabaseManager>>,
  181. ) -> Result<(), FlowyError> {
  182. let params: FieldIdParams = data.into_inner().try_into()?;
  183. let editor = manager.get_database_editor(&params.view_id).await?;
  184. editor.duplicate_field(&params.field_id).await?;
  185. Ok(())
  186. }
  187. /// Return the FieldTypeOptionData if the Field exists otherwise return record not found error.
  188. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  189. pub(crate) async fn get_field_type_option_data_handler(
  190. data: AFPluginData<TypeOptionPathPB>,
  191. manager: AFPluginState<Arc<DatabaseManager>>,
  192. ) -> DataResult<TypeOptionPB, FlowyError> {
  193. let params: TypeOptionPathParams = data.into_inner().try_into()?;
  194. let editor = manager.get_database_editor(&params.view_id).await?;
  195. match editor.get_field_rev(&params.field_id).await {
  196. None => Err(FlowyError::record_not_found()),
  197. Some(field_rev) => {
  198. let field_type = field_rev.ty.into();
  199. let type_option_data = get_type_option_data(&field_rev, &field_type).await?;
  200. let data = TypeOptionPB {
  201. view_id: params.view_id,
  202. field: field_rev.into(),
  203. type_option_data,
  204. };
  205. data_result_ok(data)
  206. },
  207. }
  208. }
  209. /// Create FieldMeta and save it. Return the FieldTypeOptionData.
  210. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  211. pub(crate) async fn create_field_type_option_data_handler(
  212. data: AFPluginData<CreateFieldPayloadPB>,
  213. manager: AFPluginState<Arc<DatabaseManager>>,
  214. ) -> DataResult<TypeOptionPB, FlowyError> {
  215. let params: CreateFieldParams = data.into_inner().try_into()?;
  216. let editor = manager.get_database_editor(&params.view_id).await?;
  217. let field_rev = editor
  218. .create_new_field_rev_with_type_option(&params.field_type, params.type_option_data)
  219. .await?;
  220. let field_type: FieldType = field_rev.ty.into();
  221. let type_option_data = get_type_option_data(&field_rev, &field_type).await?;
  222. data_result_ok(TypeOptionPB {
  223. view_id: params.view_id,
  224. field: field_rev.into(),
  225. type_option_data,
  226. })
  227. }
  228. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  229. pub(crate) async fn move_field_handler(
  230. data: AFPluginData<MoveFieldPayloadPB>,
  231. manager: AFPluginState<Arc<DatabaseManager>>,
  232. ) -> Result<(), FlowyError> {
  233. let params: MoveFieldParams = data.into_inner().try_into()?;
  234. let editor = manager.get_database_editor(&params.view_id).await?;
  235. editor.move_field(params).await?;
  236. Ok(())
  237. }
  238. /// The [FieldRevision] contains multiple data, each of them belongs to a specific FieldType.
  239. async fn get_type_option_data(
  240. field_rev: &FieldRevision,
  241. field_type: &FieldType,
  242. ) -> FlowyResult<Vec<u8>> {
  243. let s = field_rev
  244. .get_type_option_str(field_type)
  245. .map(|value| value.to_owned())
  246. .unwrap_or_else(|| {
  247. default_type_option_builder_from_type(field_type)
  248. .serializer()
  249. .json_str()
  250. });
  251. let field_type: FieldType = field_rev.ty.into();
  252. let builder = type_option_builder_from_json_str(&s, &field_type);
  253. let type_option_data = builder.serializer().protobuf_bytes().to_vec();
  254. Ok(type_option_data)
  255. }
  256. // #[tracing::instrument(level = "debug", skip(data, manager), err)]
  257. pub(crate) async fn get_row_handler(
  258. data: AFPluginData<RowIdPB>,
  259. manager: AFPluginState<Arc<DatabaseManager>>,
  260. ) -> DataResult<OptionalRowPB, FlowyError> {
  261. let params: RowIdParams = data.into_inner().try_into()?;
  262. let editor = manager.get_database_editor(&params.view_id).await?;
  263. let row = editor
  264. .get_row_rev(&params.row_id)
  265. .await?
  266. .map(make_row_from_row_rev);
  267. data_result_ok(OptionalRowPB { row })
  268. }
  269. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  270. pub(crate) async fn delete_row_handler(
  271. data: AFPluginData<RowIdPB>,
  272. manager: AFPluginState<Arc<DatabaseManager>>,
  273. ) -> Result<(), FlowyError> {
  274. let params: RowIdParams = data.into_inner().try_into()?;
  275. let editor = manager.get_database_editor(&params.view_id).await?;
  276. editor.delete_row(&params.row_id).await?;
  277. Ok(())
  278. }
  279. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  280. pub(crate) async fn duplicate_row_handler(
  281. data: AFPluginData<RowIdPB>,
  282. manager: AFPluginState<Arc<DatabaseManager>>,
  283. ) -> Result<(), FlowyError> {
  284. let params: RowIdParams = data.into_inner().try_into()?;
  285. let editor = manager.get_database_editor(&params.view_id).await?;
  286. editor
  287. .duplicate_row(&params.view_id, &params.row_id)
  288. .await?;
  289. Ok(())
  290. }
  291. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  292. pub(crate) async fn move_row_handler(
  293. data: AFPluginData<MoveRowPayloadPB>,
  294. manager: AFPluginState<Arc<DatabaseManager>>,
  295. ) -> Result<(), FlowyError> {
  296. let params: MoveRowParams = data.into_inner().try_into()?;
  297. let editor = manager.get_database_editor(&params.view_id).await?;
  298. editor.move_row(params).await?;
  299. Ok(())
  300. }
  301. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  302. pub(crate) async fn create_row_handler(
  303. data: AFPluginData<CreateRowPayloadPB>,
  304. manager: AFPluginState<Arc<DatabaseManager>>,
  305. ) -> DataResult<RowPB, FlowyError> {
  306. let params: CreateRowParams = data.into_inner().try_into()?;
  307. let editor = manager.get_database_editor(params.view_id.as_ref()).await?;
  308. let row = editor.create_row(params).await?;
  309. data_result_ok(row)
  310. }
  311. #[tracing::instrument(level = "trace", skip_all, err)]
  312. pub(crate) async fn get_cell_handler(
  313. data: AFPluginData<CellIdPB>,
  314. manager: AFPluginState<Arc<DatabaseManager>>,
  315. ) -> DataResult<CellPB, FlowyError> {
  316. let params: CellIdParams = data.into_inner().try_into()?;
  317. let editor = manager.get_database_editor(&params.view_id).await?;
  318. match editor.get_cell(&params).await {
  319. None => data_result_ok(CellPB::empty(&params.field_id, &params.row_id)),
  320. Some(cell) => data_result_ok(cell),
  321. }
  322. }
  323. #[tracing::instrument(level = "trace", skip_all, err)]
  324. pub(crate) async fn update_cell_handler(
  325. data: AFPluginData<CellChangesetPB>,
  326. manager: AFPluginState<Arc<DatabaseManager>>,
  327. ) -> Result<(), FlowyError> {
  328. let changeset: CellChangesetPB = data.into_inner();
  329. let editor = manager.get_database_editor(&changeset.view_id).await?;
  330. editor
  331. .update_cell_with_changeset(
  332. &changeset.row_id,
  333. &changeset.field_id,
  334. changeset.type_cell_data,
  335. )
  336. .await?;
  337. Ok(())
  338. }
  339. #[tracing::instrument(level = "trace", skip_all, err)]
  340. pub(crate) async fn new_select_option_handler(
  341. data: AFPluginData<CreateSelectOptionPayloadPB>,
  342. manager: AFPluginState<Arc<DatabaseManager>>,
  343. ) -> DataResult<SelectOptionPB, FlowyError> {
  344. let params: CreateSelectOptionParams = data.into_inner().try_into()?;
  345. let editor = manager.get_database_editor(&params.view_id).await?;
  346. match editor.get_field_rev(&params.field_id).await {
  347. None => Err(ErrorCode::InvalidData.into()),
  348. Some(field_rev) => {
  349. let type_option = select_type_option_from_field_rev(&field_rev)?;
  350. let select_option = type_option.create_option(&params.option_name);
  351. data_result_ok(select_option)
  352. },
  353. }
  354. }
  355. #[tracing::instrument(level = "trace", skip_all, err)]
  356. pub(crate) async fn update_select_option_handler(
  357. data: AFPluginData<SelectOptionChangesetPB>,
  358. manager: AFPluginState<Arc<DatabaseManager>>,
  359. ) -> Result<(), FlowyError> {
  360. let changeset: SelectOptionChangeset = data.into_inner().try_into()?;
  361. let editor = manager
  362. .get_database_editor(&changeset.cell_path.view_id)
  363. .await?;
  364. let field_id = changeset.cell_path.field_id.clone();
  365. let (tx, rx) = tokio::sync::oneshot::channel();
  366. editor
  367. .modify_field_rev(&changeset.cell_path.view_id, &field_id, |field_rev| {
  368. let mut type_option = select_type_option_from_field_rev(field_rev)?;
  369. let mut cell_changeset_str = None;
  370. let mut is_changed = None;
  371. for option in changeset.insert_options {
  372. cell_changeset_str = Some(
  373. SelectOptionCellChangeset::from_insert_option_id(&option.id).to_cell_changeset_str(),
  374. );
  375. type_option.insert_option(option);
  376. is_changed = Some(());
  377. }
  378. for option in changeset.update_options {
  379. type_option.insert_option(option);
  380. is_changed = Some(());
  381. }
  382. for option in changeset.delete_options {
  383. cell_changeset_str = Some(
  384. SelectOptionCellChangeset::from_delete_option_id(&option.id).to_cell_changeset_str(),
  385. );
  386. type_option.delete_option(option);
  387. is_changed = Some(());
  388. }
  389. if is_changed.is_some() {
  390. field_rev.insert_type_option(&*type_option);
  391. }
  392. let _ = tx.send(cell_changeset_str);
  393. Ok(is_changed)
  394. })
  395. .await?;
  396. if let Ok(Some(cell_changeset_str)) = rx.await {
  397. match editor
  398. .update_cell_with_changeset(
  399. &changeset.cell_path.row_id,
  400. &changeset.cell_path.field_id,
  401. cell_changeset_str,
  402. )
  403. .await
  404. {
  405. Ok(_) => {},
  406. Err(e) => tracing::error!("{}", e),
  407. }
  408. }
  409. Ok(())
  410. }
  411. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  412. pub(crate) async fn get_select_option_handler(
  413. data: AFPluginData<CellIdPB>,
  414. manager: AFPluginState<Arc<DatabaseManager>>,
  415. ) -> DataResult<SelectOptionCellDataPB, FlowyError> {
  416. let params: CellIdParams = data.into_inner().try_into()?;
  417. let editor = manager.get_database_editor(&params.view_id).await?;
  418. match editor.get_field_rev(&params.field_id).await {
  419. None => {
  420. tracing::error!(
  421. "Can't find the select option field with id: {}",
  422. params.field_id
  423. );
  424. data_result_ok(SelectOptionCellDataPB::default())
  425. },
  426. Some(field_rev) => {
  427. //
  428. let cell_rev = editor
  429. .get_cell_rev(&params.row_id, &params.field_id)
  430. .await?;
  431. let type_option = select_type_option_from_field_rev(&field_rev)?;
  432. let type_cell_data: TypeCellData = match cell_rev {
  433. None => TypeCellData {
  434. cell_str: "".to_string(),
  435. field_type: field_rev.ty.into(),
  436. },
  437. Some(cell_rev) => cell_rev.try_into()?,
  438. };
  439. let ids = SelectOptionIds::from_cell_str(&type_cell_data.cell_str)?;
  440. let selected_options = type_option.get_selected_options(ids);
  441. data_result_ok(selected_options)
  442. },
  443. }
  444. }
  445. #[tracing::instrument(level = "trace", skip_all, err)]
  446. pub(crate) async fn update_select_option_cell_handler(
  447. data: AFPluginData<SelectOptionCellChangesetPB>,
  448. manager: AFPluginState<Arc<DatabaseManager>>,
  449. ) -> Result<(), FlowyError> {
  450. let params: SelectOptionCellChangesetParams = data.into_inner().try_into()?;
  451. let editor = manager
  452. .get_database_editor(&params.cell_identifier.view_id)
  453. .await?;
  454. let changeset = SelectOptionCellChangeset {
  455. insert_option_ids: params.insert_option_ids,
  456. delete_option_ids: params.delete_option_ids,
  457. };
  458. editor
  459. .update_cell_with_changeset(
  460. &params.cell_identifier.row_id,
  461. &params.cell_identifier.field_id,
  462. changeset,
  463. )
  464. .await?;
  465. Ok(())
  466. }
  467. #[tracing::instrument(level = "trace", skip_all, err)]
  468. pub(crate) async fn update_date_cell_handler(
  469. data: AFPluginData<DateChangesetPB>,
  470. manager: AFPluginState<Arc<DatabaseManager>>,
  471. ) -> Result<(), FlowyError> {
  472. let data = data.into_inner();
  473. let cell_path: CellIdParams = data.cell_path.try_into()?;
  474. let cell_changeset = DateCellChangeset {
  475. date: data.date,
  476. time: data.time,
  477. include_time: data.include_time,
  478. is_utc: data.is_utc,
  479. };
  480. let editor = manager.get_database_editor(&cell_path.view_id).await?;
  481. editor
  482. .update_cell(cell_path.row_id, cell_path.field_id, cell_changeset)
  483. .await?;
  484. Ok(())
  485. }
  486. #[tracing::instrument(level = "trace", skip_all, err)]
  487. pub(crate) async fn get_groups_handler(
  488. data: AFPluginData<DatabaseViewIdPB>,
  489. manager: AFPluginState<Arc<DatabaseManager>>,
  490. ) -> DataResult<RepeatedGroupPB, FlowyError> {
  491. let params: DatabaseViewIdPB = data.into_inner();
  492. let editor = manager.get_database_editor(&params.value).await?;
  493. let groups = editor.load_groups(&params.value).await?;
  494. data_result_ok(groups)
  495. }
  496. #[tracing::instrument(level = "trace", skip_all, err)]
  497. pub(crate) async fn get_group_handler(
  498. data: AFPluginData<DatabaseGroupIdPB>,
  499. manager: AFPluginState<Arc<DatabaseManager>>,
  500. ) -> DataResult<GroupPB, FlowyError> {
  501. let params: DatabaseGroupIdParams = data.into_inner().try_into()?;
  502. let editor = manager.get_database_editor(&params.view_id).await?;
  503. let group = editor.get_group(&params.view_id, &params.group_id).await?;
  504. data_result_ok(group)
  505. }
  506. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  507. pub(crate) async fn move_group_handler(
  508. data: AFPluginData<MoveGroupPayloadPB>,
  509. manager: AFPluginState<Arc<DatabaseManager>>,
  510. ) -> FlowyResult<()> {
  511. let params: MoveGroupParams = data.into_inner().try_into()?;
  512. let editor = manager.get_database_editor(params.view_id.as_ref()).await?;
  513. editor.move_group(params).await?;
  514. Ok(())
  515. }
  516. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  517. pub(crate) async fn move_group_row_handler(
  518. data: AFPluginData<MoveGroupRowPayloadPB>,
  519. manager: AFPluginState<Arc<DatabaseManager>>,
  520. ) -> FlowyResult<()> {
  521. let params: MoveGroupRowParams = data.into_inner().try_into()?;
  522. let editor = manager.get_database_editor(params.view_id.as_ref()).await?;
  523. editor.move_group_row(params).await?;
  524. Ok(())
  525. }
  526. #[tracing::instrument(level = "debug", skip(manager), err)]
  527. pub(crate) async fn get_databases_handler(
  528. manager: AFPluginState<Arc<DatabaseManager>>,
  529. ) -> DataResult<RepeatedDatabaseDescriptionPB, FlowyError> {
  530. let items = manager
  531. .get_databases()
  532. .await?
  533. .into_iter()
  534. .map(|database_info| DatabaseDescriptionPB {
  535. name: database_info.name,
  536. database_id: database_info.database_id,
  537. })
  538. .collect::<Vec<DatabaseDescriptionPB>>();
  539. data_result_ok(RepeatedDatabaseDescriptionPB { items })
  540. }
  541. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  542. pub(crate) async fn set_layout_setting_handler(
  543. data: AFPluginData<UpdateLayoutSettingPB>,
  544. manager: AFPluginState<Arc<DatabaseManager>>,
  545. ) -> FlowyResult<()> {
  546. let params: UpdateLayoutSettingParams = data.into_inner().try_into()?;
  547. let database_editor = manager.get_database_editor(params.view_id.as_ref()).await?;
  548. database_editor
  549. .set_layout_setting(&params.view_id, params.layout_setting)
  550. .await?;
  551. Ok(())
  552. }
  553. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  554. pub(crate) async fn get_layout_setting_handler(
  555. data: AFPluginData<DatabaseLayoutIdPB>,
  556. manager: AFPluginState<Arc<DatabaseManager>>,
  557. ) -> DataResult<LayoutSettingPB, FlowyError> {
  558. let params = data.into_inner();
  559. let database_editor = manager.get_database_editor(&params.view_id).await?;
  560. let layout_setting = database_editor
  561. .get_layout_setting(&params.view_id, params.layout)
  562. .await?;
  563. data_result_ok(layout_setting.into())
  564. }
  565. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  566. pub(crate) async fn get_calendar_events_handler(
  567. data: AFPluginData<CalendarEventRequestPB>,
  568. manager: AFPluginState<Arc<DatabaseManager>>,
  569. ) -> DataResult<RepeatedCalendarEventPB, FlowyError> {
  570. let params: CalendarEventRequestParams = data.into_inner().try_into()?;
  571. let database_editor = manager.get_database_editor(&params.view_id).await?;
  572. let events = database_editor
  573. .get_all_calendar_events(&params.view_id)
  574. .await;
  575. data_result_ok(RepeatedCalendarEventPB { items: events })
  576. }
  577. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  578. pub(crate) async fn get_calendar_event_handler(
  579. data: AFPluginData<RowIdPB>,
  580. manager: AFPluginState<Arc<DatabaseManager>>,
  581. ) -> DataResult<CalendarEventPB, FlowyError> {
  582. let params: RowIdParams = data.into_inner().try_into()?;
  583. let database_editor = manager.get_database_editor(&params.view_id).await?;
  584. let event = database_editor
  585. .get_calendar_event(&params.view_id, &params.row_id)
  586. .await;
  587. match event {
  588. None => Err(FlowyError::record_not_found()),
  589. Some(event) => data_result_ok(event),
  590. }
  591. }