grid_view_manager.rs 8.4 KB

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