AppFlowy/rust-lib/flowy-workspace/src/services/workspace_controller.rs

100 lines
3.2 KiB
Rust
Raw Normal View History

2021-07-20 14:03:21 +08:00
use crate::{
entities::{app::App, workspace::*},
errors::*,
module::{WorkspaceDatabase, WorkspaceUser},
2021-07-21 22:41:44 +08:00
observable::{send_observable, WorkspaceObservable},
2021-07-20 14:03:21 +08:00
services::AppController,
sql_tables::workspace::{WorkspaceSql, WorkspaceTable, WorkspaceTableChangeset},
};
use flowy_dispatch::prelude::DispatchFuture;
2021-07-13 23:08:20 +08:00
use std::sync::Arc;
pub struct WorkspaceController {
pub user: Arc<dyn WorkspaceUser>,
2021-07-20 14:03:21 +08:00
pub sql: Arc<WorkspaceSql>,
pub app_controller: Arc<AppController>,
2021-07-13 23:08:20 +08:00
}
impl WorkspaceController {
2021-07-20 14:03:21 +08:00
pub fn new(
user: Arc<dyn WorkspaceUser>,
database: Arc<dyn WorkspaceDatabase>,
app_controller: Arc<AppController>,
) -> Self {
let sql = Arc::new(WorkspaceSql { database });
Self {
user,
sql,
app_controller,
}
}
2021-07-13 23:08:20 +08:00
pub async fn save_workspace(
2021-07-14 08:07:25 +08:00
&self,
params: CreateWorkspaceParams,
2021-07-19 22:44:37 +08:00
) -> Result<Workspace, WorkspaceError> {
let workspace_table = WorkspaceTable::new(params);
let detail: Workspace = workspace_table.clone().into();
2021-07-20 14:03:21 +08:00
let _ = self.sql.write_workspace_table(workspace_table)?;
let _ = self.user.set_cur_workspace_id(&detail.id).await?;
2021-07-14 08:07:25 +08:00
Ok(detail)
2021-07-13 23:08:20 +08:00
}
2021-07-20 14:03:21 +08:00
pub fn update_workspace(&self, params: UpdateWorkspaceParams) -> Result<(), WorkspaceError> {
let changeset = WorkspaceTableChangeset::new(params);
2021-07-21 22:41:44 +08:00
let workspace_id = changeset.id.clone();
2021-07-20 14:03:21 +08:00
let _ = self.sql.update_workspace(changeset)?;
2021-07-21 22:41:44 +08:00
send_observable(&workspace_id, WorkspaceObservable::WorkspaceUpdateDesc);
2021-07-20 14:03:21 +08:00
Ok(())
}
pub fn delete_workspace(&self, workspace_id: &str) -> Result<(), WorkspaceError> {
unimplemented!()
}
pub async fn get_cur_workspace(&self) -> Result<Workspace, WorkspaceError> {
let user_workspace = self.user.get_cur_workspace().await?;
let workspace = self.get_workspace(&user_workspace.workspace_id).await?;
Ok(workspace)
}
pub async fn get_cur_apps(&self) -> Result<Vec<App>, WorkspaceError> {
let user_workspace = self.user.get_cur_workspace().await?;
let apps = self.get_apps(&user_workspace.workspace_id).await?;
Ok(apps)
}
pub async fn get_workspace(&self, workspace_id: &str) -> Result<Workspace, WorkspaceError> {
let workspace_table = self.get_workspace_table(workspace_id).await?;
Ok(workspace_table.into())
}
pub async fn get_apps(&self, workspace_id: &str) -> Result<Vec<App>, WorkspaceError> {
let apps = self
.sql
.read_apps_belong_to_workspace(workspace_id)?
.into_iter()
.map(|app_table| app_table.into())
.collect::<Vec<App>>();
Ok(apps)
}
fn get_workspace_table(
&self,
workspace_id: &str,
) -> DispatchFuture<Result<WorkspaceTable, WorkspaceError>> {
2021-07-20 14:03:21 +08:00
let sql = self.sql.clone();
let workspace_id = workspace_id.to_owned();
DispatchFuture {
fut: Box::pin(async move {
2021-07-20 14:03:21 +08:00
let workspace = sql.read_workspace(&workspace_id)?;
// TODO: fetch workspace from remote server
Ok(workspace)
}),
}
}
2021-07-13 23:08:20 +08:00
}