use crate::{ entities::{SignInParams, SignInResponse, SignUpParams, SignUpResponse, UserDetail}, errors::{ErrorBuilder, ErrorCode, UserError}, }; use crate::entities::SignOutParams; use flowy_net::{config::*, future::ResultFuture, request::HttpRequestBuilder}; pub trait UserServerAPI { fn sign_up(&self, params: SignUpParams) -> ResultFuture; fn sign_in(&self, params: SignInParams) -> ResultFuture; fn sign_out(&self, token: &str) -> ResultFuture<(), UserError>; fn get_user_info(&self, user_id: &str) -> ResultFuture; } pub struct UserServer {} impl UserServer { pub fn new() -> Self { Self {} } } impl UserServerAPI for UserServer { fn sign_up(&self, params: SignUpParams) -> ResultFuture { ResultFuture::new(async move { user_sign_up(params, SIGN_UP_URL.as_ref()).await }) } fn sign_in(&self, params: SignInParams) -> ResultFuture { ResultFuture::new(async move { user_sign_in(params, SIGN_IN_URL.as_ref()).await }) } fn sign_out(&self, _token: &str) -> ResultFuture<(), UserError> { ResultFuture::new(async { Err(ErrorBuilder::new(ErrorCode::Unknown).build()) }) } fn get_user_info(&self, _user_id: &str) -> ResultFuture { ResultFuture::new(async { Err(ErrorBuilder::new(ErrorCode::Unknown).build()) }) } } pub async fn user_sign_up(params: SignUpParams, url: &str) -> Result { let response = HttpRequestBuilder::post(&url.to_owned()) .protobuf(params)? .send() .await? .response() .await?; Ok(response) } pub async fn user_sign_in(params: SignInParams, url: &str) -> Result { let response = HttpRequestBuilder::post(&url.to_owned()) .protobuf(params)? .send() .await? .response() .await?; Ok(response) } pub async fn user_sign_out(params: SignOutParams, url: &str) -> Result<(), UserError> { let _ = HttpRequestBuilder::delete(&url.to_owned()) .protobuf(params)? .send() .await?; Ok(()) }