grid_pad.rs 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. use crate::entities::revision::{md5, RepeatedRevision, Revision};
  2. use crate::errors::{internal_error, CollaborateError, CollaborateResult};
  3. use crate::util::{cal_diff, make_delta_from_revisions};
  4. use flowy_grid_data_model::entities::{
  5. Field, FieldChangeset, GridBlock, GridBlockChangeset, GridMeta, RepeatedField, RepeatedFieldOrder,
  6. };
  7. use lib_infra::uuid;
  8. use lib_ot::core::{OperationTransformable, PlainTextAttributes, PlainTextDelta, PlainTextDeltaBuilder};
  9. use std::collections::HashMap;
  10. use std::sync::Arc;
  11. pub type GridMetaDelta = PlainTextDelta;
  12. pub type GridDeltaBuilder = PlainTextDeltaBuilder;
  13. pub struct GridMetaPad {
  14. pub(crate) grid_meta: Arc<GridMeta>,
  15. pub(crate) delta: GridMetaDelta,
  16. }
  17. impl GridMetaPad {
  18. pub fn from_delta(delta: GridMetaDelta) -> CollaborateResult<Self> {
  19. let s = delta.to_str()?;
  20. let grid: GridMeta = serde_json::from_str(&s)
  21. .map_err(|e| CollaborateError::internal().context(format!("Deserialize delta to grid failed: {}", e)))?;
  22. Ok(Self {
  23. grid_meta: Arc::new(grid),
  24. delta,
  25. })
  26. }
  27. pub fn from_revisions(_grid_id: &str, revisions: Vec<Revision>) -> CollaborateResult<Self> {
  28. let grid_delta: GridMetaDelta = make_delta_from_revisions::<PlainTextAttributes>(revisions)?;
  29. Self::from_delta(grid_delta)
  30. }
  31. pub fn create_field(&mut self, field: Field) -> CollaborateResult<Option<GridChange>> {
  32. self.modify_grid(|grid| {
  33. grid.fields.push(field);
  34. Ok(Some(()))
  35. })
  36. }
  37. pub fn delete_field(&mut self, field_id: &str) -> CollaborateResult<Option<GridChange>> {
  38. self.modify_grid(|grid| match grid.fields.iter().position(|field| field.id == field_id) {
  39. None => Ok(None),
  40. Some(index) => {
  41. grid.fields.remove(index);
  42. Ok(Some(()))
  43. }
  44. })
  45. }
  46. pub fn get_fields(&self, field_orders: Option<RepeatedFieldOrder>) -> CollaborateResult<RepeatedField> {
  47. match field_orders {
  48. None => Ok(self.grid_meta.fields.clone().into()),
  49. Some(field_orders) => {
  50. let field_by_field_id = self
  51. .grid_meta
  52. .fields
  53. .iter()
  54. .map(|field| (&field.id, field))
  55. .collect::<HashMap<&String, &Field>>();
  56. let fields = field_orders
  57. .iter()
  58. .flat_map(|field_order| match field_by_field_id.get(&field_order.field_id) {
  59. None => {
  60. tracing::error!("Can't find the field with id: {}", field_order.field_id);
  61. None
  62. }
  63. Some(field) => Some((*field).clone()),
  64. })
  65. .collect::<Vec<Field>>();
  66. Ok(fields.into())
  67. }
  68. }
  69. }
  70. pub fn update_field(&mut self, change: FieldChangeset) -> CollaborateResult<Option<GridChange>> {
  71. let field_id = change.field_id.clone();
  72. self.modify_field(&field_id, |field| {
  73. let mut is_changed = None;
  74. if let Some(name) = change.name {
  75. field.name = name;
  76. is_changed = Some(())
  77. }
  78. if let Some(desc) = change.desc {
  79. field.desc = desc;
  80. is_changed = Some(())
  81. }
  82. if let Some(field_type) = change.field_type {
  83. field.field_type = field_type;
  84. is_changed = Some(())
  85. }
  86. if let Some(frozen) = change.frozen {
  87. field.frozen = frozen;
  88. is_changed = Some(())
  89. }
  90. if let Some(visibility) = change.visibility {
  91. field.visibility = visibility;
  92. is_changed = Some(())
  93. }
  94. if let Some(width) = change.width {
  95. field.width = width;
  96. is_changed = Some(())
  97. }
  98. if let Some(type_options) = change.type_options {
  99. field.type_options = type_options;
  100. is_changed = Some(())
  101. }
  102. Ok(is_changed)
  103. })
  104. }
  105. pub fn create_block(&mut self, block: GridBlock) -> CollaborateResult<Option<GridChange>> {
  106. self.modify_grid(|grid| {
  107. grid.blocks.push(block);
  108. Ok(Some(()))
  109. })
  110. }
  111. pub fn get_blocks(&self) -> Vec<GridBlock> {
  112. self.grid_meta.blocks.clone()
  113. }
  114. pub fn update_block(&mut self, change: GridBlockChangeset) -> CollaborateResult<Option<GridChange>> {
  115. let block_id = change.block_id.clone();
  116. self.modify_block(&block_id, |block| {
  117. let mut is_changed = None;
  118. if let Some(row_count) = change.row_count {
  119. block.row_count = row_count;
  120. is_changed = Some(());
  121. }
  122. Ok(is_changed)
  123. })
  124. }
  125. pub fn md5(&self) -> String {
  126. md5(&self.delta.to_bytes())
  127. }
  128. pub fn delta_str(&self) -> String {
  129. self.delta.to_delta_str()
  130. }
  131. pub fn fields(&self) -> &[Field] {
  132. &self.grid_meta.fields
  133. }
  134. fn modify_grid<F>(&mut self, f: F) -> CollaborateResult<Option<GridChange>>
  135. where
  136. F: FnOnce(&mut GridMeta) -> CollaborateResult<Option<()>>,
  137. {
  138. let cloned_grid = self.grid_meta.clone();
  139. match f(Arc::make_mut(&mut self.grid_meta))? {
  140. None => Ok(None),
  141. Some(_) => {
  142. let old = json_from_grid(&cloned_grid)?;
  143. let new = json_from_grid(&self.grid_meta)?;
  144. match cal_diff::<PlainTextAttributes>(old, new) {
  145. None => Ok(None),
  146. Some(delta) => {
  147. self.delta = self.delta.compose(&delta)?;
  148. Ok(Some(GridChange { delta, md5: self.md5() }))
  149. }
  150. }
  151. }
  152. }
  153. }
  154. pub fn modify_block<F>(&mut self, block_id: &str, f: F) -> CollaborateResult<Option<GridChange>>
  155. where
  156. F: FnOnce(&mut GridBlock) -> CollaborateResult<Option<()>>,
  157. {
  158. self.modify_grid(|grid| match grid.blocks.iter().position(|block| block.id == block_id) {
  159. None => {
  160. tracing::warn!("[GridMetaPad]: Can't find any block with id: {}", block_id);
  161. Ok(None)
  162. }
  163. Some(index) => f(&mut grid.blocks[index]),
  164. })
  165. }
  166. pub fn modify_field<F>(&mut self, field_id: &str, f: F) -> CollaborateResult<Option<GridChange>>
  167. where
  168. F: FnOnce(&mut Field) -> CollaborateResult<Option<()>>,
  169. {
  170. self.modify_grid(|grid| match grid.fields.iter().position(|field| field.id == field_id) {
  171. None => {
  172. tracing::warn!("[GridMetaPad]: Can't find any field with id: {}", field_id);
  173. Ok(None)
  174. }
  175. Some(index) => f(&mut grid.fields[index]),
  176. })
  177. }
  178. }
  179. fn json_from_grid(grid: &Arc<GridMeta>) -> CollaborateResult<String> {
  180. let json = serde_json::to_string(grid)
  181. .map_err(|err| internal_error(format!("Serialize grid to json str failed. {:?}", err)))?;
  182. Ok(json)
  183. }
  184. pub struct GridChange {
  185. pub delta: GridMetaDelta,
  186. /// md5: the md5 of the grid after applying the change.
  187. pub md5: String,
  188. }
  189. pub fn make_grid_delta(grid_meta: &GridMeta) -> GridMetaDelta {
  190. let json = serde_json::to_string(&grid_meta).unwrap();
  191. PlainTextDeltaBuilder::new().insert(&json).build()
  192. }
  193. pub fn make_grid_revisions(user_id: &str, grid_meta: &GridMeta) -> RepeatedRevision {
  194. let delta = make_grid_delta(grid_meta);
  195. let bytes = delta.to_bytes();
  196. let revision = Revision::initial_revision(user_id, &grid_meta.grid_id, bytes);
  197. revision.into()
  198. }
  199. impl std::default::Default for GridMetaPad {
  200. fn default() -> Self {
  201. let grid = GridMeta {
  202. grid_id: uuid(),
  203. fields: vec![],
  204. blocks: vec![],
  205. };
  206. let delta = make_grid_delta(&grid);
  207. GridMetaPad {
  208. grid_meta: Arc::new(grid),
  209. delta,
  210. }
  211. }
  212. }