|
@@ -13,10 +13,13 @@ use crate::{
|
|
|
},
|
|
|
},
|
|
|
errors::WorkspaceError,
|
|
|
+ notify::{send_dart_notification, WorkspaceNotification},
|
|
|
services::server::WorkspaceServerAPI,
|
|
|
};
|
|
|
+use flowy_backend_api::{middleware::*, workspace_request::*};
|
|
|
use flowy_infra::future::ResultFuture;
|
|
|
-use flowy_net::{config::*, request::HttpRequestBuilder};
|
|
|
+use flowy_net::config::ServerConfig;
|
|
|
+use flowy_workspace_infra::errors::ErrorCode;
|
|
|
|
|
|
pub struct WorkspaceServer {
|
|
|
config: ServerConfig,
|
|
@@ -27,10 +30,30 @@ impl WorkspaceServer {
|
|
|
}
|
|
|
|
|
|
impl WorkspaceServerAPI for WorkspaceServer {
|
|
|
+ fn init(&self) {
|
|
|
+ let mut rx = BACKEND_API_MIDDLEWARE.invalid_token_subscribe();
|
|
|
+ tokio::spawn(async move {
|
|
|
+ loop {
|
|
|
+ match rx.recv().await {
|
|
|
+ Ok(invalid_token) => {
|
|
|
+ let error = WorkspaceError::new(ErrorCode::UserUnauthorized, "");
|
|
|
+ send_dart_notification(&invalid_token, WorkspaceNotification::UserUnauthorized)
|
|
|
+ .error(error)
|
|
|
+ .send()
|
|
|
+ },
|
|
|
+ Err(_) => {},
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
fn create_workspace(&self, token: &str, params: CreateWorkspaceParams) -> ResultFuture<Workspace, WorkspaceError> {
|
|
|
let token = token.to_owned();
|
|
|
let url = self.config.workspace_url();
|
|
|
- ResultFuture::new(async move { create_workspace_request(&token, params, &url).await })
|
|
|
+ ResultFuture::new(async move {
|
|
|
+ let workspace = create_workspace_request(&token, params, &url).await?;
|
|
|
+ Ok(workspace)
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
fn read_workspace(
|
|
@@ -40,257 +63,126 @@ impl WorkspaceServerAPI for WorkspaceServer {
|
|
|
) -> ResultFuture<RepeatedWorkspace, WorkspaceError> {
|
|
|
let token = token.to_owned();
|
|
|
let url = self.config.workspace_url();
|
|
|
- ResultFuture::new(async move { read_workspaces_request(&token, params, &url).await })
|
|
|
+ ResultFuture::new(async move {
|
|
|
+ let repeated_workspace = read_workspaces_request(&token, params, &url).await?;
|
|
|
+ Ok(repeated_workspace)
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
fn update_workspace(&self, token: &str, params: UpdateWorkspaceParams) -> ResultFuture<(), WorkspaceError> {
|
|
|
let token = token.to_owned();
|
|
|
let url = self.config.workspace_url();
|
|
|
- ResultFuture::new(async move { update_workspace_request(&token, params, &url).await })
|
|
|
+ ResultFuture::new(async move {
|
|
|
+ let _ = update_workspace_request(&token, params, &url).await?;
|
|
|
+ Ok(())
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
fn delete_workspace(&self, token: &str, params: DeleteWorkspaceParams) -> ResultFuture<(), WorkspaceError> {
|
|
|
let token = token.to_owned();
|
|
|
let url = self.config.workspace_url();
|
|
|
- ResultFuture::new(async move { delete_workspace_request(&token, params, &url).await })
|
|
|
+ ResultFuture::new(async move {
|
|
|
+ let _ = delete_workspace_request(&token, params, &url).await?;
|
|
|
+ Ok(())
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
fn create_view(&self, token: &str, params: CreateViewParams) -> ResultFuture<View, WorkspaceError> {
|
|
|
let token = token.to_owned();
|
|
|
let url = self.config.view_url();
|
|
|
- ResultFuture::new(async move { create_view_request(&token, params, &url).await })
|
|
|
+ ResultFuture::new(async move {
|
|
|
+ let view = create_view_request(&token, params, &url).await?;
|
|
|
+ Ok(view)
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
fn read_view(&self, token: &str, params: ViewIdentifier) -> ResultFuture<Option<View>, WorkspaceError> {
|
|
|
let token = token.to_owned();
|
|
|
let url = self.config.view_url();
|
|
|
- ResultFuture::new(async move { read_view_request(&token, params, &url).await })
|
|
|
+ ResultFuture::new(async move {
|
|
|
+ let view = read_view_request(&token, params, &url).await?;
|
|
|
+ Ok(view)
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
fn delete_view(&self, token: &str, params: ViewIdentifiers) -> ResultFuture<(), WorkspaceError> {
|
|
|
let token = token.to_owned();
|
|
|
let url = self.config.view_url();
|
|
|
- ResultFuture::new(async move { delete_view_request(&token, params, &url).await })
|
|
|
+ ResultFuture::new(async move {
|
|
|
+ let _ = delete_view_request(&token, params, &url).await?;
|
|
|
+ Ok(())
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
fn update_view(&self, token: &str, params: UpdateViewParams) -> ResultFuture<(), WorkspaceError> {
|
|
|
let token = token.to_owned();
|
|
|
let url = self.config.view_url();
|
|
|
- ResultFuture::new(async move { update_view_request(&token, params, &url).await })
|
|
|
+ ResultFuture::new(async move {
|
|
|
+ let _ = update_view_request(&token, params, &url).await?;
|
|
|
+ Ok(())
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
fn create_app(&self, token: &str, params: CreateAppParams) -> ResultFuture<App, WorkspaceError> {
|
|
|
let token = token.to_owned();
|
|
|
let url = self.config.app_url();
|
|
|
- ResultFuture::new(async move { create_app_request(&token, params, &url).await })
|
|
|
+ ResultFuture::new(async move {
|
|
|
+ let app = create_app_request(&token, params, &url).await?;
|
|
|
+ Ok(app)
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
fn read_app(&self, token: &str, params: AppIdentifier) -> ResultFuture<Option<App>, WorkspaceError> {
|
|
|
let token = token.to_owned();
|
|
|
let url = self.config.app_url();
|
|
|
- ResultFuture::new(async move { read_app_request(&token, params, &url).await })
|
|
|
+ ResultFuture::new(async move {
|
|
|
+ let app = read_app_request(&token, params, &url).await?;
|
|
|
+ Ok(app)
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
fn update_app(&self, token: &str, params: UpdateAppParams) -> ResultFuture<(), WorkspaceError> {
|
|
|
let token = token.to_owned();
|
|
|
let url = self.config.app_url();
|
|
|
- ResultFuture::new(async move { update_app_request(&token, params, &url).await })
|
|
|
+ ResultFuture::new(async move {
|
|
|
+ let _ = update_app_request(&token, params, &url).await?;
|
|
|
+ Ok(())
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
fn delete_app(&self, token: &str, params: AppIdentifier) -> ResultFuture<(), WorkspaceError> {
|
|
|
let token = token.to_owned();
|
|
|
let url = self.config.app_url();
|
|
|
- ResultFuture::new(async move { delete_app_request(&token, params, &url).await })
|
|
|
+ ResultFuture::new(async move {
|
|
|
+ let _ = delete_app_request(&token, params, &url).await?;
|
|
|
+ Ok(())
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
fn create_trash(&self, token: &str, params: TrashIdentifiers) -> ResultFuture<(), WorkspaceError> {
|
|
|
let token = token.to_owned();
|
|
|
let url = self.config.trash_url();
|
|
|
- ResultFuture::new(async move { create_trash_request(&token, params, &url).await })
|
|
|
+ ResultFuture::new(async move {
|
|
|
+ let _ = create_trash_request(&token, params, &url).await?;
|
|
|
+ Ok(())
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
fn delete_trash(&self, token: &str, params: TrashIdentifiers) -> ResultFuture<(), WorkspaceError> {
|
|
|
let token = token.to_owned();
|
|
|
let url = self.config.trash_url();
|
|
|
- ResultFuture::new(async move { delete_trash_request(&token, params, &url).await })
|
|
|
+ ResultFuture::new(async move {
|
|
|
+ let _ = delete_trash_request(&token, params, &url).await?;
|
|
|
+ Ok(())
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
fn read_trash(&self, token: &str) -> ResultFuture<RepeatedTrash, WorkspaceError> {
|
|
|
let token = token.to_owned();
|
|
|
let url = self.config.trash_url();
|
|
|
- ResultFuture::new(async move { read_trash_request(&token, &url).await })
|
|
|
+ ResultFuture::new(async move {
|
|
|
+ let repeated_trash = read_trash_request(&token, &url).await?;
|
|
|
+ Ok(repeated_trash)
|
|
|
+ })
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
-pub(crate) fn request_builder() -> HttpRequestBuilder {
|
|
|
- HttpRequestBuilder::new().middleware(super::middleware::MIDDLEWARE.clone())
|
|
|
-}
|
|
|
-pub async fn create_workspace_request(
|
|
|
- token: &str,
|
|
|
- params: CreateWorkspaceParams,
|
|
|
- url: &str,
|
|
|
-) -> Result<Workspace, WorkspaceError> {
|
|
|
- let workspace = request_builder()
|
|
|
- .post(&url.to_owned())
|
|
|
- .header(HEADER_TOKEN, token)
|
|
|
- .protobuf(params)?
|
|
|
- .response()
|
|
|
- .await?;
|
|
|
- Ok(workspace)
|
|
|
-}
|
|
|
-
|
|
|
-pub async fn read_workspaces_request(
|
|
|
- token: &str,
|
|
|
- params: QueryWorkspaceParams,
|
|
|
- url: &str,
|
|
|
-) -> Result<RepeatedWorkspace, WorkspaceError> {
|
|
|
- let repeated_workspace = request_builder()
|
|
|
- .get(&url.to_owned())
|
|
|
- .header(HEADER_TOKEN, token)
|
|
|
- .protobuf(params)?
|
|
|
- .response::<RepeatedWorkspace>()
|
|
|
- .await?;
|
|
|
-
|
|
|
- Ok(repeated_workspace)
|
|
|
-}
|
|
|
-
|
|
|
-pub async fn update_workspace_request(
|
|
|
- token: &str,
|
|
|
- params: UpdateWorkspaceParams,
|
|
|
- url: &str,
|
|
|
-) -> Result<(), WorkspaceError> {
|
|
|
- let _ = request_builder()
|
|
|
- .patch(&url.to_owned())
|
|
|
- .header(HEADER_TOKEN, token)
|
|
|
- .protobuf(params)?
|
|
|
- .send()
|
|
|
- .await?;
|
|
|
- Ok(())
|
|
|
-}
|
|
|
-
|
|
|
-pub async fn delete_workspace_request(
|
|
|
- token: &str,
|
|
|
- params: DeleteWorkspaceParams,
|
|
|
- url: &str,
|
|
|
-) -> Result<(), WorkspaceError> {
|
|
|
- let _ = request_builder()
|
|
|
- .delete(url)
|
|
|
- .header(HEADER_TOKEN, token)
|
|
|
- .protobuf(params)?
|
|
|
- .send()
|
|
|
- .await?;
|
|
|
- Ok(())
|
|
|
-}
|
|
|
-
|
|
|
-// App
|
|
|
-pub async fn create_app_request(token: &str, params: CreateAppParams, url: &str) -> Result<App, WorkspaceError> {
|
|
|
- let app = request_builder()
|
|
|
- .post(&url.to_owned())
|
|
|
- .header(HEADER_TOKEN, token)
|
|
|
- .protobuf(params)?
|
|
|
- .response()
|
|
|
- .await?;
|
|
|
- Ok(app)
|
|
|
-}
|
|
|
-
|
|
|
-pub async fn read_app_request(token: &str, params: AppIdentifier, url: &str) -> Result<Option<App>, WorkspaceError> {
|
|
|
- let app = request_builder()
|
|
|
- .get(&url.to_owned())
|
|
|
- .header(HEADER_TOKEN, token)
|
|
|
- .protobuf(params)?
|
|
|
- .option_response()
|
|
|
- .await?;
|
|
|
-
|
|
|
- Ok(app)
|
|
|
-}
|
|
|
-
|
|
|
-pub async fn update_app_request(token: &str, params: UpdateAppParams, url: &str) -> Result<(), WorkspaceError> {
|
|
|
- let _ = request_builder()
|
|
|
- .patch(&url.to_owned())
|
|
|
- .header(HEADER_TOKEN, token)
|
|
|
- .protobuf(params)?
|
|
|
- .send()
|
|
|
- .await?;
|
|
|
- Ok(())
|
|
|
-}
|
|
|
-
|
|
|
-pub async fn delete_app_request(token: &str, params: AppIdentifier, url: &str) -> Result<(), WorkspaceError> {
|
|
|
- let _ = request_builder()
|
|
|
- .delete(&url.to_owned())
|
|
|
- .header(HEADER_TOKEN, token)
|
|
|
- .protobuf(params)?
|
|
|
- .send()
|
|
|
- .await?;
|
|
|
- Ok(())
|
|
|
-}
|
|
|
-
|
|
|
-// View
|
|
|
-pub async fn create_view_request(token: &str, params: CreateViewParams, url: &str) -> Result<View, WorkspaceError> {
|
|
|
- let view = request_builder()
|
|
|
- .post(&url.to_owned())
|
|
|
- .header(HEADER_TOKEN, token)
|
|
|
- .protobuf(params)?
|
|
|
- .response()
|
|
|
- .await?;
|
|
|
- Ok(view)
|
|
|
-}
|
|
|
-
|
|
|
-pub async fn read_view_request(token: &str, params: ViewIdentifier, url: &str) -> Result<Option<View>, WorkspaceError> {
|
|
|
- let view = request_builder()
|
|
|
- .get(&url.to_owned())
|
|
|
- .header(HEADER_TOKEN, token)
|
|
|
- .protobuf(params)?
|
|
|
- .option_response()
|
|
|
- .await?;
|
|
|
-
|
|
|
- Ok(view)
|
|
|
-}
|
|
|
-
|
|
|
-pub async fn update_view_request(token: &str, params: UpdateViewParams, url: &str) -> Result<(), WorkspaceError> {
|
|
|
- let _ = request_builder()
|
|
|
- .patch(&url.to_owned())
|
|
|
- .header(HEADER_TOKEN, token)
|
|
|
- .protobuf(params)?
|
|
|
- .send()
|
|
|
- .await?;
|
|
|
- Ok(())
|
|
|
-}
|
|
|
-
|
|
|
-pub async fn delete_view_request(token: &str, params: ViewIdentifiers, url: &str) -> Result<(), WorkspaceError> {
|
|
|
- let _ = request_builder()
|
|
|
- .delete(&url.to_owned())
|
|
|
- .header(HEADER_TOKEN, token)
|
|
|
- .protobuf(params)?
|
|
|
- .send()
|
|
|
- .await?;
|
|
|
- Ok(())
|
|
|
-}
|
|
|
-
|
|
|
-pub async fn create_trash_request(token: &str, params: TrashIdentifiers, url: &str) -> Result<(), WorkspaceError> {
|
|
|
- let _ = request_builder()
|
|
|
- .post(&url.to_owned())
|
|
|
- .header(HEADER_TOKEN, token)
|
|
|
- .protobuf(params)?
|
|
|
- .send()
|
|
|
- .await?;
|
|
|
- Ok(())
|
|
|
-}
|
|
|
-
|
|
|
-pub async fn delete_trash_request(token: &str, params: TrashIdentifiers, url: &str) -> Result<(), WorkspaceError> {
|
|
|
- let _ = request_builder()
|
|
|
- .delete(&url.to_owned())
|
|
|
- .header(HEADER_TOKEN, token)
|
|
|
- .protobuf(params)?
|
|
|
- .send()
|
|
|
- .await?;
|
|
|
- Ok(())
|
|
|
-}
|
|
|
-
|
|
|
-pub async fn read_trash_request(token: &str, url: &str) -> Result<RepeatedTrash, WorkspaceError> {
|
|
|
- let repeated_trash = request_builder()
|
|
|
- .get(&url.to_owned())
|
|
|
- .header(HEADER_TOKEN, token)
|
|
|
- .response::<RepeatedTrash>()
|
|
|
- .await?;
|
|
|
- Ok(repeated_trash)
|
|
|
-}
|