event_handler.rs 32 KB

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