event_handler.rs 22 KB

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