1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- 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<String, DocError>;
- fn user_id(&self) -> Result<String, DocError>;
- fn token(&self) -> Result<String, DocError>;
- }
- pub struct FlowyDocument {
- controller: Arc<DocController>,
- cache: Arc<DocCache>,
- }
- impl FlowyDocument {
- pub fn new(user: Arc<dyn DocumentUser>) -> 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<ConnectionPool>) -> Result<Doc, DocError> {
- 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<ConnectionPool>) -> Result<(), DocError> {
- let _ = self.controller.update(params, &*pool.get().map_err(internal_error)?)?;
- Ok(())
- }
- pub async fn apply_changeset(&self, params: ApplyChangesetParams) -> Result<Doc, DocError> {
- 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)
- }
- }
|