persistence.rs 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. use flowy_sync::entities::revision::{RepeatedRevision, Revision};
  2. use flowy_sync::{
  3. entities::{folder::FolderInfo, text_block::DocumentPB},
  4. errors::CollaborateError,
  5. server_document::*,
  6. server_folder::FolderCloudPersistence,
  7. util::{make_document_from_revision_pbs, make_folder_from_revisions_pb},
  8. };
  9. use lib_infra::future::BoxResultFuture;
  10. use std::{
  11. fmt::{Debug, Formatter},
  12. sync::Arc,
  13. };
  14. // For the moment, we use memory to cache the data, it will be implemented with
  15. // other storage. Like the Firestore,Dropbox.etc.
  16. pub trait RevisionCloudStorage: Send + Sync {
  17. fn set_revisions(&self, repeated_revision: RepeatedRevision) -> BoxResultFuture<(), CollaborateError>;
  18. fn get_revisions(
  19. &self,
  20. object_id: &str,
  21. rev_ids: Option<Vec<i64>>,
  22. ) -> BoxResultFuture<RepeatedRevision, CollaborateError>;
  23. fn reset_object(
  24. &self,
  25. object_id: &str,
  26. repeated_revision: RepeatedRevision,
  27. ) -> BoxResultFuture<(), CollaborateError>;
  28. }
  29. pub(crate) struct LocalTextBlockCloudPersistence {
  30. storage: Arc<dyn RevisionCloudStorage>,
  31. }
  32. impl Debug for LocalTextBlockCloudPersistence {
  33. fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
  34. f.write_str("LocalRevisionCloudPersistence")
  35. }
  36. }
  37. impl std::default::Default for LocalTextBlockCloudPersistence {
  38. fn default() -> Self {
  39. LocalTextBlockCloudPersistence {
  40. storage: Arc::new(MemoryDocumentCloudStorage::default()),
  41. }
  42. }
  43. }
  44. impl FolderCloudPersistence for LocalTextBlockCloudPersistence {
  45. fn read_folder(&self, _user_id: &str, folder_id: &str) -> BoxResultFuture<FolderInfo, CollaborateError> {
  46. let storage = self.storage.clone();
  47. let folder_id = folder_id.to_owned();
  48. Box::pin(async move {
  49. let repeated_revision = storage.get_revisions(&folder_id, None).await?;
  50. match make_folder_from_revisions_pb(&folder_id, repeated_revision)? {
  51. Some(folder_info) => Ok(folder_info),
  52. None => Err(CollaborateError::record_not_found()),
  53. }
  54. })
  55. }
  56. fn create_folder(
  57. &self,
  58. _user_id: &str,
  59. folder_id: &str,
  60. repeated_revision: RepeatedRevision,
  61. ) -> BoxResultFuture<Option<FolderInfo>, CollaborateError> {
  62. let folder_id = folder_id.to_owned();
  63. let storage = self.storage.clone();
  64. Box::pin(async move {
  65. let _ = storage.set_revisions(repeated_revision.clone()).await?;
  66. make_folder_from_revisions_pb(&folder_id, repeated_revision)
  67. })
  68. }
  69. fn save_folder_revisions(&self, repeated_revision: RepeatedRevision) -> BoxResultFuture<(), CollaborateError> {
  70. let storage = self.storage.clone();
  71. Box::pin(async move {
  72. let _ = storage.set_revisions(repeated_revision).await?;
  73. Ok(())
  74. })
  75. }
  76. fn read_folder_revisions(
  77. &self,
  78. folder_id: &str,
  79. rev_ids: Option<Vec<i64>>,
  80. ) -> BoxResultFuture<Vec<Revision>, CollaborateError> {
  81. let folder_id = folder_id.to_owned();
  82. let storage = self.storage.clone();
  83. Box::pin(async move {
  84. let repeated_revision = storage.get_revisions(&folder_id, rev_ids).await?;
  85. Ok(repeated_revision.into_inner())
  86. })
  87. }
  88. fn reset_folder(
  89. &self,
  90. folder_id: &str,
  91. repeated_revision: RepeatedRevision,
  92. ) -> BoxResultFuture<(), CollaborateError> {
  93. let storage = self.storage.clone();
  94. let folder_id = folder_id.to_owned();
  95. Box::pin(async move {
  96. let _ = storage.reset_object(&folder_id, repeated_revision).await?;
  97. Ok(())
  98. })
  99. }
  100. }
  101. impl TextBlockCloudPersistence for LocalTextBlockCloudPersistence {
  102. fn read_text_block(&self, doc_id: &str) -> BoxResultFuture<DocumentPB, CollaborateError> {
  103. let storage = self.storage.clone();
  104. let doc_id = doc_id.to_owned();
  105. Box::pin(async move {
  106. let repeated_revision = storage.get_revisions(&doc_id, None).await?;
  107. match make_document_from_revision_pbs(&doc_id, repeated_revision)? {
  108. Some(document_info) => Ok(document_info),
  109. None => Err(CollaborateError::record_not_found()),
  110. }
  111. })
  112. }
  113. fn create_text_block(
  114. &self,
  115. doc_id: &str,
  116. repeated_revision: RepeatedRevision,
  117. ) -> BoxResultFuture<Option<DocumentPB>, CollaborateError> {
  118. let doc_id = doc_id.to_owned();
  119. let storage = self.storage.clone();
  120. Box::pin(async move {
  121. let _ = storage.set_revisions(repeated_revision.clone()).await?;
  122. make_document_from_revision_pbs(&doc_id, repeated_revision)
  123. })
  124. }
  125. fn read_text_block_revisions(
  126. &self,
  127. doc_id: &str,
  128. rev_ids: Option<Vec<i64>>,
  129. ) -> BoxResultFuture<Vec<Revision>, CollaborateError> {
  130. let doc_id = doc_id.to_owned();
  131. let storage = self.storage.clone();
  132. Box::pin(async move {
  133. let repeated_revision = storage.get_revisions(&doc_id, rev_ids).await?;
  134. Ok(repeated_revision.into_inner())
  135. })
  136. }
  137. fn save_text_block_revisions(&self, repeated_revision: RepeatedRevision) -> BoxResultFuture<(), CollaborateError> {
  138. let storage = self.storage.clone();
  139. Box::pin(async move {
  140. let _ = storage.set_revisions(repeated_revision).await?;
  141. Ok(())
  142. })
  143. }
  144. fn reset_text_block(&self, doc_id: &str, revisions: RepeatedRevision) -> BoxResultFuture<(), CollaborateError> {
  145. let storage = self.storage.clone();
  146. let doc_id = doc_id.to_owned();
  147. Box::pin(async move {
  148. let _ = storage.reset_object(&doc_id, revisions).await?;
  149. Ok(())
  150. })
  151. }
  152. }
  153. #[derive(Default)]
  154. struct MemoryDocumentCloudStorage {}
  155. impl RevisionCloudStorage for MemoryDocumentCloudStorage {
  156. fn set_revisions(&self, _repeated_revision: RepeatedRevision) -> BoxResultFuture<(), CollaborateError> {
  157. Box::pin(async move { Ok(()) })
  158. }
  159. fn get_revisions(
  160. &self,
  161. _doc_id: &str,
  162. _rev_ids: Option<Vec<i64>>,
  163. ) -> BoxResultFuture<RepeatedRevision, CollaborateError> {
  164. Box::pin(async move {
  165. let repeated_revisions = RepeatedRevision::default();
  166. Ok(repeated_revisions)
  167. })
  168. }
  169. fn reset_object(
  170. &self,
  171. _doc_id: &str,
  172. _repeated_revision: RepeatedRevision,
  173. ) -> BoxResultFuture<(), CollaborateError> {
  174. Box::pin(async move { Ok(()) })
  175. }
  176. }