router.rs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. use crate::{
  2. context::FlowyPersistence,
  3. entities::logged_user::LoggedUser,
  4. services::folder::view::{
  5. create_view, delete_view,
  6. persistence::{check_view_id, check_view_ids},
  7. read_view, update_view,
  8. },
  9. util::serde_ext::parse_from_payload,
  10. };
  11. use actix_web::{
  12. web::{Data, Payload},
  13. HttpResponse,
  14. };
  15. use anyhow::Context;
  16. use backend_service::{
  17. errors::{invalid_params, ServerError},
  18. response::FlowyResponse,
  19. };
  20. use flowy_folder_data_model::{
  21. parser::view::{ViewDesc, ViewName, ViewThumbnail},
  22. protobuf::{
  23. CreateViewParams as CreateViewParamsPB, QueryViewRequest as QueryViewRequestPB,
  24. UpdateViewParams as UpdateViewParamsPB, ViewId as ViewIdPB,
  25. },
  26. };
  27. use sqlx::PgPool;
  28. use std::sync::Arc;
  29. pub async fn create_handler(
  30. payload: Payload,
  31. persistence: Data<Arc<FlowyPersistence>>,
  32. user: LoggedUser,
  33. ) -> Result<HttpResponse, ServerError> {
  34. let params: CreateViewParamsPB = parse_from_payload(payload).await?;
  35. let kv_store = persistence.document_kv_store();
  36. let pool = persistence.pg_pool();
  37. let mut transaction = pool
  38. .begin()
  39. .await
  40. .context("Failed to acquire a Postgres connection to create view")?;
  41. let view = create_view(&mut transaction, kv_store, params, &user.user_id).await?;
  42. transaction
  43. .commit()
  44. .await
  45. .context("Failed to commit SQL transaction to create view.")?;
  46. let resp = FlowyResponse::success().pb(view)?;
  47. Ok(resp.into())
  48. }
  49. pub async fn read_handler(payload: Payload, pool: Data<PgPool>, user: LoggedUser) -> Result<HttpResponse, ServerError> {
  50. let params: ViewIdPB = parse_from_payload(payload).await?;
  51. let view_id = check_view_ids(vec![params.view_id])?.pop().unwrap();
  52. let mut transaction = pool
  53. .begin()
  54. .await
  55. .context("Failed to acquire a Postgres connection to read view")?;
  56. let view = read_view(&user, view_id, &mut transaction).await?;
  57. transaction
  58. .commit()
  59. .await
  60. .context("Failed to commit SQL transaction to read view.")?;
  61. Ok(FlowyResponse::success().pb(view)?.into())
  62. }
  63. pub async fn update_handler(payload: Payload, pool: Data<PgPool>) -> Result<HttpResponse, ServerError> {
  64. let params: UpdateViewParamsPB = parse_from_payload(payload).await?;
  65. let view_id = check_view_id(params.view_id.clone())?;
  66. let name = match params.has_name() {
  67. false => None,
  68. true => Some(ViewName::parse(params.get_name().to_owned()).map_err(invalid_params)?.0),
  69. };
  70. let desc = match params.has_desc() {
  71. false => None,
  72. true => Some(ViewDesc::parse(params.get_desc().to_owned()).map_err(invalid_params)?.0),
  73. };
  74. let thumbnail = match params.has_thumbnail() {
  75. false => None,
  76. true => Some(
  77. ViewThumbnail::parse(params.get_thumbnail().to_owned())
  78. .map_err(invalid_params)?
  79. .0,
  80. ),
  81. };
  82. let mut transaction = pool
  83. .begin()
  84. .await
  85. .context("Failed to acquire a Postgres connection to update app")?;
  86. let _ = update_view(&mut transaction, view_id, name, desc, thumbnail).await?;
  87. transaction
  88. .commit()
  89. .await
  90. .context("Failed to commit SQL transaction to update view.")?;
  91. Ok(FlowyResponse::success().into())
  92. }
  93. pub async fn delete_handler(
  94. payload: Payload,
  95. persistence: Data<Arc<FlowyPersistence>>,
  96. ) -> Result<HttpResponse, ServerError> {
  97. let params: QueryViewRequestPB = parse_from_payload(payload).await?;
  98. let pool = persistence.pg_pool();
  99. let kv_store = persistence.document_kv_store();
  100. let view_ids = check_view_ids(params.view_ids.to_vec())?;
  101. let mut transaction = pool
  102. .begin()
  103. .await
  104. .context("Failed to acquire a Postgres connection to delete view")?;
  105. let _ = delete_view(&mut transaction, &kv_store, view_ids).await?;
  106. transaction
  107. .commit()
  108. .await
  109. .context("Failed to commit SQL transaction to delete view.")?;
  110. Ok(FlowyResponse::success().into())
  111. }