workspace_controller.rs 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. use crate::{
  2. entities::{app::App, workspace::*},
  3. errors::*,
  4. module::{WorkspaceDatabase, WorkspaceUser},
  5. observable::{send_observable, WorkspaceObservable},
  6. services::AppController,
  7. sql_tables::workspace::{WorkspaceSql, WorkspaceTable, WorkspaceTableChangeset},
  8. };
  9. use flowy_dispatch::prelude::DispatchFuture;
  10. use std::sync::Arc;
  11. pub struct WorkspaceController {
  12. pub user: Arc<dyn WorkspaceUser>,
  13. pub sql: Arc<WorkspaceSql>,
  14. pub app_controller: Arc<AppController>,
  15. }
  16. impl WorkspaceController {
  17. pub fn new(
  18. user: Arc<dyn WorkspaceUser>,
  19. database: Arc<dyn WorkspaceDatabase>,
  20. app_controller: Arc<AppController>,
  21. ) -> Self {
  22. let sql = Arc::new(WorkspaceSql { database });
  23. Self {
  24. user,
  25. sql,
  26. app_controller,
  27. }
  28. }
  29. pub async fn create_workspace(
  30. &self,
  31. params: CreateWorkspaceParams,
  32. ) -> Result<Workspace, WorkspaceError> {
  33. let workspace_table = WorkspaceTable::new(params);
  34. let detail: Workspace = workspace_table.clone().into();
  35. let _ = self.sql.create_workspace(workspace_table)?;
  36. Ok(detail)
  37. }
  38. pub fn update_workspace(&self, params: UpdateWorkspaceParams) -> Result<(), WorkspaceError> {
  39. let changeset = WorkspaceTableChangeset::new(params);
  40. let workspace_id = changeset.id.clone();
  41. let _ = self.sql.update_workspace(changeset)?;
  42. send_observable(&workspace_id, WorkspaceObservable::WorkspaceUpdateDesc);
  43. Ok(())
  44. }
  45. pub fn delete_workspace(&self, workspace_id: &str) -> Result<(), WorkspaceError> {
  46. unimplemented!()
  47. }
  48. pub async fn read_cur_workspace(&self) -> Result<Workspace, WorkspaceError> {
  49. let user_workspace = self.user.get_cur_workspace().await?;
  50. let workspace = self.read_workspace(&user_workspace.workspace_id).await?;
  51. Ok(workspace)
  52. }
  53. pub async fn read_cur_apps(&self) -> Result<Vec<App>, WorkspaceError> {
  54. let user_workspace = self.user.get_cur_workspace().await?;
  55. let apps = self.read_apps(&user_workspace.workspace_id).await?;
  56. Ok(apps)
  57. }
  58. pub async fn read_workspace(&self, workspace_id: &str) -> Result<Workspace, WorkspaceError> {
  59. let workspace_table = self.read_workspace_table(workspace_id).await?;
  60. Ok(workspace_table.into())
  61. }
  62. pub async fn read_apps(&self, workspace_id: &str) -> Result<Vec<App>, WorkspaceError> {
  63. let apps = self
  64. .sql
  65. .read_apps_belong_to_workspace(workspace_id)?
  66. .into_iter()
  67. .map(|app_table| app_table.into())
  68. .collect::<Vec<App>>();
  69. Ok(apps)
  70. }
  71. fn read_workspace_table(
  72. &self,
  73. workspace_id: &str,
  74. ) -> DispatchFuture<Result<WorkspaceTable, WorkspaceError>> {
  75. let sql = self.sql.clone();
  76. let workspace_id = workspace_id.to_owned();
  77. DispatchFuture {
  78. fut: Box::pin(async move {
  79. let workspace = sql.read_workspace(&workspace_id)?;
  80. // TODO: fetch workspace from remote server
  81. Ok(workspace)
  82. }),
  83. }
  84. }
  85. }