view_revision_pad.rs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. use crate::entities::revision::{md5, Revision};
  2. use crate::errors::{internal_error, CollaborateError, CollaborateResult};
  3. use crate::util::{cal_diff, make_text_delta_from_revisions};
  4. use flowy_grid_data_model::revision::{
  5. FieldRevision, FieldTypeRevision, FilterConfigurationRevision, FilterConfigurationsByFieldId, GridViewRevision,
  6. GroupConfigurationRevision, GroupConfigurationsByFieldId, SortConfigurationsByFieldId,
  7. };
  8. use lib_ot::core::{OperationTransform, PhantomAttributes, TextDelta, TextDeltaBuilder};
  9. use std::sync::Arc;
  10. #[derive(Debug, Clone)]
  11. pub struct GridViewRevisionPad {
  12. view: Arc<GridViewRevision>,
  13. delta: TextDelta,
  14. }
  15. impl std::ops::Deref for GridViewRevisionPad {
  16. type Target = GridViewRevision;
  17. fn deref(&self) -> &Self::Target {
  18. &self.view
  19. }
  20. }
  21. impl GridViewRevisionPad {
  22. pub fn new(grid_id: String) -> Self {
  23. let view = Arc::new(GridViewRevision::new(grid_id));
  24. let json = serde_json::to_string(&view).unwrap();
  25. let delta = TextDeltaBuilder::new().insert(&json).build();
  26. Self { view, delta }
  27. }
  28. pub fn from_delta(delta: TextDelta) -> CollaborateResult<Self> {
  29. let s = delta.content()?;
  30. let view: GridViewRevision = serde_json::from_str(&s).map_err(|e| {
  31. let msg = format!("Deserialize delta to GridViewRevision failed: {}", e);
  32. tracing::error!("{}", s);
  33. CollaborateError::internal().context(msg)
  34. })?;
  35. Ok(Self {
  36. view: Arc::new(view),
  37. delta,
  38. })
  39. }
  40. pub fn from_revisions(_grid_id: &str, revisions: Vec<Revision>) -> CollaborateResult<Self> {
  41. let delta: TextDelta = make_text_delta_from_revisions(revisions)?;
  42. Self::from_delta(delta)
  43. }
  44. pub fn get_all_groups(&self, field_revs: &[Arc<FieldRevision>]) -> Option<GroupConfigurationsByFieldId> {
  45. self.setting.groups.get_all_objects(field_revs)
  46. }
  47. pub fn get_groups(
  48. &self,
  49. field_id: &str,
  50. field_type_rev: &FieldTypeRevision,
  51. ) -> Option<Vec<Arc<GroupConfigurationRevision>>> {
  52. self.setting.groups.get_objects(field_id, field_type_rev)
  53. }
  54. pub fn insert_group(
  55. &mut self,
  56. field_id: &str,
  57. field_type: &FieldTypeRevision,
  58. group_rev: GroupConfigurationRevision,
  59. ) -> CollaborateResult<Option<GridViewRevisionChangeset>> {
  60. self.modify(|view| {
  61. // only one group can be set
  62. view.setting.groups.remove_all();
  63. view.setting.groups.insert_object(field_id, field_type, group_rev);
  64. Ok(Some(()))
  65. })
  66. }
  67. pub fn delete_group(
  68. &mut self,
  69. field_id: &str,
  70. field_type: &FieldTypeRevision,
  71. group_id: &str,
  72. ) -> CollaborateResult<Option<GridViewRevisionChangeset>> {
  73. self.modify(|view| {
  74. if let Some(groups) = view.setting.groups.get_mut_objects(field_id, field_type) {
  75. groups.retain(|group| group.id != group_id);
  76. Ok(Some(()))
  77. } else {
  78. Ok(None)
  79. }
  80. })
  81. }
  82. pub fn get_all_filters(&self, field_revs: &[Arc<FieldRevision>]) -> Option<FilterConfigurationsByFieldId> {
  83. self.setting.filters.get_all_objects(field_revs)
  84. }
  85. pub fn get_filters(
  86. &self,
  87. field_id: &str,
  88. field_type_rev: &FieldTypeRevision,
  89. ) -> Option<Vec<Arc<FilterConfigurationRevision>>> {
  90. self.setting.filters.get_objects(field_id, field_type_rev)
  91. }
  92. pub fn insert_filter(
  93. &mut self,
  94. field_id: &str,
  95. field_type: &FieldTypeRevision,
  96. filter_rev: FilterConfigurationRevision,
  97. ) -> CollaborateResult<Option<GridViewRevisionChangeset>> {
  98. self.modify(|view| {
  99. view.setting.filters.insert_object(field_id, field_type, filter_rev);
  100. Ok(Some(()))
  101. })
  102. }
  103. pub fn delete_filter(
  104. &mut self,
  105. field_id: &str,
  106. field_type: &FieldTypeRevision,
  107. filter_id: &str,
  108. ) -> CollaborateResult<Option<GridViewRevisionChangeset>> {
  109. self.modify(|view| {
  110. if let Some(filters) = view.setting.filters.get_mut_objects(field_id, field_type) {
  111. filters.retain(|filter| filter.id != filter_id);
  112. Ok(Some(()))
  113. } else {
  114. Ok(None)
  115. }
  116. })
  117. }
  118. pub fn get_all_sort(&self) -> Option<SortConfigurationsByFieldId> {
  119. None
  120. }
  121. pub fn json_str(&self) -> CollaborateResult<String> {
  122. make_grid_view_rev_json_str(&self.view)
  123. }
  124. fn modify<F>(&mut self, f: F) -> CollaborateResult<Option<GridViewRevisionChangeset>>
  125. where
  126. F: FnOnce(&mut GridViewRevision) -> CollaborateResult<Option<()>>,
  127. {
  128. let cloned_view = self.view.clone();
  129. match f(Arc::make_mut(&mut self.view))? {
  130. None => Ok(None),
  131. Some(_) => {
  132. let old = make_grid_view_rev_json_str(&cloned_view)?;
  133. let new = self.json_str()?;
  134. match cal_diff::<PhantomAttributes>(old, new) {
  135. None => Ok(None),
  136. Some(delta) => {
  137. self.delta = self.delta.compose(&delta)?;
  138. let md5 = md5(&self.delta.json_bytes());
  139. Ok(Some(GridViewRevisionChangeset { delta, md5 }))
  140. }
  141. }
  142. }
  143. }
  144. }
  145. }
  146. pub struct GridViewRevisionChangeset {
  147. pub delta: TextDelta,
  148. pub md5: String,
  149. }
  150. pub fn make_grid_view_rev_json_str(grid_revision: &GridViewRevision) -> CollaborateResult<String> {
  151. let json = serde_json::to_string(grid_revision)
  152. .map_err(|err| internal_error(format!("Serialize grid view to json str failed. {:?}", err)))?;
  153. Ok(json)
  154. }