65 lines
2.4 KiB
Rust
Raw Normal View History

2021-09-14 16:22:44 +08:00
use crate::{
entities::doc::{ApplyChangesetParams, CreateDocParams, Doc, QueryDocParams, SaveDocParams},
2021-09-21 15:07:07 +08:00
errors::{internal_error, DocError},
services::{doc_controller::DocController, open_doc::OpenedDocManager, server::construct_doc_server, ws::WsManager},
2021-09-14 16:22:44 +08:00
};
2021-09-13 23:09:57 +08:00
use diesel::SqliteConnection;
use flowy_database::ConnectionPool;
2021-09-20 15:38:55 +08:00
use parking_lot::RwLock;
2021-09-21 15:07:07 +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 {
2021-09-20 15:38:55 +08:00
fn user_dir(&self) -> Result<String, DocError>;
fn user_id(&self) -> Result<String, DocError>;
fn token(&self) -> Result<String, DocError>;
}
2021-09-13 23:09:57 +08:00
pub struct FlowyDocument {
controller: Arc<DocController>,
2021-09-21 15:07:07 +08:00
doc_manager: Arc<OpenedDocManager>,
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 {
2021-09-21 15:07:07 +08:00
pub fn new(user: Arc<dyn DocumentUser>, ws_manager: Arc<RwLock<WsManager>>) -> FlowyDocument {
2021-09-11 14:26:30 +08:00
let server = construct_doc_server();
2021-09-13 23:09:57 +08:00
let controller = Arc::new(DocController::new(server.clone(), user.clone()));
2021-09-21 15:07:07 +08:00
let doc_manager = Arc::new(OpenedDocManager::new(ws_manager, controller.clone()));
Self { controller, doc_manager }
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-21 15:07:07 +08:00
let _ = self.doc_manager.close(&params.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-21 15:07:07 +08:00
let doc = match self.doc_manager.is_opened(&params.doc_id) {
2021-09-16 13:41:07 +08:00
true => {
2021-09-21 15:07:07 +08:00
let data = self.doc_manager.read_doc(&params.doc_id).await?;
2021-09-16 13:41:07 +08:00
Doc { id: params.doc_id, data }
},
false => {
let doc = self.controller.open(params, pool).await?;
2021-09-21 15:07:07 +08:00
let _ = self.doc_manager.open(&doc.id, doc.data.clone())?;
2021-09-16 13:41:07 +08:00
doc
},
};
2021-09-13 23:09:57 +08:00
Ok(doc)
}
2021-09-21 15:07:07 +08:00
pub async fn apply_changeset(&self, params: ApplyChangesetParams, pool: Arc<ConnectionPool>) -> Result<Doc, DocError> {
let _ = self.doc_manager.apply_changeset(&params.id, params.data, pool).await?;
let data = self.doc_manager.read_doc(&params.id).await?;
2021-09-16 13:41:07 +08:00
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
}