grid_view_manager.rs 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. use crate::entities::{
  2. CreateRowParams, GridFilterConfiguration, GridLayout, GridSettingPB, MoveRowParams, RepeatedGridGroupPB, RowPB,
  3. };
  4. use crate::manager::GridUser;
  5. use crate::services::block_manager::GridBlockManager;
  6. use crate::services::grid_editor_task::GridServiceTaskScheduler;
  7. use crate::services::grid_view_editor::GridViewRevisionEditor;
  8. use bytes::Bytes;
  9. use dashmap::DashMap;
  10. use flowy_error::FlowyResult;
  11. use flowy_grid_data_model::revision::{FieldRevision, RowRevision};
  12. use flowy_revision::disk::SQLiteGridViewRevisionPersistence;
  13. use flowy_revision::{RevisionCompactor, RevisionManager, RevisionPersistence, SQLiteRevisionSnapshotPersistence};
  14. use flowy_sync::client_grid::GridRevisionPad;
  15. use flowy_sync::entities::grid::GridSettingChangesetParams;
  16. use flowy_sync::entities::revision::Revision;
  17. use flowy_sync::util::make_text_delta_from_revisions;
  18. use lib_infra::future::{wrap_future, AFFuture};
  19. use std::sync::Arc;
  20. use tokio::sync::RwLock;
  21. type ViewId = String;
  22. pub trait GridViewFieldDelegate: Send + Sync + 'static {
  23. fn get_field_revs(&self) -> AFFuture<Vec<Arc<FieldRevision>>>;
  24. fn get_field_rev(&self, field_id: &str) -> AFFuture<Option<Arc<FieldRevision>>>;
  25. }
  26. pub trait GridViewRowDelegate: Send + Sync + 'static {
  27. fn gv_index_of_row(&self, row_id: &str) -> AFFuture<Option<usize>>;
  28. fn gv_get_row_rev(&self, row_id: &str) -> AFFuture<Option<Arc<RowRevision>>>;
  29. fn gv_row_revs(&self) -> AFFuture<Vec<Arc<RowRevision>>>;
  30. }
  31. pub trait GridViewRowOperation: Send + Sync + 'static {
  32. // Will be removed in the future.
  33. fn gv_move_row(&self, row_rev: Arc<RowRevision>, from: usize, to: usize) -> AFFuture<FlowyResult<()>>;
  34. }
  35. pub(crate) struct GridViewManager {
  36. grid_id: String,
  37. user: Arc<dyn GridUser>,
  38. field_delegate: Arc<dyn GridViewFieldDelegate>,
  39. row_delegate: Arc<dyn GridViewRowDelegate>,
  40. row_operation: Arc<dyn GridViewRowOperation>,
  41. view_editors: DashMap<ViewId, Arc<GridViewRevisionEditor>>,
  42. scheduler: Arc<dyn GridServiceTaskScheduler>,
  43. }
  44. impl GridViewManager {
  45. pub(crate) async fn new(
  46. grid_id: String,
  47. user: Arc<dyn GridUser>,
  48. field_delegate: Arc<dyn GridViewFieldDelegate>,
  49. row_delegate: Arc<dyn GridViewRowDelegate>,
  50. row_operation: Arc<dyn GridViewRowOperation>,
  51. scheduler: Arc<dyn GridServiceTaskScheduler>,
  52. ) -> FlowyResult<Self> {
  53. Ok(Self {
  54. grid_id,
  55. user,
  56. scheduler,
  57. field_delegate,
  58. row_delegate,
  59. row_operation,
  60. view_editors: DashMap::default(),
  61. })
  62. }
  63. pub(crate) async fn fill_row(&self, row_rev: &mut RowRevision, params: &CreateRowParams) {
  64. for view_editor in self.view_editors.iter() {
  65. view_editor.fill_row(row_rev, params).await;
  66. }
  67. }
  68. pub(crate) async fn did_update_row(&self, row_id: &str) {
  69. let row = self.row_delegate.gv_get_row_rev(row_id).await;
  70. }
  71. pub(crate) async fn did_create_row(&self, row_pb: &RowPB, params: &CreateRowParams) {
  72. for view_editor in self.view_editors.iter() {
  73. view_editor.did_create_row(row_pb, params).await;
  74. }
  75. }
  76. pub(crate) async fn did_delete_row(&self, row_id: &str) {
  77. for view_editor in self.view_editors.iter() {
  78. view_editor.did_delete_row(row_id).await;
  79. }
  80. }
  81. pub(crate) async fn get_setting(&self) -> FlowyResult<GridSettingPB> {
  82. let view_editor = self.get_default_view_editor().await?;
  83. Ok(view_editor.get_setting().await)
  84. }
  85. pub(crate) async fn update_setting(&self, params: GridSettingChangesetParams) -> FlowyResult<()> {
  86. let view_editor = self.get_default_view_editor().await?;
  87. let _ = view_editor.update_setting(params).await?;
  88. Ok(())
  89. }
  90. pub(crate) async fn get_filters(&self) -> FlowyResult<Vec<GridFilterConfiguration>> {
  91. let view_editor = self.get_default_view_editor().await?;
  92. Ok(view_editor.get_filters().await)
  93. }
  94. pub(crate) async fn load_groups(&self) -> FlowyResult<RepeatedGridGroupPB> {
  95. let view_editor = self.get_default_view_editor().await?;
  96. let groups = view_editor.load_groups().await?;
  97. Ok(RepeatedGridGroupPB { items: groups })
  98. }
  99. pub(crate) async fn move_row(&self, params: MoveRowParams) -> FlowyResult<()> {
  100. let MoveRowParams {
  101. view_id: _,
  102. row_id,
  103. from_index,
  104. to_index,
  105. layout,
  106. upper_row_id,
  107. } = params;
  108. let from_index = from_index as usize;
  109. match self.row_delegate.gv_get_row_rev(&row_id).await {
  110. None => tracing::warn!("Move row failed, can not find the row:{}", row_id),
  111. Some(row_rev) => match layout {
  112. GridLayout::Table => {
  113. tracing::trace!("Move row from {} to {}", from_index, to_index);
  114. let to_index = to_index as usize;
  115. let _ = self.row_operation.gv_move_row(row_rev, from_index, to_index).await?;
  116. }
  117. GridLayout::Board => {
  118. if let Some(upper_row_id) = upper_row_id {
  119. if let Some(to_index) = self.row_delegate.gv_index_of_row(&upper_row_id).await {
  120. tracing::trace!("Move row from {} to {}", from_index, to_index);
  121. let _ = self.row_operation.gv_move_row(row_rev, from_index, to_index).await?;
  122. }
  123. }
  124. }
  125. },
  126. }
  127. Ok(())
  128. }
  129. pub(crate) async fn get_view_editor(&self, view_id: &str) -> FlowyResult<Arc<GridViewRevisionEditor>> {
  130. debug_assert!(!view_id.is_empty());
  131. match self.view_editors.get(view_id) {
  132. None => {
  133. let editor = Arc::new(
  134. make_view_editor(
  135. &self.user,
  136. view_id,
  137. self.field_delegate.clone(),
  138. self.row_delegate.clone(),
  139. self.scheduler.clone(),
  140. )
  141. .await?,
  142. );
  143. self.view_editors.insert(view_id.to_owned(), editor.clone());
  144. Ok(editor)
  145. }
  146. Some(view_editor) => Ok(view_editor.clone()),
  147. }
  148. }
  149. async fn get_default_view_editor(&self) -> FlowyResult<Arc<GridViewRevisionEditor>> {
  150. self.get_view_editor(&self.grid_id).await
  151. }
  152. }
  153. async fn make_view_editor(
  154. user: &Arc<dyn GridUser>,
  155. view_id: &str,
  156. field_delegate: Arc<dyn GridViewFieldDelegate>,
  157. row_delegate: Arc<dyn GridViewRowDelegate>,
  158. scheduler: Arc<dyn GridServiceTaskScheduler>,
  159. ) -> FlowyResult<GridViewRevisionEditor> {
  160. tracing::trace!("Open view:{} editor", view_id);
  161. let rev_manager = make_grid_view_rev_manager(user, view_id).await?;
  162. let user_id = user.user_id()?;
  163. let token = user.token()?;
  164. let view_id = view_id.to_owned();
  165. GridViewRevisionEditor::new(
  166. &user_id,
  167. &token,
  168. view_id,
  169. field_delegate,
  170. row_delegate,
  171. scheduler,
  172. rev_manager,
  173. )
  174. .await
  175. }
  176. pub async fn make_grid_view_rev_manager(user: &Arc<dyn GridUser>, view_id: &str) -> FlowyResult<RevisionManager> {
  177. tracing::trace!("Open view:{} editor", view_id);
  178. let user_id = user.user_id()?;
  179. let pool = user.db_pool()?;
  180. let disk_cache = SQLiteGridViewRevisionPersistence::new(&user_id, pool.clone());
  181. let rev_persistence = RevisionPersistence::new(&user_id, view_id, disk_cache);
  182. let rev_compactor = GridViewRevisionCompactor();
  183. let snapshot_persistence = SQLiteRevisionSnapshotPersistence::new(view_id, pool);
  184. Ok(RevisionManager::new(
  185. &user_id,
  186. view_id,
  187. rev_persistence,
  188. rev_compactor,
  189. snapshot_persistence,
  190. ))
  191. }
  192. pub struct GridViewRevisionCompactor();
  193. impl RevisionCompactor for GridViewRevisionCompactor {
  194. fn bytes_from_revisions(&self, revisions: Vec<Revision>) -> FlowyResult<Bytes> {
  195. let delta = make_text_delta_from_revisions(revisions)?;
  196. Ok(delta.json_bytes())
  197. }
  198. }