use crate::{ errors::DocError, services::{doc_cache::DocCache, server::construct_doc_server}, }; use crate::{ entities::doc::{ApplyChangesetParams, CreateDocParams, Doc, QueryDocParams, SaveDocParams}, services::doc_controller::DocController, }; use diesel::SqliteConnection; use flowy_database::ConnectionPool; use crate::errors::internal_error; use std::sync::Arc; pub trait DocumentUser: Send + Sync { fn user_doc_dir(&self) -> Result; fn user_id(&self) -> Result; fn token(&self) -> Result; } pub struct FlowyDocument { controller: Arc, cache: Arc, } impl FlowyDocument { pub fn new(user: Arc) -> FlowyDocument { let server = construct_doc_server(); let cache = Arc::new(DocCache::new()); let controller = Arc::new(DocController::new(server.clone(), user.clone())); Self { controller, cache } } pub fn create(&self, params: CreateDocParams, conn: &SqliteConnection) -> Result<(), DocError> { let _ = self.controller.create(params, conn)?; Ok(()) } pub fn delete(&self, params: QueryDocParams, conn: &SqliteConnection) -> Result<(), DocError> { let _ = self.cache.close(¶ms.doc_id)?; let _ = self.controller.delete(params.into(), conn)?; Ok(()) } pub async fn open(&self, params: QueryDocParams, pool: Arc) -> Result { let doc = match self.cache.is_opened(¶ms.doc_id) { true => { let data = self.cache.read_doc(¶ms.doc_id).await?; Doc { id: params.doc_id, data } }, false => { let doc = self.controller.open(params, pool).await?; let _ = self.cache.open(&doc.id, doc.data.clone())?; doc }, }; Ok(doc) } pub async fn update(&self, params: SaveDocParams, pool: Arc) -> Result<(), DocError> { let _ = self.controller.update(params, &*pool.get().map_err(internal_error)?)?; Ok(()) } pub async fn apply_changeset(&self, params: ApplyChangesetParams) -> Result { let _ = self .cache .mut_doc(¶ms.id, |doc| { let _ = doc.apply_changeset(params.data.clone())?; Ok(()) }) .await?; let data = self.cache.read_doc(¶ms.id).await?; let doc = Doc { id: params.id, data }; Ok(doc) } }