user.rs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. use flowy_error::{ErrorCode, FlowyError};
  2. use flowy_user::entities::{
  3. SignInParams, SignInResponse, SignUpParams, SignUpResponse, UpdateUserProfileParams, UserProfile,
  4. };
  5. use flowy_user::event_map::UserAuthService;
  6. use lib_infra::box_any::BoxAny;
  7. use lib_infra::future::FutureResult;
  8. use crate::request::HttpRequestBuilder;
  9. use crate::self_host::configuration::{SelfHostedConfiguration, HEADER_TOKEN};
  10. pub(crate) struct SelfHostedUserAuthServiceImpl {
  11. config: SelfHostedConfiguration,
  12. }
  13. impl SelfHostedUserAuthServiceImpl {
  14. pub(crate) fn new(config: SelfHostedConfiguration) -> Self {
  15. Self { config }
  16. }
  17. }
  18. impl UserAuthService for SelfHostedUserAuthServiceImpl {
  19. fn sign_up(&self, params: BoxAny) -> FutureResult<SignUpResponse, FlowyError> {
  20. let url = self.config.sign_up_url();
  21. FutureResult::new(async move {
  22. let params = params.unbox_or_error::<SignUpParams>()?;
  23. let resp = user_sign_up_request(params, &url).await?;
  24. Ok(resp)
  25. })
  26. }
  27. fn sign_in(&self, params: BoxAny) -> FutureResult<SignInResponse, FlowyError> {
  28. let url = self.config.sign_in_url();
  29. FutureResult::new(async move {
  30. let params = params.unbox_or_error::<SignInParams>()?;
  31. let resp = user_sign_in_request(params, &url).await?;
  32. Ok(resp)
  33. })
  34. }
  35. fn sign_out(&self, token: Option<String>) -> FutureResult<(), FlowyError> {
  36. match token {
  37. None => FutureResult::new(async {
  38. Err(FlowyError::new(
  39. ErrorCode::InvalidData,
  40. "Token should not be empty",
  41. ))
  42. }),
  43. Some(token) => {
  44. let token = token;
  45. let url = self.config.sign_out_url();
  46. FutureResult::new(async move {
  47. let _ = user_sign_out_request(&token, &url).await;
  48. Ok(())
  49. })
  50. },
  51. }
  52. }
  53. fn update_user(
  54. &self,
  55. _uid: i64,
  56. token: &Option<String>,
  57. params: UpdateUserProfileParams,
  58. ) -> FutureResult<(), FlowyError> {
  59. match token {
  60. None => FutureResult::new(async {
  61. Err(FlowyError::new(
  62. ErrorCode::InvalidData,
  63. "Token should not be empty",
  64. ))
  65. }),
  66. Some(token) => {
  67. let token = token.to_owned();
  68. let url = self.config.user_profile_url();
  69. FutureResult::new(async move {
  70. update_user_profile_request(&token, params, &url).await?;
  71. Ok(())
  72. })
  73. },
  74. }
  75. }
  76. fn get_user_profile(
  77. &self,
  78. token: Option<String>,
  79. _uid: i64,
  80. ) -> FutureResult<Option<UserProfile>, FlowyError> {
  81. let token = token;
  82. let url = self.config.user_profile_url();
  83. FutureResult::new(async move {
  84. match token {
  85. None => Err(FlowyError::new(
  86. ErrorCode::UnexpectedEmpty,
  87. "Token should not be empty",
  88. )),
  89. Some(token) => {
  90. let profile = get_user_profile_request(&token, &url).await?;
  91. Ok(Some(profile))
  92. },
  93. }
  94. })
  95. }
  96. }
  97. pub async fn user_sign_up_request(
  98. params: SignUpParams,
  99. url: &str,
  100. ) -> Result<SignUpResponse, FlowyError> {
  101. let response = request_builder().post(url).json(params)?.response().await?;
  102. Ok(response)
  103. }
  104. pub async fn user_sign_in_request(
  105. params: SignInParams,
  106. url: &str,
  107. ) -> Result<SignInResponse, FlowyError> {
  108. let response = request_builder().post(url).json(params)?.response().await?;
  109. Ok(response)
  110. }
  111. pub async fn user_sign_out_request(token: &str, url: &str) -> Result<(), FlowyError> {
  112. request_builder()
  113. .delete(url)
  114. .header(HEADER_TOKEN, token)
  115. .send()
  116. .await?;
  117. Ok(())
  118. }
  119. pub async fn get_user_profile_request(token: &str, url: &str) -> Result<UserProfile, FlowyError> {
  120. let user_profile = request_builder()
  121. .get(url)
  122. .header(HEADER_TOKEN, token)
  123. .response()
  124. .await?;
  125. Ok(user_profile)
  126. }
  127. pub async fn update_user_profile_request(
  128. token: &str,
  129. params: UpdateUserProfileParams,
  130. url: &str,
  131. ) -> Result<(), FlowyError> {
  132. request_builder()
  133. .patch(url)
  134. .header(HEADER_TOKEN, token)
  135. .json(params)?
  136. .send()
  137. .await?;
  138. Ok(())
  139. }
  140. fn request_builder() -> HttpRequestBuilder {
  141. HttpRequestBuilder::new()
  142. }