app_controller.rs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. use crate::{
  2. entities::{
  3. app::{App, CreateAppParams, *},
  4. view::View,
  5. },
  6. errors::*,
  7. module::{WorkspaceDatabase, WorkspaceUser},
  8. observable::*,
  9. services::ViewController,
  10. sql_tables::app::{AppTable, AppTableChangeset, AppTableSql},
  11. };
  12. use flowy_dispatch::prelude::DispatchFuture;
  13. use std::sync::Arc;
  14. pub struct AppController {
  15. user: Arc<dyn WorkspaceUser>,
  16. sql: Arc<AppTableSql>,
  17. view_controller: Arc<ViewController>,
  18. }
  19. impl AppController {
  20. pub fn new(
  21. user: Arc<dyn WorkspaceUser>,
  22. database: Arc<dyn WorkspaceDatabase>,
  23. view_controller: Arc<ViewController>,
  24. ) -> Self {
  25. let sql = Arc::new(AppTableSql { database });
  26. Self {
  27. user,
  28. sql,
  29. view_controller,
  30. }
  31. }
  32. pub fn save_app(&self, params: CreateAppParams) -> Result<App, WorkspaceError> {
  33. let app_table = AppTable::new(params);
  34. let app: App = app_table.clone().into();
  35. let _ = self.sql.write_app_table(app_table)?;
  36. send_observable(&app.workspace_id, WorkspaceObservableType::WorkspaceUpdated);
  37. Ok(app)
  38. }
  39. pub async fn get_app(&self, app_id: &str) -> Result<App, WorkspaceError> {
  40. let app_table = self.get_app_table(app_id).await?;
  41. Ok(app_table.into())
  42. }
  43. pub fn update_app(&self, params: UpdateAppParams) -> Result<(), WorkspaceError> {
  44. let changeset = AppTableChangeset::new(params);
  45. let app_id = changeset.id.clone();
  46. let _ = self.sql.update_app_table(changeset)?;
  47. send_observable(&app_id, WorkspaceObservableType::AppDescUpdated);
  48. Ok(())
  49. }
  50. pub async fn get_views(&self, app_id: &str) -> Result<Vec<View>, WorkspaceError> {
  51. let views = self
  52. .sql
  53. .read_views_belong_to_app(app_id)?
  54. .into_iter()
  55. .map(|view_table| view_table.into())
  56. .collect::<Vec<View>>();
  57. Ok(views)
  58. }
  59. fn get_app_table(&self, app_id: &str) -> DispatchFuture<Result<AppTable, WorkspaceError>> {
  60. let sql = self.sql.clone();
  61. let app_id = app_id.to_owned();
  62. DispatchFuture {
  63. fut: Box::pin(async move {
  64. let app_table = sql.read_app_table(&app_id)?;
  65. // TODO: fetch app from remote server
  66. Ok(app_table)
  67. }),
  68. }
  69. }
  70. }