event_handler.rs 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701
  1. use collab_database::database::gen_row_id;
  2. use std::sync::Arc;
  3. use collab_database::rows::RowId;
  4. use collab_database::views::DatabaseLayout;
  5. use lib_infra::util::timestamp;
  6. use flowy_error::{FlowyError, FlowyResult};
  7. use lib_dispatch::prelude::{data_result_ok, AFPluginData, AFPluginState, DataResult};
  8. use crate::entities::*;
  9. use crate::manager::DatabaseManager2;
  10. use crate::services::cell::CellBuilder;
  11. use crate::services::field::checklist_type_option::ChecklistCellChangeset;
  12. use crate::services::field::{
  13. type_option_data_from_pb_or_default, DateCellChangeset, SelectOptionCellChangeset,
  14. };
  15. use crate::services::group::{GroupChangeset, GroupSettingChangeset};
  16. #[tracing::instrument(level = "trace", skip_all, err)]
  17. pub(crate) async fn get_database_data_handler(
  18. data: AFPluginData<DatabaseViewIdPB>,
  19. manager: AFPluginState<Arc<DatabaseManager2>>,
  20. ) -> DataResult<DatabasePB, FlowyError> {
  21. let view_id: DatabaseViewIdPB = data.into_inner();
  22. let database_editor = manager.get_database_with_view_id(view_id.as_ref()).await?;
  23. let data = database_editor.get_database_data(view_id.as_ref()).await;
  24. data_result_ok(data)
  25. }
  26. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  27. pub(crate) async fn get_database_setting_handler(
  28. data: AFPluginData<DatabaseViewIdPB>,
  29. manager: AFPluginState<Arc<DatabaseManager2>>,
  30. ) -> DataResult<DatabaseViewSettingPB, FlowyError> {
  31. let view_id: DatabaseViewIdPB = data.into_inner();
  32. let database_editor = manager.get_database_with_view_id(view_id.as_ref()).await?;
  33. let data = database_editor
  34. .get_database_view_setting(view_id.as_ref())
  35. .await?;
  36. data_result_ok(data)
  37. }
  38. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  39. pub(crate) async fn update_database_setting_handler(
  40. data: AFPluginData<DatabaseSettingChangesetPB>,
  41. manager: AFPluginState<Arc<DatabaseManager2>>,
  42. ) -> Result<(), FlowyError> {
  43. let params: DatabaseSettingChangesetParams = data.into_inner().try_into()?;
  44. let editor = manager.get_database_with_view_id(&params.view_id).await?;
  45. if let Some(update_filter) = params.insert_filter {
  46. editor.create_or_update_filter(update_filter).await?;
  47. }
  48. if let Some(delete_filter) = params.delete_filter {
  49. editor.delete_filter(delete_filter).await?;
  50. }
  51. if let Some(update_sort) = params.alert_sort {
  52. let _ = editor.create_or_update_sort(update_sort).await?;
  53. }
  54. if let Some(delete_sort) = params.delete_sort {
  55. editor.delete_sort(delete_sort).await?;
  56. }
  57. Ok(())
  58. }
  59. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  60. pub(crate) async fn get_all_filters_handler(
  61. data: AFPluginData<DatabaseViewIdPB>,
  62. manager: AFPluginState<Arc<DatabaseManager2>>,
  63. ) -> DataResult<RepeatedFilterPB, FlowyError> {
  64. let view_id: DatabaseViewIdPB = data.into_inner();
  65. let database_editor = manager.get_database_with_view_id(view_id.as_ref()).await?;
  66. let filters = database_editor.get_all_filters(view_id.as_ref()).await;
  67. data_result_ok(filters)
  68. }
  69. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  70. pub(crate) async fn get_all_sorts_handler(
  71. data: AFPluginData<DatabaseViewIdPB>,
  72. manager: AFPluginState<Arc<DatabaseManager2>>,
  73. ) -> DataResult<RepeatedSortPB, FlowyError> {
  74. let view_id: DatabaseViewIdPB = data.into_inner();
  75. let database_editor = manager.get_database_with_view_id(view_id.as_ref()).await?;
  76. let sorts = database_editor.get_all_sorts(view_id.as_ref()).await;
  77. data_result_ok(sorts)
  78. }
  79. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  80. pub(crate) async fn delete_all_sorts_handler(
  81. data: AFPluginData<DatabaseViewIdPB>,
  82. manager: AFPluginState<Arc<DatabaseManager2>>,
  83. ) -> Result<(), FlowyError> {
  84. let view_id: DatabaseViewIdPB = data.into_inner();
  85. let database_editor = manager.get_database_with_view_id(view_id.as_ref()).await?;
  86. database_editor.delete_all_sorts(view_id.as_ref()).await;
  87. Ok(())
  88. }
  89. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  90. pub(crate) async fn get_fields_handler(
  91. data: AFPluginData<GetFieldPayloadPB>,
  92. manager: AFPluginState<Arc<DatabaseManager2>>,
  93. ) -> DataResult<RepeatedFieldPB, FlowyError> {
  94. let params: GetFieldParams = data.into_inner().try_into()?;
  95. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  96. let fields = database_editor
  97. .get_fields(&params.view_id, params.field_ids)
  98. .into_iter()
  99. .map(FieldPB::from)
  100. .collect::<Vec<FieldPB>>()
  101. .into();
  102. data_result_ok(fields)
  103. }
  104. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  105. pub(crate) async fn update_field_handler(
  106. data: AFPluginData<FieldChangesetPB>,
  107. manager: AFPluginState<Arc<DatabaseManager2>>,
  108. ) -> Result<(), FlowyError> {
  109. let params: FieldChangesetParams = data.into_inner().try_into()?;
  110. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  111. database_editor.update_field(params).await?;
  112. Ok(())
  113. }
  114. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  115. pub(crate) async fn update_field_type_option_handler(
  116. data: AFPluginData<TypeOptionChangesetPB>,
  117. manager: AFPluginState<Arc<DatabaseManager2>>,
  118. ) -> Result<(), FlowyError> {
  119. let params: TypeOptionChangesetParams = data.into_inner().try_into()?;
  120. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  121. if let Some(old_field) = database_editor.get_field(&params.field_id) {
  122. let field_type = FieldType::from(old_field.field_type);
  123. let type_option_data =
  124. type_option_data_from_pb_or_default(params.type_option_data, &field_type);
  125. database_editor
  126. .update_field_type_option(
  127. &params.view_id,
  128. &params.field_id,
  129. type_option_data,
  130. old_field,
  131. )
  132. .await?;
  133. }
  134. Ok(())
  135. }
  136. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  137. pub(crate) async fn delete_field_handler(
  138. data: AFPluginData<DeleteFieldPayloadPB>,
  139. manager: AFPluginState<Arc<DatabaseManager2>>,
  140. ) -> Result<(), FlowyError> {
  141. let params: FieldIdParams = data.into_inner().try_into()?;
  142. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  143. database_editor.delete_field(&params.field_id).await?;
  144. Ok(())
  145. }
  146. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  147. pub(crate) async fn switch_to_field_handler(
  148. data: AFPluginData<UpdateFieldTypePayloadPB>,
  149. manager: AFPluginState<Arc<DatabaseManager2>>,
  150. ) -> Result<(), FlowyError> {
  151. let params: EditFieldParams = data.into_inner().try_into()?;
  152. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  153. let old_field = database_editor.get_field(&params.field_id);
  154. database_editor
  155. .switch_to_field_type(&params.field_id, &params.field_type)
  156. .await?;
  157. if let Some(new_type_option) = database_editor
  158. .get_field(&params.field_id)
  159. .map(|field| field.get_any_type_option(field.field_type))
  160. {
  161. match (old_field, new_type_option) {
  162. (Some(old_field), Some(new_type_option)) => {
  163. database_editor
  164. .update_field_type_option(
  165. &params.view_id,
  166. &params.field_id,
  167. new_type_option,
  168. old_field,
  169. )
  170. .await?;
  171. },
  172. _ => {
  173. tracing::warn!("Old field and the new type option should not be empty");
  174. },
  175. }
  176. }
  177. Ok(())
  178. }
  179. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  180. pub(crate) async fn duplicate_field_handler(
  181. data: AFPluginData<DuplicateFieldPayloadPB>,
  182. manager: AFPluginState<Arc<DatabaseManager2>>,
  183. ) -> Result<(), FlowyError> {
  184. let params: FieldIdParams = data.into_inner().try_into()?;
  185. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  186. database_editor
  187. .duplicate_field(&params.view_id, &params.field_id)
  188. .await?;
  189. Ok(())
  190. }
  191. /// Return the FieldTypeOptionData if the Field exists otherwise return record not found error.
  192. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  193. pub(crate) async fn get_field_type_option_data_handler(
  194. data: AFPluginData<TypeOptionPathPB>,
  195. manager: AFPluginState<Arc<DatabaseManager2>>,
  196. ) -> DataResult<TypeOptionPB, FlowyError> {
  197. let params: TypeOptionPathParams = data.into_inner().try_into()?;
  198. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  199. if let Some((field, data)) = database_editor
  200. .get_field_type_option_data(&params.field_id)
  201. .await
  202. {
  203. let data = TypeOptionPB {
  204. view_id: params.view_id,
  205. field: FieldPB::from(field),
  206. type_option_data: data.to_vec(),
  207. };
  208. data_result_ok(data)
  209. } else {
  210. Err(FlowyError::record_not_found())
  211. }
  212. }
  213. /// Create FieldMeta and save it. Return the FieldTypeOptionData.
  214. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  215. pub(crate) async fn create_field_type_option_data_handler(
  216. data: AFPluginData<CreateFieldPayloadPB>,
  217. manager: AFPluginState<Arc<DatabaseManager2>>,
  218. ) -> DataResult<TypeOptionPB, FlowyError> {
  219. let params: CreateFieldParams = data.into_inner().try_into()?;
  220. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  221. let (field, data) = database_editor
  222. .create_field_with_type_option(&params.view_id, &params.field_type, params.type_option_data)
  223. .await;
  224. let data = TypeOptionPB {
  225. view_id: params.view_id,
  226. field: FieldPB::from(field),
  227. type_option_data: data.to_vec(),
  228. };
  229. data_result_ok(data)
  230. }
  231. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  232. pub(crate) async fn move_field_handler(
  233. data: AFPluginData<MoveFieldPayloadPB>,
  234. manager: AFPluginState<Arc<DatabaseManager2>>,
  235. ) -> Result<(), FlowyError> {
  236. let params: MoveFieldParams = data.into_inner().try_into()?;
  237. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  238. database_editor
  239. .move_field(
  240. &params.view_id,
  241. &params.field_id,
  242. params.from_index,
  243. params.to_index,
  244. )
  245. .await?;
  246. Ok(())
  247. }
  248. // #[tracing::instrument(level = "debug", skip(data, manager), err)]
  249. pub(crate) async fn get_row_handler(
  250. data: AFPluginData<RowIdPB>,
  251. manager: AFPluginState<Arc<DatabaseManager2>>,
  252. ) -> DataResult<OptionalRowPB, FlowyError> {
  253. let params: RowIdParams = data.into_inner().try_into()?;
  254. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  255. let row = database_editor.get_row(&params.row_id).map(RowPB::from);
  256. data_result_ok(OptionalRowPB { row })
  257. }
  258. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  259. pub(crate) async fn delete_row_handler(
  260. data: AFPluginData<RowIdPB>,
  261. manager: AFPluginState<Arc<DatabaseManager2>>,
  262. ) -> Result<(), FlowyError> {
  263. let params: RowIdParams = data.into_inner().try_into()?;
  264. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  265. database_editor.delete_row(&params.row_id).await;
  266. Ok(())
  267. }
  268. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  269. pub(crate) async fn duplicate_row_handler(
  270. data: AFPluginData<RowIdPB>,
  271. manager: AFPluginState<Arc<DatabaseManager2>>,
  272. ) -> Result<(), FlowyError> {
  273. let params: RowIdParams = data.into_inner().try_into()?;
  274. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  275. database_editor
  276. .duplicate_row(&params.view_id, params.group_id, &params.row_id)
  277. .await;
  278. Ok(())
  279. }
  280. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  281. pub(crate) async fn move_row_handler(
  282. data: AFPluginData<MoveRowPayloadPB>,
  283. manager: AFPluginState<Arc<DatabaseManager2>>,
  284. ) -> Result<(), FlowyError> {
  285. let params: MoveRowParams = data.into_inner().try_into()?;
  286. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  287. database_editor
  288. .move_row(&params.view_id, params.from_row_id, params.to_row_id)
  289. .await;
  290. Ok(())
  291. }
  292. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  293. pub(crate) async fn create_row_handler(
  294. data: AFPluginData<CreateRowPayloadPB>,
  295. manager: AFPluginState<Arc<DatabaseManager2>>,
  296. ) -> DataResult<RowPB, FlowyError> {
  297. let params: CreateRowParams = data.into_inner().try_into()?;
  298. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  299. let fields = database_editor.get_fields(&params.view_id, None);
  300. let cells =
  301. CellBuilder::with_cells(params.cell_data_by_field_id.unwrap_or_default(), &fields).build();
  302. let view_id = params.view_id;
  303. let group_id = params.group_id;
  304. let params = collab_database::rows::CreateRowParams {
  305. id: gen_row_id(),
  306. cells,
  307. height: 60,
  308. visibility: true,
  309. prev_row_id: params.start_row_id,
  310. timestamp: timestamp(),
  311. };
  312. match database_editor
  313. .create_row(&view_id, group_id, params)
  314. .await?
  315. {
  316. None => Err(FlowyError::internal().context("Create row fail")),
  317. Some(row) => data_result_ok(RowPB::from(row)),
  318. }
  319. }
  320. // #[tracing::instrument(level = "trace", skip_all, err)]
  321. pub(crate) async fn get_cell_handler(
  322. data: AFPluginData<CellIdPB>,
  323. manager: AFPluginState<Arc<DatabaseManager2>>,
  324. ) -> DataResult<CellPB, FlowyError> {
  325. let params: CellIdParams = data.into_inner().try_into()?;
  326. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  327. let cell = database_editor
  328. .get_cell(&params.field_id, params.row_id)
  329. .await;
  330. data_result_ok(cell)
  331. }
  332. #[tracing::instrument(level = "debug", skip_all, err)]
  333. pub(crate) async fn update_cell_handler(
  334. data: AFPluginData<CellChangesetPB>,
  335. manager: AFPluginState<Arc<DatabaseManager2>>,
  336. ) -> Result<(), FlowyError> {
  337. let params: CellChangesetPB = data.into_inner();
  338. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  339. database_editor
  340. .update_cell_with_changeset(
  341. &params.view_id,
  342. RowId::from(params.row_id),
  343. &params.field_id,
  344. params.cell_changeset.clone(),
  345. )
  346. .await?;
  347. Ok(())
  348. }
  349. #[tracing::instrument(level = "trace", skip_all, err)]
  350. pub(crate) async fn new_select_option_handler(
  351. data: AFPluginData<CreateSelectOptionPayloadPB>,
  352. manager: AFPluginState<Arc<DatabaseManager2>>,
  353. ) -> DataResult<SelectOptionPB, FlowyError> {
  354. let params: CreateSelectOptionParams = data.into_inner().try_into()?;
  355. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  356. let result = database_editor
  357. .create_select_option(&params.field_id, params.option_name)
  358. .await;
  359. match result {
  360. None => {
  361. Err(FlowyError::record_not_found().context("Create select option fail. Can't find the field"))
  362. },
  363. Some(pb) => data_result_ok(pb),
  364. }
  365. }
  366. #[tracing::instrument(level = "trace", skip_all, err)]
  367. pub(crate) async fn insert_or_update_select_option_handler(
  368. data: AFPluginData<RepeatedSelectOptionPayload>,
  369. manager: AFPluginState<Arc<DatabaseManager2>>,
  370. ) -> Result<(), FlowyError> {
  371. let params = data.into_inner();
  372. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  373. database_editor
  374. .insert_select_options(
  375. &params.view_id,
  376. &params.field_id,
  377. RowId::from(params.row_id),
  378. params.items,
  379. )
  380. .await?;
  381. Ok(())
  382. }
  383. #[tracing::instrument(level = "trace", skip_all, err)]
  384. pub(crate) async fn delete_select_option_handler(
  385. data: AFPluginData<RepeatedSelectOptionPayload>,
  386. manager: AFPluginState<Arc<DatabaseManager2>>,
  387. ) -> Result<(), FlowyError> {
  388. let params = data.into_inner();
  389. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  390. database_editor
  391. .delete_select_options(
  392. &params.view_id,
  393. &params.field_id,
  394. RowId::from(params.row_id),
  395. params.items,
  396. )
  397. .await?;
  398. Ok(())
  399. }
  400. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  401. pub(crate) async fn get_select_option_handler(
  402. data: AFPluginData<CellIdPB>,
  403. manager: AFPluginState<Arc<DatabaseManager2>>,
  404. ) -> DataResult<SelectOptionCellDataPB, FlowyError> {
  405. let params: CellIdParams = data.into_inner().try_into()?;
  406. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  407. let options = database_editor
  408. .get_select_options(params.row_id, &params.field_id)
  409. .await;
  410. data_result_ok(options)
  411. }
  412. #[tracing::instrument(level = "trace", skip_all, err)]
  413. pub(crate) async fn update_select_option_cell_handler(
  414. data: AFPluginData<SelectOptionCellChangesetPB>,
  415. manager: AFPluginState<Arc<DatabaseManager2>>,
  416. ) -> Result<(), FlowyError> {
  417. let params: SelectOptionCellChangesetParams = data.into_inner().try_into()?;
  418. let database_editor = manager
  419. .get_database_with_view_id(&params.cell_identifier.view_id)
  420. .await?;
  421. let changeset = SelectOptionCellChangeset {
  422. insert_option_ids: params.insert_option_ids,
  423. delete_option_ids: params.delete_option_ids,
  424. };
  425. database_editor
  426. .update_cell_with_changeset(
  427. &params.cell_identifier.view_id,
  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 get_checklist_cell_data_handler(
  437. data: AFPluginData<CellIdPB>,
  438. manager: AFPluginState<Arc<DatabaseManager2>>,
  439. ) -> DataResult<ChecklistCellDataPB, FlowyError> {
  440. let params: CellIdParams = data.into_inner().try_into()?;
  441. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  442. let data = database_editor
  443. .get_checklist_option(params.row_id, &params.field_id)
  444. .await;
  445. data_result_ok(data)
  446. }
  447. #[tracing::instrument(level = "trace", skip_all, err)]
  448. pub(crate) async fn update_checklist_cell_handler(
  449. data: AFPluginData<ChecklistCellDataChangesetPB>,
  450. manager: AFPluginState<Arc<DatabaseManager2>>,
  451. ) -> Result<(), FlowyError> {
  452. let params: ChecklistCellDataChangesetParams = data.into_inner().try_into()?;
  453. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  454. let changeset = ChecklistCellChangeset {
  455. insert_options: params.insert_options,
  456. selected_option_ids: params.selected_option_ids,
  457. delete_option_ids: params.delete_option_ids,
  458. update_options: params.update_options,
  459. };
  460. database_editor
  461. .set_checklist_options(&params.view_id, params.row_id, &params.field_id, changeset)
  462. .await?;
  463. Ok(())
  464. }
  465. #[tracing::instrument(level = "trace", skip_all, err)]
  466. pub(crate) async fn update_date_cell_handler(
  467. data: AFPluginData<DateChangesetPB>,
  468. manager: AFPluginState<Arc<DatabaseManager2>>,
  469. ) -> Result<(), FlowyError> {
  470. let data = data.into_inner();
  471. let cell_id: CellIdParams = data.cell_path.try_into()?;
  472. let cell_changeset = DateCellChangeset {
  473. date: data.date,
  474. time: data.time,
  475. include_time: data.include_time,
  476. };
  477. let database_editor = manager.get_database_with_view_id(&cell_id.view_id).await?;
  478. database_editor
  479. .update_cell_with_changeset(
  480. &cell_id.view_id,
  481. cell_id.row_id,
  482. &cell_id.field_id,
  483. cell_changeset,
  484. )
  485. .await?;
  486. Ok(())
  487. }
  488. #[tracing::instrument(level = "trace", skip_all, err)]
  489. pub(crate) async fn get_groups_handler(
  490. data: AFPluginData<DatabaseViewIdPB>,
  491. manager: AFPluginState<Arc<DatabaseManager2>>,
  492. ) -> DataResult<RepeatedGroupPB, FlowyError> {
  493. let params: DatabaseViewIdPB = data.into_inner();
  494. let database_editor = manager.get_database_with_view_id(params.as_ref()).await?;
  495. let groups = database_editor.load_groups(params.as_ref()).await?;
  496. data_result_ok(groups)
  497. }
  498. #[tracing::instrument(level = "trace", skip_all, err)]
  499. pub(crate) async fn get_group_handler(
  500. data: AFPluginData<DatabaseGroupIdPB>,
  501. manager: AFPluginState<Arc<DatabaseManager2>>,
  502. ) -> DataResult<GroupPB, FlowyError> {
  503. let params: DatabaseGroupIdParams = data.into_inner().try_into()?;
  504. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  505. let group = database_editor
  506. .get_group(&params.view_id, &params.group_id)
  507. .await?;
  508. data_result_ok(group)
  509. }
  510. #[tracing::instrument(level = "trace", skip_all, err)]
  511. pub(crate) async fn set_group_by_field_handler(
  512. data: AFPluginData<GroupByFieldPayloadPB>,
  513. manager: AFPluginState<Arc<DatabaseManager2>>,
  514. ) -> FlowyResult<()> {
  515. let params: GroupByFieldParams = data.into_inner().try_into()?;
  516. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  517. database_editor
  518. .set_group_by_field(&params.view_id, &params.field_id)
  519. .await?;
  520. Ok(())
  521. }
  522. #[tracing::instrument(level = "trace", skip_all, err)]
  523. pub(crate) async fn update_group_handler(
  524. data: AFPluginData<UpdateGroupPB>,
  525. manager: AFPluginState<Arc<DatabaseManager2>>,
  526. ) -> FlowyResult<()> {
  527. let params: UpdateGroupParams = data.into_inner().try_into()?;
  528. let view_id = params.view_id.clone();
  529. let database_editor = manager.get_database_with_view_id(&view_id).await?;
  530. let group_setting_changeset = GroupSettingChangeset {
  531. update_groups: vec![GroupChangeset::from(params)],
  532. };
  533. database_editor
  534. .update_group_setting(&view_id, group_setting_changeset)
  535. .await?;
  536. Ok(())
  537. }
  538. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  539. pub(crate) async fn move_group_handler(
  540. data: AFPluginData<MoveGroupPayloadPB>,
  541. manager: AFPluginState<Arc<DatabaseManager2>>,
  542. ) -> FlowyResult<()> {
  543. let params: MoveGroupParams = data.into_inner().try_into()?;
  544. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  545. database_editor
  546. .move_group(&params.view_id, &params.from_group_id, &params.to_group_id)
  547. .await?;
  548. Ok(())
  549. }
  550. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  551. pub(crate) async fn move_group_row_handler(
  552. data: AFPluginData<MoveGroupRowPayloadPB>,
  553. manager: AFPluginState<Arc<DatabaseManager2>>,
  554. ) -> FlowyResult<()> {
  555. let params: MoveGroupRowParams = data.into_inner().try_into()?;
  556. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  557. database_editor
  558. .move_group_row(
  559. &params.view_id,
  560. &params.to_group_id,
  561. params.from_row_id,
  562. params.to_row_id,
  563. )
  564. .await?;
  565. Ok(())
  566. }
  567. #[tracing::instrument(level = "debug", skip(manager), err)]
  568. pub(crate) async fn get_databases_handler(
  569. manager: AFPluginState<Arc<DatabaseManager2>>,
  570. ) -> DataResult<RepeatedDatabaseDescriptionPB, FlowyError> {
  571. let data = manager.get_all_databases_description().await;
  572. data_result_ok(data)
  573. }
  574. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  575. pub(crate) async fn set_layout_setting_handler(
  576. data: AFPluginData<LayoutSettingChangesetPB>,
  577. manager: AFPluginState<Arc<DatabaseManager2>>,
  578. ) -> FlowyResult<()> {
  579. let params: LayoutSettingChangeset = data.into_inner().try_into()?;
  580. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  581. let layout_params = LayoutSettingParams {
  582. calendar: params.calendar,
  583. };
  584. database_editor
  585. .set_layout_setting(&params.view_id, DatabaseLayout::Calendar, layout_params)
  586. .await;
  587. Ok(())
  588. }
  589. pub(crate) async fn get_layout_setting_handler(
  590. data: AFPluginData<DatabaseLayoutIdPB>,
  591. manager: AFPluginState<Arc<DatabaseManager2>>,
  592. ) -> DataResult<LayoutSettingPB, FlowyError> {
  593. let params: DatabaseLayoutId = data.into_inner().try_into()?;
  594. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  595. let layout_setting_pb = database_editor
  596. .get_layout_setting(&params.view_id, params.layout)
  597. .await
  598. .map(LayoutSettingPB::from)
  599. .unwrap_or_default();
  600. data_result_ok(layout_setting_pb)
  601. }
  602. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  603. pub(crate) async fn get_calendar_events_handler(
  604. data: AFPluginData<CalendarEventRequestPB>,
  605. manager: AFPluginState<Arc<DatabaseManager2>>,
  606. ) -> DataResult<RepeatedCalendarEventPB, FlowyError> {
  607. let params: CalendarEventRequestParams = data.into_inner().try_into()?;
  608. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  609. let events = database_editor
  610. .get_all_calendar_events(&params.view_id)
  611. .await;
  612. data_result_ok(RepeatedCalendarEventPB { items: events })
  613. }
  614. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  615. pub(crate) async fn get_calendar_event_handler(
  616. data: AFPluginData<RowIdPB>,
  617. manager: AFPluginState<Arc<DatabaseManager2>>,
  618. ) -> DataResult<CalendarEventPB, FlowyError> {
  619. let params: RowIdParams = data.into_inner().try_into()?;
  620. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  621. let event = database_editor
  622. .get_calendar_event(&params.view_id, params.row_id)
  623. .await;
  624. match event {
  625. None => Err(FlowyError::record_not_found()),
  626. Some(event) => data_result_ok(event),
  627. }
  628. }
  629. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  630. pub(crate) async fn move_calendar_event_handler(
  631. data: AFPluginData<MoveCalendarEventPB>,
  632. manager: AFPluginState<Arc<DatabaseManager2>>,
  633. ) -> FlowyResult<()> {
  634. let data = data.into_inner();
  635. let cell_id: CellIdParams = data.cell_path.try_into()?;
  636. let cell_changeset = DateCellChangeset {
  637. date: Some(data.timestamp.to_string()),
  638. ..Default::default()
  639. };
  640. let database_editor = manager.get_database_with_view_id(&cell_id.view_id).await?;
  641. database_editor
  642. .update_cell_with_changeset(
  643. &cell_id.view_id,
  644. cell_id.row_id,
  645. &cell_id.field_id,
  646. cell_changeset,
  647. )
  648. .await?;
  649. Ok(())
  650. }