event_handler.rs 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809
  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 get_primary_field_handler(
  122. data: AFPluginData<DatabaseViewIdPB>,
  123. manager: AFPluginState<Arc<DatabaseManager2>>,
  124. ) -> DataResult<FieldPB, FlowyError> {
  125. let view_id = data.into_inner().value;
  126. let database_editor = manager.get_database_with_view_id(&view_id).await?;
  127. let mut fields = database_editor
  128. .get_fields(&view_id, None)
  129. .into_iter()
  130. .filter(|field| field.is_primary)
  131. .map(FieldPB::from)
  132. .collect::<Vec<FieldPB>>();
  133. if fields.is_empty() {
  134. // The primary field should not be empty. Because it is created when the database is created.
  135. // If it is empty, it must be a bug.
  136. Err(FlowyError::record_not_found())
  137. } else {
  138. if fields.len() > 1 {
  139. // The primary field should not be more than one. If it is more than one,
  140. // it must be a bug.
  141. tracing::error!("The primary field is more than one");
  142. }
  143. data_result_ok(fields.remove(0))
  144. }
  145. }
  146. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  147. pub(crate) async fn update_field_handler(
  148. data: AFPluginData<FieldChangesetPB>,
  149. manager: AFPluginState<Arc<DatabaseManager2>>,
  150. ) -> Result<(), FlowyError> {
  151. let params: FieldChangesetParams = data.into_inner().try_into()?;
  152. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  153. database_editor.update_field(params).await?;
  154. Ok(())
  155. }
  156. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  157. pub(crate) async fn update_field_type_option_handler(
  158. data: AFPluginData<TypeOptionChangesetPB>,
  159. manager: AFPluginState<Arc<DatabaseManager2>>,
  160. ) -> Result<(), FlowyError> {
  161. let params: TypeOptionChangesetParams = data.into_inner().try_into()?;
  162. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  163. if let Some(old_field) = database_editor.get_field(&params.field_id) {
  164. let field_type = FieldType::from(old_field.field_type);
  165. let type_option_data =
  166. type_option_data_from_pb_or_default(params.type_option_data, &field_type);
  167. database_editor
  168. .update_field_type_option(
  169. &params.view_id,
  170. &params.field_id,
  171. type_option_data,
  172. old_field,
  173. )
  174. .await?;
  175. }
  176. Ok(())
  177. }
  178. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  179. pub(crate) async fn delete_field_handler(
  180. data: AFPluginData<DeleteFieldPayloadPB>,
  181. manager: AFPluginState<Arc<DatabaseManager2>>,
  182. ) -> Result<(), FlowyError> {
  183. let params: FieldIdParams = data.into_inner().try_into()?;
  184. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  185. database_editor.delete_field(&params.field_id).await?;
  186. Ok(())
  187. }
  188. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  189. pub(crate) async fn switch_to_field_handler(
  190. data: AFPluginData<UpdateFieldTypePayloadPB>,
  191. manager: AFPluginState<Arc<DatabaseManager2>>,
  192. ) -> Result<(), FlowyError> {
  193. let params: EditFieldParams = data.into_inner().try_into()?;
  194. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  195. let old_field = database_editor.get_field(&params.field_id);
  196. database_editor
  197. .switch_to_field_type(&params.field_id, &params.field_type)
  198. .await?;
  199. if let Some(new_type_option) = database_editor
  200. .get_field(&params.field_id)
  201. .map(|field| field.get_any_type_option(field.field_type))
  202. {
  203. match (old_field, new_type_option) {
  204. (Some(old_field), Some(new_type_option)) => {
  205. database_editor
  206. .update_field_type_option(
  207. &params.view_id,
  208. &params.field_id,
  209. new_type_option,
  210. old_field,
  211. )
  212. .await?;
  213. },
  214. _ => {
  215. tracing::warn!("Old field and the new type option should not be empty");
  216. },
  217. }
  218. }
  219. Ok(())
  220. }
  221. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  222. pub(crate) async fn duplicate_field_handler(
  223. data: AFPluginData<DuplicateFieldPayloadPB>,
  224. manager: AFPluginState<Arc<DatabaseManager2>>,
  225. ) -> Result<(), FlowyError> {
  226. let params: FieldIdParams = data.into_inner().try_into()?;
  227. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  228. database_editor
  229. .duplicate_field(&params.view_id, &params.field_id)
  230. .await?;
  231. Ok(())
  232. }
  233. /// Return the FieldTypeOptionData if the Field exists otherwise return record not found error.
  234. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  235. pub(crate) async fn get_field_type_option_data_handler(
  236. data: AFPluginData<TypeOptionPathPB>,
  237. manager: AFPluginState<Arc<DatabaseManager2>>,
  238. ) -> DataResult<TypeOptionPB, FlowyError> {
  239. let params: TypeOptionPathParams = data.into_inner().try_into()?;
  240. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  241. if let Some((field, data)) = database_editor
  242. .get_field_type_option_data(&params.field_id)
  243. .await
  244. {
  245. let data = TypeOptionPB {
  246. view_id: params.view_id,
  247. field: FieldPB::from(field),
  248. type_option_data: data.to_vec(),
  249. };
  250. data_result_ok(data)
  251. } else {
  252. Err(FlowyError::record_not_found())
  253. }
  254. }
  255. /// Create TypeOptionPB and save it. Return the FieldTypeOptionData.
  256. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  257. pub(crate) async fn create_field_type_option_data_handler(
  258. data: AFPluginData<CreateFieldPayloadPB>,
  259. manager: AFPluginState<Arc<DatabaseManager2>>,
  260. ) -> DataResult<TypeOptionPB, FlowyError> {
  261. let params: CreateFieldParams = data.into_inner().try_into()?;
  262. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  263. let (field, data) = database_editor
  264. .create_field_with_type_option(&params.view_id, &params.field_type, params.type_option_data)
  265. .await;
  266. let data = TypeOptionPB {
  267. view_id: params.view_id,
  268. field: FieldPB::from(field),
  269. type_option_data: data.to_vec(),
  270. };
  271. data_result_ok(data)
  272. }
  273. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  274. pub(crate) async fn move_field_handler(
  275. data: AFPluginData<MoveFieldPayloadPB>,
  276. manager: AFPluginState<Arc<DatabaseManager2>>,
  277. ) -> Result<(), FlowyError> {
  278. let params: MoveFieldParams = data.into_inner().try_into()?;
  279. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  280. database_editor
  281. .move_field(
  282. &params.view_id,
  283. &params.field_id,
  284. params.from_index,
  285. params.to_index,
  286. )
  287. .await?;
  288. Ok(())
  289. }
  290. // #[tracing::instrument(level = "debug", skip(data, manager), err)]
  291. pub(crate) async fn get_row_handler(
  292. data: AFPluginData<RowIdPB>,
  293. manager: AFPluginState<Arc<DatabaseManager2>>,
  294. ) -> DataResult<OptionalRowPB, FlowyError> {
  295. let params: RowIdParams = data.into_inner().try_into()?;
  296. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  297. let row = database_editor
  298. .get_row(&params.view_id, &params.row_id)
  299. .map(RowPB::from);
  300. data_result_ok(OptionalRowPB { row })
  301. }
  302. pub(crate) async fn get_row_meta_handler(
  303. data: AFPluginData<RowIdPB>,
  304. manager: AFPluginState<Arc<DatabaseManager2>>,
  305. ) -> DataResult<RowMetaPB, FlowyError> {
  306. let params: RowIdParams = data.into_inner().try_into()?;
  307. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  308. match database_editor.get_row_meta(&params.view_id, &params.row_id) {
  309. None => Err(FlowyError::record_not_found()),
  310. Some(row) => data_result_ok(row),
  311. }
  312. }
  313. pub(crate) async fn update_row_meta_handler(
  314. data: AFPluginData<UpdateRowMetaChangesetPB>,
  315. manager: AFPluginState<Arc<DatabaseManager2>>,
  316. ) -> FlowyResult<()> {
  317. let params: UpdateRowMetaParams = data.into_inner().try_into()?;
  318. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  319. let row_id = RowId::from(params.id.clone());
  320. database_editor.update_row_meta(&row_id, params).await;
  321. Ok(())
  322. }
  323. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  324. pub(crate) async fn delete_row_handler(
  325. data: AFPluginData<RowIdPB>,
  326. manager: AFPluginState<Arc<DatabaseManager2>>,
  327. ) -> Result<(), FlowyError> {
  328. let params: RowIdParams = data.into_inner().try_into()?;
  329. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  330. database_editor.delete_row(&params.row_id).await;
  331. Ok(())
  332. }
  333. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  334. pub(crate) async fn duplicate_row_handler(
  335. data: AFPluginData<RowIdPB>,
  336. manager: AFPluginState<Arc<DatabaseManager2>>,
  337. ) -> Result<(), FlowyError> {
  338. let params: RowIdParams = data.into_inner().try_into()?;
  339. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  340. database_editor
  341. .duplicate_row(&params.view_id, params.group_id, &params.row_id)
  342. .await;
  343. Ok(())
  344. }
  345. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  346. pub(crate) async fn move_row_handler(
  347. data: AFPluginData<MoveRowPayloadPB>,
  348. manager: AFPluginState<Arc<DatabaseManager2>>,
  349. ) -> Result<(), FlowyError> {
  350. let params: MoveRowParams = data.into_inner().try_into()?;
  351. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  352. database_editor
  353. .move_row(&params.view_id, params.from_row_id, params.to_row_id)
  354. .await;
  355. Ok(())
  356. }
  357. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  358. pub(crate) async fn create_row_handler(
  359. data: AFPluginData<CreateRowPayloadPB>,
  360. manager: AFPluginState<Arc<DatabaseManager2>>,
  361. ) -> DataResult<RowMetaPB, FlowyError> {
  362. let params: CreateRowParams = data.into_inner().try_into()?;
  363. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  364. let fields = database_editor.get_fields(&params.view_id, None);
  365. let cells =
  366. CellBuilder::with_cells(params.cell_data_by_field_id.unwrap_or_default(), &fields).build();
  367. let view_id = params.view_id;
  368. let group_id = params.group_id;
  369. let params = collab_database::rows::CreateRowParams {
  370. id: gen_row_id(),
  371. cells,
  372. height: 60,
  373. visibility: true,
  374. prev_row_id: params.start_row_id,
  375. timestamp: timestamp(),
  376. };
  377. match database_editor
  378. .create_row(&view_id, group_id, params)
  379. .await?
  380. {
  381. None => Err(FlowyError::internal().context("Create row fail")),
  382. Some(row) => data_result_ok(RowMetaPB::from(row.meta)),
  383. }
  384. }
  385. // #[tracing::instrument(level = "trace", skip_all, err)]
  386. pub(crate) async fn get_cell_handler(
  387. data: AFPluginData<CellIdPB>,
  388. manager: AFPluginState<Arc<DatabaseManager2>>,
  389. ) -> DataResult<CellPB, FlowyError> {
  390. let params: CellIdParams = data.into_inner().try_into()?;
  391. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  392. let cell = database_editor
  393. .get_cell_pb(&params.field_id, &params.row_id)
  394. .await
  395. .unwrap_or_else(|| CellPB::empty(&params.field_id, params.row_id.into_inner()));
  396. data_result_ok(cell)
  397. }
  398. #[tracing::instrument(level = "debug", skip_all, err)]
  399. pub(crate) async fn update_cell_handler(
  400. data: AFPluginData<CellChangesetPB>,
  401. manager: AFPluginState<Arc<DatabaseManager2>>,
  402. ) -> Result<(), FlowyError> {
  403. let params: CellChangesetPB = data.into_inner();
  404. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  405. database_editor
  406. .update_cell_with_changeset(
  407. &params.view_id,
  408. RowId::from(params.row_id),
  409. &params.field_id,
  410. params.cell_changeset.clone(),
  411. )
  412. .await?;
  413. Ok(())
  414. }
  415. #[tracing::instrument(level = "trace", skip_all, err)]
  416. pub(crate) async fn new_select_option_handler(
  417. data: AFPluginData<CreateSelectOptionPayloadPB>,
  418. manager: AFPluginState<Arc<DatabaseManager2>>,
  419. ) -> DataResult<SelectOptionPB, FlowyError> {
  420. let params: CreateSelectOptionParams = data.into_inner().try_into()?;
  421. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  422. let result = database_editor
  423. .create_select_option(&params.field_id, params.option_name)
  424. .await;
  425. match result {
  426. None => {
  427. Err(FlowyError::record_not_found().context("Create select option fail. Can't find the field"))
  428. },
  429. Some(pb) => data_result_ok(pb),
  430. }
  431. }
  432. #[tracing::instrument(level = "trace", skip_all, err)]
  433. pub(crate) async fn insert_or_update_select_option_handler(
  434. data: AFPluginData<RepeatedSelectOptionPayload>,
  435. manager: AFPluginState<Arc<DatabaseManager2>>,
  436. ) -> Result<(), FlowyError> {
  437. let params = data.into_inner();
  438. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  439. database_editor
  440. .insert_select_options(
  441. &params.view_id,
  442. &params.field_id,
  443. RowId::from(params.row_id),
  444. params.items,
  445. )
  446. .await?;
  447. Ok(())
  448. }
  449. #[tracing::instrument(level = "trace", skip_all, err)]
  450. pub(crate) async fn delete_select_option_handler(
  451. data: AFPluginData<RepeatedSelectOptionPayload>,
  452. manager: AFPluginState<Arc<DatabaseManager2>>,
  453. ) -> Result<(), FlowyError> {
  454. let params = data.into_inner();
  455. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  456. database_editor
  457. .delete_select_options(
  458. &params.view_id,
  459. &params.field_id,
  460. RowId::from(params.row_id),
  461. params.items,
  462. )
  463. .await?;
  464. Ok(())
  465. }
  466. #[tracing::instrument(level = "trace", skip(data, manager), err)]
  467. pub(crate) async fn get_select_option_handler(
  468. data: AFPluginData<CellIdPB>,
  469. manager: AFPluginState<Arc<DatabaseManager2>>,
  470. ) -> DataResult<SelectOptionCellDataPB, FlowyError> {
  471. let params: CellIdParams = data.into_inner().try_into()?;
  472. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  473. let options = database_editor
  474. .get_select_options(params.row_id, &params.field_id)
  475. .await;
  476. data_result_ok(options)
  477. }
  478. #[tracing::instrument(level = "trace", skip_all, err)]
  479. pub(crate) async fn update_select_option_cell_handler(
  480. data: AFPluginData<SelectOptionCellChangesetPB>,
  481. manager: AFPluginState<Arc<DatabaseManager2>>,
  482. ) -> Result<(), FlowyError> {
  483. let params: SelectOptionCellChangesetParams = data.into_inner().try_into()?;
  484. let database_editor = manager
  485. .get_database_with_view_id(&params.cell_identifier.view_id)
  486. .await?;
  487. let changeset = SelectOptionCellChangeset {
  488. insert_option_ids: params.insert_option_ids,
  489. delete_option_ids: params.delete_option_ids,
  490. };
  491. database_editor
  492. .update_cell_with_changeset(
  493. &params.cell_identifier.view_id,
  494. params.cell_identifier.row_id,
  495. &params.cell_identifier.field_id,
  496. changeset,
  497. )
  498. .await?;
  499. Ok(())
  500. }
  501. #[tracing::instrument(level = "trace", skip_all, err)]
  502. pub(crate) async fn get_checklist_cell_data_handler(
  503. data: AFPluginData<CellIdPB>,
  504. manager: AFPluginState<Arc<DatabaseManager2>>,
  505. ) -> DataResult<ChecklistCellDataPB, FlowyError> {
  506. let params: CellIdParams = data.into_inner().try_into()?;
  507. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  508. let data = database_editor
  509. .get_checklist_option(params.row_id, &params.field_id)
  510. .await;
  511. data_result_ok(data)
  512. }
  513. #[tracing::instrument(level = "trace", skip_all, err)]
  514. pub(crate) async fn update_checklist_cell_handler(
  515. data: AFPluginData<ChecklistCellDataChangesetPB>,
  516. manager: AFPluginState<Arc<DatabaseManager2>>,
  517. ) -> Result<(), FlowyError> {
  518. let params: ChecklistCellDataChangesetParams = data.into_inner().try_into()?;
  519. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  520. let changeset = ChecklistCellChangeset {
  521. insert_options: params.insert_options,
  522. selected_option_ids: params.selected_option_ids,
  523. delete_option_ids: params.delete_option_ids,
  524. update_options: params.update_options,
  525. };
  526. database_editor
  527. .set_checklist_options(&params.view_id, params.row_id, &params.field_id, changeset)
  528. .await?;
  529. Ok(())
  530. }
  531. #[tracing::instrument(level = "trace", skip_all, err)]
  532. pub(crate) async fn update_date_cell_handler(
  533. data: AFPluginData<DateChangesetPB>,
  534. manager: AFPluginState<Arc<DatabaseManager2>>,
  535. ) -> Result<(), FlowyError> {
  536. let data = data.into_inner();
  537. let cell_id: CellIdParams = data.cell_id.try_into()?;
  538. let cell_changeset = DateCellChangeset {
  539. date: data.date,
  540. time: data.time,
  541. include_time: data.include_time,
  542. };
  543. let database_editor = manager.get_database_with_view_id(&cell_id.view_id).await?;
  544. database_editor
  545. .update_cell_with_changeset(
  546. &cell_id.view_id,
  547. cell_id.row_id,
  548. &cell_id.field_id,
  549. cell_changeset,
  550. )
  551. .await?;
  552. Ok(())
  553. }
  554. #[tracing::instrument(level = "trace", skip_all, err)]
  555. pub(crate) async fn get_groups_handler(
  556. data: AFPluginData<DatabaseViewIdPB>,
  557. manager: AFPluginState<Arc<DatabaseManager2>>,
  558. ) -> DataResult<RepeatedGroupPB, FlowyError> {
  559. let params: DatabaseViewIdPB = data.into_inner();
  560. let database_editor = manager.get_database_with_view_id(params.as_ref()).await?;
  561. let groups = database_editor.load_groups(params.as_ref()).await?;
  562. data_result_ok(groups)
  563. }
  564. #[tracing::instrument(level = "trace", skip_all, err)]
  565. pub(crate) async fn get_group_handler(
  566. data: AFPluginData<DatabaseGroupIdPB>,
  567. manager: AFPluginState<Arc<DatabaseManager2>>,
  568. ) -> DataResult<GroupPB, FlowyError> {
  569. let params: DatabaseGroupIdParams = data.into_inner().try_into()?;
  570. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  571. let group = database_editor
  572. .get_group(&params.view_id, &params.group_id)
  573. .await?;
  574. data_result_ok(group)
  575. }
  576. #[tracing::instrument(level = "trace", skip_all, err)]
  577. pub(crate) async fn set_group_by_field_handler(
  578. data: AFPluginData<GroupByFieldPayloadPB>,
  579. manager: AFPluginState<Arc<DatabaseManager2>>,
  580. ) -> FlowyResult<()> {
  581. let params: GroupByFieldParams = data.into_inner().try_into()?;
  582. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  583. database_editor
  584. .set_group_by_field(&params.view_id, &params.field_id)
  585. .await?;
  586. Ok(())
  587. }
  588. #[tracing::instrument(level = "trace", skip_all, err)]
  589. pub(crate) async fn update_group_handler(
  590. data: AFPluginData<UpdateGroupPB>,
  591. manager: AFPluginState<Arc<DatabaseManager2>>,
  592. ) -> FlowyResult<()> {
  593. let params: UpdateGroupParams = data.into_inner().try_into()?;
  594. let view_id = params.view_id.clone();
  595. let database_editor = manager.get_database_with_view_id(&view_id).await?;
  596. let group_setting_changeset = GroupSettingChangeset {
  597. update_groups: vec![GroupChangeset::from(params)],
  598. };
  599. database_editor
  600. .update_group_setting(&view_id, group_setting_changeset)
  601. .await?;
  602. Ok(())
  603. }
  604. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  605. pub(crate) async fn move_group_handler(
  606. data: AFPluginData<MoveGroupPayloadPB>,
  607. manager: AFPluginState<Arc<DatabaseManager2>>,
  608. ) -> FlowyResult<()> {
  609. let params: MoveGroupParams = data.into_inner().try_into()?;
  610. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  611. database_editor
  612. .move_group(&params.view_id, &params.from_group_id, &params.to_group_id)
  613. .await?;
  614. Ok(())
  615. }
  616. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  617. pub(crate) async fn move_group_row_handler(
  618. data: AFPluginData<MoveGroupRowPayloadPB>,
  619. manager: AFPluginState<Arc<DatabaseManager2>>,
  620. ) -> FlowyResult<()> {
  621. let params: MoveGroupRowParams = data.into_inner().try_into()?;
  622. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  623. database_editor
  624. .move_group_row(
  625. &params.view_id,
  626. &params.to_group_id,
  627. params.from_row_id,
  628. params.to_row_id,
  629. )
  630. .await?;
  631. Ok(())
  632. }
  633. #[tracing::instrument(level = "debug", skip(manager), err)]
  634. pub(crate) async fn get_databases_handler(
  635. manager: AFPluginState<Arc<DatabaseManager2>>,
  636. ) -> DataResult<RepeatedDatabaseDescriptionPB, FlowyError> {
  637. let data = manager.get_all_databases_description().await;
  638. data_result_ok(data)
  639. }
  640. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  641. pub(crate) async fn set_layout_setting_handler(
  642. data: AFPluginData<LayoutSettingChangesetPB>,
  643. manager: AFPluginState<Arc<DatabaseManager2>>,
  644. ) -> FlowyResult<()> {
  645. let params: LayoutSettingChangeset = data.into_inner().try_into()?;
  646. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  647. let layout_params = LayoutSettingParams {
  648. layout_type: params.layout_type,
  649. calendar: params.calendar,
  650. };
  651. database_editor
  652. .set_layout_setting(&params.view_id, layout_params)
  653. .await;
  654. Ok(())
  655. }
  656. pub(crate) async fn get_layout_setting_handler(
  657. data: AFPluginData<DatabaseLayoutMetaPB>,
  658. manager: AFPluginState<Arc<DatabaseManager2>>,
  659. ) -> DataResult<DatabaseLayoutSettingPB, FlowyError> {
  660. let params: DatabaseLayoutMeta = data.into_inner().try_into()?;
  661. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  662. let layout_setting_pb = database_editor
  663. .get_layout_setting(&params.view_id, params.layout)
  664. .await
  665. .map(DatabaseLayoutSettingPB::from)
  666. .unwrap_or_default();
  667. data_result_ok(layout_setting_pb)
  668. }
  669. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  670. pub(crate) async fn get_calendar_events_handler(
  671. data: AFPluginData<CalendarEventRequestPB>,
  672. manager: AFPluginState<Arc<DatabaseManager2>>,
  673. ) -> DataResult<RepeatedCalendarEventPB, FlowyError> {
  674. let params: CalendarEventRequestParams = data.into_inner().try_into()?;
  675. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  676. let events = database_editor
  677. .get_all_calendar_events(&params.view_id)
  678. .await;
  679. data_result_ok(RepeatedCalendarEventPB { items: events })
  680. }
  681. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  682. pub(crate) async fn get_no_date_calendar_events_handler(
  683. data: AFPluginData<CalendarEventRequestPB>,
  684. manager: AFPluginState<Arc<DatabaseManager2>>,
  685. ) -> DataResult<RepeatedNoDateCalendarEventPB, FlowyError> {
  686. let params: CalendarEventRequestParams = data.into_inner().try_into()?;
  687. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  688. let _events = database_editor
  689. .get_all_no_date_calendar_events(&params.view_id)
  690. .await;
  691. todo!()
  692. }
  693. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  694. pub(crate) async fn get_calendar_event_handler(
  695. data: AFPluginData<RowIdPB>,
  696. manager: AFPluginState<Arc<DatabaseManager2>>,
  697. ) -> DataResult<CalendarEventPB, FlowyError> {
  698. let params: RowIdParams = data.into_inner().try_into()?;
  699. let database_editor = manager.get_database_with_view_id(&params.view_id).await?;
  700. let event = database_editor
  701. .get_calendar_event(&params.view_id, params.row_id)
  702. .await;
  703. match event {
  704. None => Err(FlowyError::record_not_found()),
  705. Some(event) => data_result_ok(event),
  706. }
  707. }
  708. #[tracing::instrument(level = "debug", skip(data, manager), err)]
  709. pub(crate) async fn move_calendar_event_handler(
  710. data: AFPluginData<MoveCalendarEventPB>,
  711. manager: AFPluginState<Arc<DatabaseManager2>>,
  712. ) -> FlowyResult<()> {
  713. let data = data.into_inner();
  714. let cell_id: CellIdParams = data.cell_path.try_into()?;
  715. let cell_changeset = DateCellChangeset {
  716. date: Some(data.timestamp.to_string()),
  717. ..Default::default()
  718. };
  719. let database_editor = manager.get_database_with_view_id(&cell_id.view_id).await?;
  720. database_editor
  721. .update_cell_with_changeset(
  722. &cell_id.view_id,
  723. cell_id.row_id,
  724. &cell_id.field_id,
  725. cell_changeset,
  726. )
  727. .await?;
  728. Ok(())
  729. }
  730. #[tracing::instrument(level = "debug", skip_all, err)]
  731. pub(crate) async fn create_database_view(
  732. _data: AFPluginData<CreateDatabaseViewPayloadPB>,
  733. _manager: AFPluginState<Arc<DatabaseManager2>>,
  734. ) -> FlowyResult<()> {
  735. // let data: CreateDatabaseViewParams = data.into_inner().try_into()?;
  736. Ok(())
  737. }
  738. #[tracing::instrument(level = "debug", skip_all, err)]
  739. pub(crate) async fn export_csv_handler(
  740. data: AFPluginData<DatabaseViewIdPB>,
  741. manager: AFPluginState<Arc<DatabaseManager2>>,
  742. ) -> DataResult<DatabaseExportDataPB, FlowyError> {
  743. let view_id = data.into_inner().value;
  744. let database = manager.get_database_with_view_id(&view_id).await?;
  745. let data = database.export_csv(CSVFormat::Original).await?;
  746. data_result_ok(DatabaseExportDataPB {
  747. export_type: DatabaseExportDataType::CSV,
  748. data,
  749. })
  750. }