event_handler.rs 27 KB

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