persistence.rs 6.5 KB

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