router.rs 4.7 KB

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