event_handler.rs 29 KB

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