router.rs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. use crate::{
  2. entities::logged_user::LoggedUser,
  3. services::core::workspace::{
  4. create_workspace,
  5. delete_workspace,
  6. persistence::check_workspace_id,
  7. read_workspaces,
  8. update_workspace,
  9. },
  10. util::serde_ext::parse_from_payload,
  11. };
  12. use actix_web::{
  13. web::{Data, Payload},
  14. HttpResponse,
  15. };
  16. use anyhow::Context;
  17. use backend_service::{
  18. errors::{invalid_params, ServerError},
  19. response::FlowyResponse,
  20. };
  21. use flowy_core_data_model::{
  22. parser::workspace::{WorkspaceDesc, WorkspaceName},
  23. protobuf::{
  24. CreateWorkspaceParams as CreateWorkspaceParamsPB,
  25. UpdateWorkspaceParams as UpdateWorkspaceParamsPB,
  26. WorkspaceId as WorkspaceIdPB,
  27. },
  28. };
  29. use sqlx::PgPool;
  30. pub async fn create_handler(
  31. payload: Payload,
  32. pool: Data<PgPool>,
  33. logged_user: LoggedUser,
  34. ) -> Result<HttpResponse, ServerError> {
  35. let params: CreateWorkspaceParamsPB = parse_from_payload(payload).await?;
  36. let name = WorkspaceName::parse(params.get_name().to_owned()).map_err(invalid_params)?;
  37. let desc = WorkspaceDesc::parse(params.get_desc().to_owned()).map_err(invalid_params)?;
  38. let mut transaction = pool
  39. .begin()
  40. .await
  41. .context("Failed to acquire a Postgres connection to create workspace")?;
  42. let workspace = create_workspace(&mut transaction, name.as_ref(), desc.as_ref(), logged_user).await?;
  43. transaction
  44. .commit()
  45. .await
  46. .context("Failed to commit SQL transaction to create workspace.")?;
  47. Ok(FlowyResponse::success().pb(workspace)?.into())
  48. }
  49. pub async fn read_handler(
  50. payload: Payload,
  51. pool: Data<PgPool>,
  52. logged_user: LoggedUser,
  53. ) -> Result<HttpResponse, ServerError> {
  54. let params: WorkspaceIdPB = parse_from_payload(payload).await?;
  55. let mut transaction = pool
  56. .begin()
  57. .await
  58. .context("Failed to acquire a Postgres connection to read workspace")?;
  59. let workspace_id = if params.has_workspace_id() {
  60. Some(params.get_workspace_id().to_owned())
  61. } else {
  62. None
  63. };
  64. let repeated_workspace = read_workspaces(&mut transaction, workspace_id, logged_user).await?;
  65. transaction
  66. .commit()
  67. .await
  68. .context("Failed to commit SQL transaction to read workspace.")?;
  69. Ok(FlowyResponse::success().pb(repeated_workspace)?.into())
  70. }
  71. pub async fn delete_handler(
  72. payload: Payload,
  73. pool: Data<PgPool>,
  74. _logged_user: LoggedUser,
  75. ) -> Result<HttpResponse, ServerError> {
  76. let params: WorkspaceIdPB = parse_from_payload(payload).await?;
  77. let workspace_id = check_workspace_id(params.get_workspace_id().to_owned())?;
  78. let mut transaction = pool
  79. .begin()
  80. .await
  81. .context("Failed to acquire a Postgres connection to delete workspace")?;
  82. let _ = delete_workspace(&mut transaction, workspace_id).await?;
  83. transaction
  84. .commit()
  85. .await
  86. .context("Failed to commit SQL transaction to delete workspace.")?;
  87. Ok(FlowyResponse::success().into())
  88. }
  89. pub async fn update_handler(
  90. payload: Payload,
  91. pool: Data<PgPool>,
  92. _logged_user: LoggedUser,
  93. ) -> Result<HttpResponse, ServerError> {
  94. let params: UpdateWorkspaceParamsPB = parse_from_payload(payload).await?;
  95. let workspace_id = check_workspace_id(params.get_id().to_owned())?;
  96. let name = match params.has_name() {
  97. false => None,
  98. true => {
  99. let name = WorkspaceName::parse(params.get_name().to_owned())
  100. .map_err(invalid_params)?
  101. .0;
  102. Some(name)
  103. },
  104. };
  105. let desc = match params.has_desc() {
  106. false => None,
  107. true => {
  108. let desc = WorkspaceDesc::parse(params.get_desc().to_owned())
  109. .map_err(invalid_params)?
  110. .0;
  111. Some(desc)
  112. },
  113. };
  114. let mut transaction = pool
  115. .begin()
  116. .await
  117. .context("Failed to acquire a Postgres connection to update workspace")?;
  118. let _ = update_workspace(&mut transaction, workspace_id, name, desc).await?;
  119. transaction
  120. .commit()
  121. .await
  122. .context("Failed to commit SQL transaction to update workspace.")?;
  123. Ok(FlowyResponse::success().into())
  124. }
  125. pub async fn workspace_list(pool: Data<PgPool>, logged_user: LoggedUser) -> Result<HttpResponse, ServerError> {
  126. let mut transaction = pool
  127. .begin()
  128. .await
  129. .context("Failed to acquire a Postgres connection to read workspaces")?;
  130. let repeated_workspace = read_workspaces(&mut transaction, None, logged_user).await?;
  131. transaction
  132. .commit()
  133. .await
  134. .context("Failed to commit SQL transaction to read workspace.")?;
  135. Ok(FlowyResponse::success().pb(repeated_workspace)?.into())
  136. }