2021-07-23 08:14:45 +08:00
|
|
|
use crate::{
|
2021-07-31 10:50:56 +08:00
|
|
|
errors::DocError,
|
2021-09-14 16:22:44 +08:00
|
|
|
services::{doc_cache::DocCache, server::construct_doc_server},
|
2021-07-23 08:14:45 +08:00
|
|
|
};
|
2021-09-11 20:09:46 +08:00
|
|
|
|
2021-09-14 16:22:44 +08:00
|
|
|
use crate::{
|
|
|
|
entities::doc::{ApplyChangesetParams, CreateDocParams, Doc, QueryDocParams, SaveDocParams},
|
|
|
|
services::doc_controller::DocController,
|
|
|
|
};
|
2021-09-13 23:09:57 +08:00
|
|
|
use diesel::SqliteConnection;
|
|
|
|
use flowy_database::ConnectionPool;
|
2021-09-16 12:35:55 +08:00
|
|
|
|
|
|
|
use crate::errors::internal_error;
|
2021-07-23 15:00:13 +08:00
|
|
|
use std::sync::Arc;
|
2021-07-22 22:26:38 +08:00
|
|
|
|
2021-07-31 10:50:56 +08:00
|
|
|
pub trait DocumentUser: Send + Sync {
|
|
|
|
fn user_doc_dir(&self) -> Result<String, DocError>;
|
2021-09-09 15:43:05 +08:00
|
|
|
fn user_id(&self) -> Result<String, DocError>;
|
|
|
|
fn token(&self) -> Result<String, DocError>;
|
2021-07-23 14:37:18 +08:00
|
|
|
}
|
|
|
|
|
2021-09-13 23:09:57 +08:00
|
|
|
pub struct FlowyDocument {
|
|
|
|
controller: Arc<DocController>,
|
2021-09-14 16:22:44 +08:00
|
|
|
cache: Arc<DocCache>,
|
2021-09-11 14:26:30 +08:00
|
|
|
}
|
2021-07-22 22:26:38 +08:00
|
|
|
|
2021-09-13 23:09:57 +08:00
|
|
|
impl FlowyDocument {
|
|
|
|
pub fn new(user: Arc<dyn DocumentUser>) -> FlowyDocument {
|
2021-09-11 14:26:30 +08:00
|
|
|
let server = construct_doc_server();
|
2021-09-14 16:22:44 +08:00
|
|
|
let cache = Arc::new(DocCache::new());
|
2021-09-13 23:09:57 +08:00
|
|
|
let controller = Arc::new(DocController::new(server.clone(), user.clone()));
|
2021-09-14 16:22:44 +08:00
|
|
|
Self { controller, cache }
|
2021-09-13 23:09:57 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
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> {
|
2021-09-14 16:22:44 +08:00
|
|
|
let _ = self.cache.close(¶ms.doc_id)?;
|
2021-09-13 23:09:57 +08:00
|
|
|
let _ = self.controller.delete(params.into(), conn)?;
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
|
|
|
pub async fn open(&self, params: QueryDocParams, pool: Arc<ConnectionPool>) -> Result<Doc, DocError> {
|
2021-09-16 13:41:07 +08:00
|
|
|
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
|
|
|
|
},
|
|
|
|
};
|
2021-09-13 23:09:57 +08:00
|
|
|
|
|
|
|
Ok(doc)
|
|
|
|
}
|
|
|
|
|
2021-09-14 16:22:44 +08:00
|
|
|
pub async fn update(&self, params: SaveDocParams, pool: Arc<ConnectionPool>) -> Result<(), DocError> {
|
2021-09-16 12:35:55 +08:00
|
|
|
let _ = self.controller.update(params, &*pool.get().map_err(internal_error)?)?;
|
2021-09-14 16:22:44 +08:00
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
2021-09-15 16:35:40 +08:00
|
|
|
pub async fn apply_changeset(&self, params: ApplyChangesetParams) -> Result<Doc, DocError> {
|
2021-09-14 16:22:44 +08:00
|
|
|
let _ = self
|
|
|
|
.cache
|
|
|
|
.mut_doc(¶ms.id, |doc| {
|
|
|
|
let _ = doc.apply_changeset(params.data.clone())?;
|
|
|
|
Ok(())
|
|
|
|
})
|
|
|
|
.await?;
|
2021-09-15 16:35:40 +08:00
|
|
|
|
2021-09-16 13:41:07 +08:00
|
|
|
let data = self.cache.read_doc(¶ms.id).await?;
|
|
|
|
let doc = Doc { id: params.id, data };
|
2021-09-15 16:35:40 +08:00
|
|
|
Ok(doc)
|
2021-09-11 14:26:30 +08:00
|
|
|
}
|
2021-07-22 22:26:38 +08:00
|
|
|
}
|