view_controller.rs 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. use crate::{
  2. entities::view::{CreateViewParams, UpdateViewParams, View},
  3. errors::WorkspaceError,
  4. module::WorkspaceDatabase,
  5. observable::WorkspaceObservable,
  6. services::{helper::spawn, server::Server},
  7. sql_tables::view::{ViewTable, ViewTableChangeset, ViewTableSql},
  8. };
  9. use crate::{
  10. entities::view::{DeleteViewParams, QueryViewParams, RepeatedView},
  11. module::WorkspaceUser,
  12. observable::ObservableBuilder,
  13. };
  14. use flowy_database::SqliteConnection;
  15. use std::sync::Arc;
  16. pub(crate) struct ViewController {
  17. user: Arc<dyn WorkspaceUser>,
  18. sql: Arc<ViewTableSql>,
  19. server: Server,
  20. database: Arc<dyn WorkspaceDatabase>,
  21. }
  22. impl ViewController {
  23. pub(crate) fn new(user: Arc<dyn WorkspaceUser>, database: Arc<dyn WorkspaceDatabase>, server: Server) -> Self {
  24. let sql = Arc::new(ViewTableSql {});
  25. Self {
  26. user,
  27. sql,
  28. server,
  29. database,
  30. }
  31. }
  32. pub(crate) async fn create_view(&self, params: CreateViewParams) -> Result<View, WorkspaceError> {
  33. let view = self.create_view_on_server(params).await?;
  34. let conn = &*self.database.db_connection()?;
  35. let view_table = ViewTable::new(view.clone());
  36. (conn).immediate_transaction::<_, WorkspaceError, _>(|| {
  37. let _ = self.sql.create_view(view_table, conn)?;
  38. let repeated_view = self.read_local_views_belong_to(&view.belong_to_id, conn)?;
  39. ObservableBuilder::new(&view.belong_to_id, WorkspaceObservable::AppCreateView)
  40. .payload(repeated_view)
  41. .build();
  42. Ok(())
  43. })?;
  44. Ok(view)
  45. }
  46. pub(crate) async fn read_view(&self, params: QueryViewParams) -> Result<View, WorkspaceError> {
  47. let conn = self.database.db_connection()?;
  48. let view_table = self.sql.read_view(&params.view_id, Some(params.is_trash), &*conn)?;
  49. let view: View = view_table.into();
  50. let _ = self.read_view_on_server(params);
  51. Ok(view)
  52. }
  53. pub(crate) async fn delete_view(&self, view_id: &str) -> Result<(), WorkspaceError> {
  54. let conn = &*self.database.db_connection()?;
  55. (conn).immediate_transaction::<_, WorkspaceError, _>(|| {
  56. let view_table = self.sql.delete_view(view_id, conn)?;
  57. let repeated_view = self.read_local_views_belong_to(&view_table.belong_to_id, conn)?;
  58. ObservableBuilder::new(&view_table.belong_to_id, WorkspaceObservable::AppDeleteView)
  59. .payload(repeated_view)
  60. .build();
  61. Ok(())
  62. })?;
  63. let _ = self.delete_view_on_server(view_id);
  64. Ok(())
  65. }
  66. // belong_to_id will be the app_id or view_id.
  67. #[tracing::instrument(level = "debug", skip(self), err)]
  68. pub(crate) async fn read_views_belong_to(&self, belong_to_id: &str) -> Result<RepeatedView, WorkspaceError> {
  69. // TODO: read from server
  70. let conn = self.database.db_connection()?;
  71. let repeated_view = self.read_local_views_belong_to(belong_to_id, &*conn)?;
  72. Ok(repeated_view)
  73. }
  74. pub(crate) async fn update_view(&self, params: UpdateViewParams) -> Result<(), WorkspaceError> {
  75. let conn = &*self.database.db_connection()?;
  76. let changeset = ViewTableChangeset::new(params.clone());
  77. let view_id = changeset.id.clone();
  78. (conn).immediate_transaction::<_, WorkspaceError, _>(|| {
  79. let _ = self.sql.update_view(changeset, conn)?;
  80. let view: View = self.sql.read_view(&view_id, None, conn)?.into();
  81. ObservableBuilder::new(&view_id, WorkspaceObservable::ViewUpdated)
  82. .payload(view)
  83. .build();
  84. Ok(())
  85. })?;
  86. let _ = self.update_view_on_server(params);
  87. Ok(())
  88. }
  89. }
  90. impl ViewController {
  91. #[tracing::instrument(skip(self), err)]
  92. async fn create_view_on_server(&self, params: CreateViewParams) -> Result<View, WorkspaceError> {
  93. let token = self.user.token()?;
  94. let view = self.server.create_view(&token, params).await?;
  95. Ok(view)
  96. }
  97. #[tracing::instrument(skip(self), err)]
  98. async fn update_view_on_server(&self, params: UpdateViewParams) -> Result<(), WorkspaceError> {
  99. let token = self.user.token()?;
  100. let server = self.server.clone();
  101. spawn(async move {
  102. match server.update_view(&token, params).await {
  103. Ok(_) => {},
  104. Err(e) => {
  105. // TODO: retry?
  106. log::error!("Update view failed: {:?}", e);
  107. },
  108. }
  109. });
  110. Ok(())
  111. }
  112. #[tracing::instrument(skip(self), err)]
  113. async fn delete_view_on_server(&self, view_id: &str) -> Result<(), WorkspaceError> {
  114. let token = self.user.token()?;
  115. let server = self.server.clone();
  116. let params = DeleteViewParams {
  117. view_id: view_id.to_string(),
  118. };
  119. spawn(async move {
  120. match server.delete_view(&token, params).await {
  121. Ok(_) => {},
  122. Err(e) => {
  123. // TODO: retry?
  124. log::error!("Delete view failed: {:?}", e);
  125. },
  126. }
  127. });
  128. Ok(())
  129. }
  130. #[tracing::instrument(skip(self), err)]
  131. async fn read_view_on_server(&self, params: QueryViewParams) -> Result<(), WorkspaceError> {
  132. let token = self.user.token()?;
  133. let server = self.server.clone();
  134. spawn(async move {
  135. match server.read_view(&token, params).await {
  136. Ok(_) => {},
  137. Err(e) => {
  138. // TODO: retry?
  139. log::error!("Read view failed: {:?}", e);
  140. },
  141. }
  142. });
  143. Ok(())
  144. }
  145. // belong_to_id will be the app_id or view_id.
  146. fn read_local_views_belong_to(&self, belong_to_id: &str, conn: &SqliteConnection) -> Result<RepeatedView, WorkspaceError> {
  147. let views = self
  148. .sql
  149. .read_views_belong_to(belong_to_id, conn)?
  150. .into_iter()
  151. .map(|view_table| view_table.into())
  152. .collect::<Vec<View>>();
  153. Ok(RepeatedView { items: views })
  154. }
  155. }