module.rs 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. use crate::{
  2. errors::DocError,
  3. services::{doc_cache::DocCache, server::construct_doc_server},
  4. };
  5. use crate::{
  6. entities::doc::{ApplyChangesetParams, CreateDocParams, Doc, QueryDocParams, SaveDocParams},
  7. services::doc_controller::DocController,
  8. };
  9. use diesel::SqliteConnection;
  10. use flowy_database::ConnectionPool;
  11. use crate::errors::internal_error;
  12. use std::sync::Arc;
  13. pub trait DocumentUser: Send + Sync {
  14. fn user_doc_dir(&self) -> Result<String, DocError>;
  15. fn user_id(&self) -> Result<String, DocError>;
  16. fn token(&self) -> Result<String, DocError>;
  17. }
  18. pub struct FlowyDocument {
  19. controller: Arc<DocController>,
  20. cache: Arc<DocCache>,
  21. }
  22. impl FlowyDocument {
  23. pub fn new(user: Arc<dyn DocumentUser>) -> FlowyDocument {
  24. let server = construct_doc_server();
  25. let cache = Arc::new(DocCache::new());
  26. let controller = Arc::new(DocController::new(server.clone(), user.clone()));
  27. Self { controller, cache }
  28. }
  29. pub fn create(&self, params: CreateDocParams, conn: &SqliteConnection) -> Result<(), DocError> {
  30. let _ = self.controller.create(params, conn)?;
  31. Ok(())
  32. }
  33. pub fn delete(&self, params: QueryDocParams, conn: &SqliteConnection) -> Result<(), DocError> {
  34. let _ = self.cache.close(&params.doc_id)?;
  35. let _ = self.controller.delete(params.into(), conn)?;
  36. Ok(())
  37. }
  38. pub async fn open(&self, params: QueryDocParams, pool: Arc<ConnectionPool>) -> Result<Doc, DocError> {
  39. let doc = match self.cache.is_opened(&params.doc_id) {
  40. true => {
  41. let data = self.cache.read_doc(&params.doc_id).await?;
  42. Doc { id: params.doc_id, data }
  43. },
  44. false => {
  45. let doc = self.controller.open(params, pool).await?;
  46. let _ = self.cache.open(&doc.id, doc.data.clone())?;
  47. doc
  48. },
  49. };
  50. Ok(doc)
  51. }
  52. pub async fn update(&self, params: SaveDocParams, pool: Arc<ConnectionPool>) -> Result<(), DocError> {
  53. let _ = self.controller.update(params, &*pool.get().map_err(internal_error)?)?;
  54. Ok(())
  55. }
  56. pub async fn apply_changeset(&self, params: ApplyChangesetParams) -> Result<Doc, DocError> {
  57. let _ = self
  58. .cache
  59. .mut_doc(&params.id, |doc| {
  60. let _ = doc.apply_changeset(params.data.clone())?;
  61. Ok(())
  62. })
  63. .await?;
  64. let data = self.cache.read_doc(&params.id).await?;
  65. let doc = Doc { id: params.id, data };
  66. Ok(doc)
  67. }
  68. }