2021-07-14 21:12:52 +08:00
|
|
|
use crate::{entities::workspace::*, errors::*, module::WorkspaceUser, sql_tables::workspace::*};
|
|
|
|
|
use flowy_database::{prelude::*, schema::workspace_table};
|
2021-07-19 11:32:33 +08:00
|
|
|
|
2021-07-19 16:15:20 +08:00
|
|
|
use flowy_database::schema::workspace_table::dsl;
|
|
|
|
|
use flowy_dispatch::prelude::DispatchFuture;
|
2021-07-13 23:08:20 +08:00
|
|
|
use std::sync::Arc;
|
|
|
|
|
|
|
|
|
|
pub struct WorkspaceController {
|
2021-07-18 23:56:36 +08:00
|
|
|
pub user: Arc<dyn WorkspaceUser>,
|
2021-07-13 23:08:20 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl WorkspaceController {
|
2021-07-14 21:12:52 +08:00
|
|
|
pub fn new(user: Arc<dyn WorkspaceUser>) -> Self { Self { user } }
|
2021-07-13 23:08:20 +08:00
|
|
|
|
2021-07-18 23:56:36 +08:00
|
|
|
pub async fn save_workspace(
|
2021-07-14 08:07:25 +08:00
|
|
|
&self,
|
|
|
|
|
params: CreateWorkspaceParams,
|
|
|
|
|
) -> Result<WorkspaceDetail, WorkspaceError> {
|
2021-07-19 17:37:58 +08:00
|
|
|
let workspace = WorkspaceTable::new(params);
|
2021-07-14 08:07:25 +08:00
|
|
|
let detail: WorkspaceDetail = workspace.clone().into();
|
|
|
|
|
|
2021-07-13 23:08:20 +08:00
|
|
|
let _ = diesel::insert_into(workspace_table::table)
|
|
|
|
|
.values(workspace)
|
2021-07-19 11:32:33 +08:00
|
|
|
.execute(&*(self.user.db_connection()?))?;
|
2021-07-13 23:08:20 +08:00
|
|
|
|
2021-07-19 16:15:20 +08:00
|
|
|
let _ = self.user.set_cur_workspace_id(&detail.id).await?;
|
2021-07-15 08:46:16 +08:00
|
|
|
|
2021-07-14 08:07:25 +08:00
|
|
|
Ok(detail)
|
2021-07-13 23:08:20 +08:00
|
|
|
}
|
|
|
|
|
|
2021-07-19 16:15:20 +08:00
|
|
|
pub fn get_workspace(
|
|
|
|
|
&self,
|
|
|
|
|
workspace_id: &str,
|
2021-07-19 17:37:58 +08:00
|
|
|
) -> DispatchFuture<Result<WorkspaceTable, WorkspaceError>> {
|
2021-07-19 16:15:20 +08:00
|
|
|
let user = self.user.clone();
|
|
|
|
|
let workspace_id = workspace_id.to_owned();
|
|
|
|
|
DispatchFuture {
|
|
|
|
|
fut: Box::pin(async move {
|
|
|
|
|
let workspace = dsl::workspace_table
|
|
|
|
|
.filter(workspace_table::id.eq(&workspace_id))
|
2021-07-19 17:37:58 +08:00
|
|
|
.first::<WorkspaceTable>(&*(user.db_connection()?))?;
|
2021-07-19 16:15:20 +08:00
|
|
|
|
|
|
|
|
// TODO: fetch workspace from remote server
|
|
|
|
|
Ok(workspace)
|
|
|
|
|
}),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-07-13 23:08:20 +08:00
|
|
|
pub fn update_workspace(&self, params: UpdateWorkspaceParams) -> Result<(), WorkspaceError> {
|
2021-07-19 17:37:58 +08:00
|
|
|
let changeset = WorkspaceTableChangeset::new(params);
|
2021-07-14 21:12:52 +08:00
|
|
|
let conn = self.user.db_connection()?;
|
2021-07-13 23:08:20 +08:00
|
|
|
diesel_update_table!(workspace_table, changeset, conn);
|
|
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
|
}
|
2021-07-19 16:15:20 +08:00
|
|
|
|
|
|
|
|
pub async fn get_user_workspace_detail(&self) -> Result<UserWorkspaceDetail, WorkspaceError> {
|
|
|
|
|
let user_workspace = self.user.get_cur_workspace().await?;
|
|
|
|
|
let workspace = self.get_workspace(&user_workspace.workspace_id).await?;
|
|
|
|
|
|
|
|
|
|
Ok(UserWorkspaceDetail {
|
|
|
|
|
owner: user_workspace.owner,
|
|
|
|
|
workspace: workspace.into(),
|
|
|
|
|
})
|
|
|
|
|
}
|
2021-07-13 23:08:20 +08:00
|
|
|
}
|