reset.rs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. use crate::disk::{RevisionDiskCache, RevisionRecord};
  2. use crate::{RevisionLoader, RevisionPersistence};
  3. use flowy_database::kv::KV;
  4. use flowy_error::{FlowyError, FlowyResult};
  5. use flowy_sync::entities::revision::Revision;
  6. use lib_ot::core::TextDeltaBuilder;
  7. use serde::{Deserialize, Serialize};
  8. use std::str::FromStr;
  9. use std::sync::Arc;
  10. pub trait RevisionResettable {
  11. fn target_id(&self) -> &str;
  12. // String in json format
  13. fn target_reset_rev_str(&self, revisions: Vec<Revision>) -> FlowyResult<String>;
  14. // String in json format
  15. fn default_target_rev_str(&self) -> FlowyResult<String>;
  16. }
  17. pub struct RevisionStructReset<T> {
  18. user_id: String,
  19. target: T,
  20. disk_cache: Arc<dyn RevisionDiskCache<Error = FlowyError>>,
  21. }
  22. impl<T> RevisionStructReset<T>
  23. where
  24. T: RevisionResettable,
  25. {
  26. pub fn new(user_id: &str, object: T, disk_cache: Arc<dyn RevisionDiskCache<Error = FlowyError>>) -> Self {
  27. Self {
  28. user_id: user_id.to_owned(),
  29. target: object,
  30. disk_cache,
  31. }
  32. }
  33. pub async fn run(&self) -> FlowyResult<()> {
  34. match KV::get_str(self.target.target_id()) {
  35. None => {
  36. tracing::trace!("😁 reset object");
  37. let _ = self.reset_object().await?;
  38. let _ = self.save_migrate_record()?;
  39. }
  40. Some(s) => {
  41. let mut record = MigrationGridRecord::from_str(&s)?;
  42. let rev_str = self.target.default_target_rev_str()?;
  43. if record.len < rev_str.len() {
  44. let _ = self.reset_object().await?;
  45. record.len = rev_str.len();
  46. KV::set_str(self.target.target_id(), record.to_string());
  47. }
  48. }
  49. }
  50. Ok(())
  51. }
  52. async fn reset_object(&self) -> FlowyResult<()> {
  53. let rev_persistence = Arc::new(RevisionPersistence::from_disk_cache(
  54. &self.user_id,
  55. self.target.target_id(),
  56. self.disk_cache.clone(),
  57. ));
  58. let (revisions, _) = RevisionLoader {
  59. object_id: self.target.target_id().to_owned(),
  60. user_id: self.user_id.clone(),
  61. cloud: None,
  62. rev_persistence,
  63. }
  64. .load()
  65. .await?;
  66. let s = self.target.target_reset_rev_str(revisions)?;
  67. let delta_data = TextDeltaBuilder::new().insert(&s).build().json_bytes();
  68. let revision = Revision::initial_revision(&self.user_id, self.target.target_id(), delta_data);
  69. let record = RevisionRecord::new(revision);
  70. tracing::trace!("Reset {} revision record object", self.target.target_id());
  71. let _ = self
  72. .disk_cache
  73. .delete_and_insert_records(self.target.target_id(), None, vec![record]);
  74. Ok(())
  75. }
  76. fn save_migrate_record(&self) -> FlowyResult<()> {
  77. let rev_str = self.target.default_target_rev_str()?;
  78. let record = MigrationGridRecord {
  79. object_id: self.target.target_id().to_owned(),
  80. len: rev_str.len(),
  81. };
  82. KV::set_str(self.target.target_id(), record.to_string());
  83. Ok(())
  84. }
  85. }
  86. #[derive(Serialize, Deserialize)]
  87. struct MigrationGridRecord {
  88. object_id: String,
  89. len: usize,
  90. }
  91. impl FromStr for MigrationGridRecord {
  92. type Err = serde_json::Error;
  93. fn from_str(s: &str) -> Result<Self, Self::Err> {
  94. serde_json::from_str::<MigrationGridRecord>(s)
  95. }
  96. }
  97. impl ToString for MigrationGridRecord {
  98. fn to_string(&self) -> String {
  99. serde_json::to_string(self).unwrap_or_else(|_| "".to_string())
  100. }
  101. }