database_view_revision_pad.rs 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344
  1. use crate::errors::{internal_sync_error, SyncError, SyncResult};
  2. use crate::util::cal_diff;
  3. use database_model::{
  4. DatabaseViewRevision, FieldRevision, FieldTypeRevision, FilterRevision,
  5. GroupConfigurationRevision, LayoutRevision, SortRevision,
  6. };
  7. use flowy_sync::util::make_operations_from_revisions;
  8. use lib_infra::util::md5;
  9. use lib_ot::core::{DeltaBuilder, DeltaOperations, EmptyAttributes, OperationTransform};
  10. use revision_model::Revision;
  11. use std::sync::Arc;
  12. pub type GridViewOperations = DeltaOperations<EmptyAttributes>;
  13. pub type GridViewOperationsBuilder = DeltaBuilder;
  14. #[derive(Debug, Clone)]
  15. pub struct DatabaseViewRevisionPad {
  16. view: Arc<DatabaseViewRevision>,
  17. operations: GridViewOperations,
  18. }
  19. impl std::ops::Deref for DatabaseViewRevisionPad {
  20. type Target = DatabaseViewRevision;
  21. fn deref(&self) -> &Self::Target {
  22. &self.view
  23. }
  24. }
  25. impl DatabaseViewRevisionPad {
  26. // For the moment, the view_id is equal to grid_id. The database_id represents the database id.
  27. // A database can be referenced by multiple views.
  28. pub fn new(database_id: String, view_id: String, layout: LayoutRevision) -> Self {
  29. let view = Arc::new(DatabaseViewRevision::new(database_id, view_id, layout));
  30. let json = serde_json::to_string(&view).unwrap();
  31. let operations = GridViewOperationsBuilder::new().insert(&json).build();
  32. Self { view, operations }
  33. }
  34. pub fn from_operations(operations: GridViewOperations) -> SyncResult<Self> {
  35. if operations.is_empty() {
  36. return Err(SyncError::record_not_found().context("Unexpected empty operations"));
  37. }
  38. let s = operations.content()?;
  39. let view: DatabaseViewRevision = serde_json::from_str(&s).map_err(|e| {
  40. let msg = format!("Deserialize operations to GridViewRevision failed: {}", e);
  41. tracing::error!("parsing json: {}", s);
  42. SyncError::internal().context(msg)
  43. })?;
  44. Ok(Self {
  45. view: Arc::new(view),
  46. operations,
  47. })
  48. }
  49. pub fn from_revisions(revisions: Vec<Revision>) -> SyncResult<Self> {
  50. let operations: GridViewOperations = make_operations_from_revisions(revisions)?;
  51. Self::from_operations(operations)
  52. }
  53. pub fn get_groups_by_field_revs(
  54. &self,
  55. field_revs: &[Arc<FieldRevision>],
  56. ) -> Vec<Arc<GroupConfigurationRevision>> {
  57. self.groups.get_objects_by_field_revs(field_revs)
  58. }
  59. pub fn get_all_groups(&self) -> Vec<Arc<GroupConfigurationRevision>> {
  60. self.groups.get_all_objects()
  61. }
  62. #[tracing::instrument(level = "trace", skip_all, err)]
  63. pub fn insert_or_update_group_configuration(
  64. &mut self,
  65. field_id: &str,
  66. field_type: &FieldTypeRevision,
  67. group_configuration_rev: GroupConfigurationRevision,
  68. ) -> SyncResult<Option<GridViewRevisionChangeset>> {
  69. self.modify(|view| {
  70. // Only save one group
  71. view.groups.clear();
  72. view
  73. .groups
  74. .add_object(field_id, field_type, group_configuration_rev);
  75. Ok(Some(()))
  76. })
  77. }
  78. #[tracing::instrument(level = "trace", skip_all)]
  79. pub fn contains_group(&self, field_id: &str, field_type: &FieldTypeRevision) -> bool {
  80. self.view.groups.get_objects(field_id, field_type).is_some()
  81. }
  82. #[tracing::instrument(level = "trace", skip_all, err)]
  83. pub fn with_mut_group<F: FnOnce(&mut GroupConfigurationRevision)>(
  84. &mut self,
  85. field_id: &str,
  86. field_type: &FieldTypeRevision,
  87. configuration_id: &str,
  88. mut_configuration_fn: F,
  89. ) -> SyncResult<Option<GridViewRevisionChangeset>> {
  90. self.modify(
  91. |view| match view.groups.get_mut_objects(field_id, field_type) {
  92. None => Ok(None),
  93. Some(configurations_revs) => {
  94. for configuration_rev in configurations_revs {
  95. if configuration_rev.id == configuration_id {
  96. mut_configuration_fn(Arc::make_mut(configuration_rev));
  97. return Ok(Some(()));
  98. }
  99. }
  100. Ok(None)
  101. },
  102. },
  103. )
  104. }
  105. pub fn delete_group(
  106. &mut self,
  107. group_id: &str,
  108. field_id: &str,
  109. field_type: &FieldTypeRevision,
  110. ) -> SyncResult<Option<GridViewRevisionChangeset>> {
  111. self.modify(|view| {
  112. if let Some(groups) = view.groups.get_mut_objects(field_id, field_type) {
  113. groups.retain(|group| group.id != group_id);
  114. Ok(Some(()))
  115. } else {
  116. Ok(None)
  117. }
  118. })
  119. }
  120. pub fn get_all_sorts(&self, _field_revs: &[Arc<FieldRevision>]) -> Vec<Arc<SortRevision>> {
  121. self.sorts.get_all_objects()
  122. }
  123. /// For the moment, a field type only have one filter.
  124. pub fn get_sorts(
  125. &self,
  126. field_id: &str,
  127. field_type_rev: &FieldTypeRevision,
  128. ) -> Vec<Arc<SortRevision>> {
  129. self
  130. .sorts
  131. .get_objects(field_id, field_type_rev)
  132. .unwrap_or_default()
  133. }
  134. pub fn get_sort(
  135. &self,
  136. field_id: &str,
  137. field_type_rev: &FieldTypeRevision,
  138. sort_id: &str,
  139. ) -> Option<Arc<SortRevision>> {
  140. self
  141. .sorts
  142. .get_object(field_id, field_type_rev, |sort| sort.id == sort_id)
  143. }
  144. pub fn insert_sort(
  145. &mut self,
  146. field_id: &str,
  147. sort_rev: SortRevision,
  148. ) -> SyncResult<Option<GridViewRevisionChangeset>> {
  149. self.modify(|view| {
  150. let field_type = sort_rev.field_type;
  151. view.sorts.add_object(field_id, &field_type, sort_rev);
  152. Ok(Some(()))
  153. })
  154. }
  155. pub fn update_sort(
  156. &mut self,
  157. field_id: &str,
  158. sort_rev: SortRevision,
  159. ) -> SyncResult<Option<GridViewRevisionChangeset>> {
  160. self.modify(|view| {
  161. if let Some(sort) = view
  162. .sorts
  163. .get_mut_object(field_id, &sort_rev.field_type, |sort| {
  164. sort.id == sort_rev.id
  165. })
  166. {
  167. let sort = Arc::make_mut(sort);
  168. sort.condition = sort_rev.condition;
  169. Ok(Some(()))
  170. } else {
  171. Ok(None)
  172. }
  173. })
  174. }
  175. pub fn delete_sort<T: Into<FieldTypeRevision>>(
  176. &mut self,
  177. sort_id: &str,
  178. field_id: &str,
  179. field_type: T,
  180. ) -> SyncResult<Option<GridViewRevisionChangeset>> {
  181. let field_type = field_type.into();
  182. self.modify(|view| {
  183. if let Some(sorts) = view.sorts.get_mut_objects(field_id, &field_type) {
  184. sorts.retain(|sort| sort.id != sort_id);
  185. Ok(Some(()))
  186. } else {
  187. Ok(None)
  188. }
  189. })
  190. }
  191. pub fn delete_all_sorts(&mut self) -> SyncResult<Option<GridViewRevisionChangeset>> {
  192. self.modify(|view| {
  193. view.sorts.clear();
  194. Ok(Some(()))
  195. })
  196. }
  197. pub fn get_all_filters(&self, field_revs: &[Arc<FieldRevision>]) -> Vec<Arc<FilterRevision>> {
  198. self.filters.get_objects_by_field_revs(field_revs)
  199. }
  200. /// For the moment, a field type only have one filter.
  201. pub fn get_filters(
  202. &self,
  203. field_id: &str,
  204. field_type_rev: &FieldTypeRevision,
  205. ) -> Vec<Arc<FilterRevision>> {
  206. self
  207. .filters
  208. .get_objects(field_id, field_type_rev)
  209. .unwrap_or_default()
  210. }
  211. pub fn get_filter(
  212. &self,
  213. field_id: &str,
  214. field_type_rev: &FieldTypeRevision,
  215. filter_id: &str,
  216. ) -> Option<Arc<FilterRevision>> {
  217. self
  218. .filters
  219. .get_object(field_id, field_type_rev, |filter| filter.id == filter_id)
  220. }
  221. pub fn insert_filter(
  222. &mut self,
  223. field_id: &str,
  224. filter_rev: FilterRevision,
  225. ) -> SyncResult<Option<GridViewRevisionChangeset>> {
  226. self.modify(|view| {
  227. let field_type = filter_rev.field_type;
  228. view.filters.add_object(field_id, &field_type, filter_rev);
  229. Ok(Some(()))
  230. })
  231. }
  232. pub fn update_filter(
  233. &mut self,
  234. field_id: &str,
  235. filter_rev: FilterRevision,
  236. ) -> SyncResult<Option<GridViewRevisionChangeset>> {
  237. self.modify(|view| {
  238. if let Some(filter) =
  239. view
  240. .filters
  241. .get_mut_object(field_id, &filter_rev.field_type, |filter| {
  242. filter.id == filter_rev.id
  243. })
  244. {
  245. let filter = Arc::make_mut(filter);
  246. filter.condition = filter_rev.condition;
  247. filter.content = filter_rev.content;
  248. Ok(Some(()))
  249. } else {
  250. Ok(None)
  251. }
  252. })
  253. }
  254. pub fn delete_filter<T: Into<FieldTypeRevision>>(
  255. &mut self,
  256. filter_id: &str,
  257. field_id: &str,
  258. field_type: T,
  259. ) -> SyncResult<Option<GridViewRevisionChangeset>> {
  260. let field_type = field_type.into();
  261. self.modify(|view| {
  262. if let Some(filters) = view.filters.get_mut_objects(field_id, &field_type) {
  263. filters.retain(|filter| filter.id != filter_id);
  264. Ok(Some(()))
  265. } else {
  266. Ok(None)
  267. }
  268. })
  269. }
  270. pub fn json_str(&self) -> SyncResult<String> {
  271. make_grid_view_rev_json_str(&self.view)
  272. }
  273. pub fn layout(&self) -> LayoutRevision {
  274. self.layout.clone()
  275. }
  276. fn modify<F>(&mut self, f: F) -> SyncResult<Option<GridViewRevisionChangeset>>
  277. where
  278. F: FnOnce(&mut DatabaseViewRevision) -> SyncResult<Option<()>>,
  279. {
  280. let cloned_view = self.view.clone();
  281. match f(Arc::make_mut(&mut self.view))? {
  282. None => Ok(None),
  283. Some(_) => {
  284. let old = make_grid_view_rev_json_str(&cloned_view)?;
  285. let new = self.json_str()?;
  286. match cal_diff::<EmptyAttributes>(old, new) {
  287. None => Ok(None),
  288. Some(operations) => {
  289. self.operations = self.operations.compose(&operations)?;
  290. let md5 = md5(&self.operations.json_bytes());
  291. Ok(Some(GridViewRevisionChangeset { operations, md5 }))
  292. },
  293. }
  294. },
  295. }
  296. }
  297. }
  298. #[derive(Debug)]
  299. pub struct GridViewRevisionChangeset {
  300. pub operations: GridViewOperations,
  301. pub md5: String,
  302. }
  303. pub fn make_grid_view_rev_json_str(grid_revision: &DatabaseViewRevision) -> SyncResult<String> {
  304. let json = serde_json::to_string(grid_revision).map_err(|err| {
  305. internal_sync_error(format!("Serialize grid view to json str failed. {:?}", err))
  306. })?;
  307. Ok(json)
  308. }
  309. pub fn make_grid_view_operations(grid_view: &DatabaseViewRevision) -> GridViewOperations {
  310. let json = serde_json::to_string(grid_view).unwrap();
  311. GridViewOperationsBuilder::new().insert(&json).build()
  312. }