mirror of
https://github.com/AppFlowy-IO/AppFlowy.git
synced 2024-08-30 18:12:39 +00:00
chore: impl view data processor
This commit is contained in:
@ -42,6 +42,7 @@ bytes = { version = "1.0" }
|
||||
crossbeam = "0.8"
|
||||
crossbeam-utils = "0.8"
|
||||
chrono = "0.4"
|
||||
async-trait = "0.1.52"
|
||||
|
||||
[dev-dependencies]
|
||||
serial_test = "0.5.1"
|
||||
|
@ -1,17 +1,3 @@
|
||||
use bytes::Bytes;
|
||||
use chrono::Utc;
|
||||
use flowy_collaboration::client_document::default::{initial_quill_delta, initial_quill_delta_string, initial_read_me};
|
||||
use flowy_folder_data_model::user_default;
|
||||
use flowy_sync::RevisionWebSocket;
|
||||
use lazy_static::lazy_static;
|
||||
|
||||
use flowy_block::BlockManager;
|
||||
use flowy_collaboration::{client_folder::FolderPad, entities::ws_data::ServerRevisionWSData};
|
||||
|
||||
use flowy_collaboration::entities::revision::{RepeatedRevision, Revision};
|
||||
use std::{collections::HashMap, convert::TryInto, fmt::Formatter, sync::Arc};
|
||||
use tokio::sync::RwLock as TokioRwLock;
|
||||
|
||||
use crate::{
|
||||
dart_notification::{send_dart_notification, FolderNotification},
|
||||
entities::workspace::RepeatedWorkspace,
|
||||
@ -22,11 +8,22 @@ use crate::{
|
||||
TrashController, ViewController, WorkspaceController,
|
||||
},
|
||||
};
|
||||
|
||||
use async_trait::async_trait;
|
||||
use bytes::Bytes;
|
||||
use chrono::Utc;
|
||||
use flowy_block::BlockManager;
|
||||
use flowy_collaboration::client_document::default::{initial_quill_delta, initial_quill_delta_string, initial_read_me};
|
||||
use flowy_collaboration::entities::revision::{RepeatedRevision, Revision};
|
||||
use flowy_collaboration::{client_folder::FolderPad, entities::ws_data::ServerRevisionWSData};
|
||||
use flowy_folder_data_model::entities::view::ViewDataType;
|
||||
use flowy_folder_data_model::user_default;
|
||||
use flowy_sync::RevisionWebSocket;
|
||||
use lazy_static::lazy_static;
|
||||
use std::{collections::HashMap, convert::TryInto, fmt::Formatter, sync::Arc};
|
||||
use tokio::sync::RwLock as TokioRwLock;
|
||||
lazy_static! {
|
||||
static ref INIT_FOLDER_FLAG: TokioRwLock<HashMap<String, bool>> = TokioRwLock::new(HashMap::new());
|
||||
}
|
||||
|
||||
const FOLDER_ID: &str = "folder";
|
||||
const FOLDER_ID_SPLIT: &str = ":";
|
||||
#[derive(Clone)]
|
||||
@ -72,6 +69,7 @@ impl FolderManager {
|
||||
user: Arc<dyn WorkspaceUser>,
|
||||
cloud_service: Arc<dyn FolderCouldServiceV1>,
|
||||
database: Arc<dyn WorkspaceDatabase>,
|
||||
data_processors: DataProcessorMap,
|
||||
block_manager: Arc<BlockManager>,
|
||||
web_socket: Arc<dyn RevisionWebSocket>,
|
||||
) -> Self {
|
||||
@ -95,6 +93,7 @@ impl FolderManager {
|
||||
persistence.clone(),
|
||||
cloud_service.clone(),
|
||||
trash_controller.clone(),
|
||||
data_processors,
|
||||
block_manager,
|
||||
));
|
||||
|
||||
@ -197,7 +196,7 @@ impl DefaultFolderBuilder {
|
||||
for app in workspace.apps.iter() {
|
||||
for (index, view) in app.belongings.iter().enumerate() {
|
||||
let view_data = if index == 0 {
|
||||
initial_read_me().to_delta_json()
|
||||
initial_read_me().to_delta_str()
|
||||
} else {
|
||||
initial_quill_delta_string()
|
||||
};
|
||||
@ -222,3 +221,14 @@ impl FolderManager {
|
||||
self.folder_editor.read().await.clone().unwrap()
|
||||
}
|
||||
}
|
||||
|
||||
#[async_trait]
|
||||
pub trait ViewDataProcessor {
|
||||
async fn create_container(&self, view_id: &str, repeated_revision: RepeatedRevision) -> FlowyResult<()>;
|
||||
async fn delete_container(&self, view_id: &str) -> FlowyResult<()>;
|
||||
async fn close_container(&self, view_id: &str) -> FlowyResult<()>;
|
||||
async fn delta_str(&self, view_id: &str) -> FlowyResult<String>;
|
||||
fn data_type(&self) -> ViewDataType;
|
||||
}
|
||||
|
||||
pub type DataProcessorMap = Arc<HashMap<ViewDataType, Arc<dyn ViewDataProcessor + Send + Sync>>>;
|
||||
|
@ -6,8 +6,10 @@ use flowy_collaboration::entities::{
|
||||
|
||||
use flowy_collaboration::client_document::default::initial_quill_delta_string;
|
||||
use futures::{FutureExt, StreamExt};
|
||||
use std::collections::HashMap;
|
||||
use std::{collections::HashSet, sync::Arc};
|
||||
|
||||
use crate::manager::DataProcessorMap;
|
||||
use crate::{
|
||||
dart_notification::{send_dart_notification, FolderNotification},
|
||||
entities::{
|
||||
@ -23,6 +25,7 @@ use crate::{
|
||||
};
|
||||
use flowy_block::BlockManager;
|
||||
use flowy_database::kv::KV;
|
||||
use flowy_folder_data_model::entities::view::ViewDataType;
|
||||
use lib_infra::uuid;
|
||||
|
||||
const LATEST_VIEW_ID: &str = "latest_view_id";
|
||||
@ -32,6 +35,7 @@ pub(crate) struct ViewController {
|
||||
cloud_service: Arc<dyn FolderCouldServiceV1>,
|
||||
persistence: Arc<FolderPersistence>,
|
||||
trash_controller: Arc<TrashController>,
|
||||
data_processors: DataProcessorMap,
|
||||
block_manager: Arc<BlockManager>,
|
||||
}
|
||||
|
||||
@ -40,15 +44,17 @@ impl ViewController {
|
||||
user: Arc<dyn WorkspaceUser>,
|
||||
persistence: Arc<FolderPersistence>,
|
||||
cloud_service: Arc<dyn FolderCouldServiceV1>,
|
||||
trash_can: Arc<TrashController>,
|
||||
document_manager: Arc<BlockManager>,
|
||||
trash_controller: Arc<TrashController>,
|
||||
data_processors: DataProcessorMap,
|
||||
block_manager: Arc<BlockManager>,
|
||||
) -> Self {
|
||||
Self {
|
||||
user,
|
||||
cloud_service,
|
||||
persistence,
|
||||
trash_controller: trash_can,
|
||||
block_manager: document_manager,
|
||||
trash_controller,
|
||||
data_processors,
|
||||
block_manager,
|
||||
}
|
||||
}
|
||||
|
||||
@ -127,11 +133,11 @@ impl ViewController {
|
||||
#[tracing::instrument(level = "debug", skip(self), err)]
|
||||
pub(crate) async fn open_view(&self, view_id: &str) -> Result<BlockDelta, FlowyError> {
|
||||
let editor = self.block_manager.open_block(view_id).await?;
|
||||
let delta_str = editor.delta_str().await?;
|
||||
KV::set_str(LATEST_VIEW_ID, view_id.to_owned());
|
||||
let document_json = editor.block_json().await?;
|
||||
Ok(BlockDelta {
|
||||
block_id: view_id.to_string(),
|
||||
delta_json: document_json,
|
||||
delta_str,
|
||||
})
|
||||
}
|
||||
|
||||
@ -160,14 +166,14 @@ impl ViewController {
|
||||
.await?;
|
||||
|
||||
let editor = self.block_manager.open_block(view_id).await?;
|
||||
let document_json = editor.block_json().await?;
|
||||
let delta_str = editor.delta_str().await?;
|
||||
let duplicate_params = CreateViewParams {
|
||||
belong_to_id: view.belong_to_id.clone(),
|
||||
name: format!("{} (copy)", &view.name),
|
||||
desc: view.desc,
|
||||
thumbnail: view.thumbnail,
|
||||
data_type: view.data_type,
|
||||
data: document_json,
|
||||
data: delta_str,
|
||||
view_id: uuid(),
|
||||
ext_data: view.ext_data,
|
||||
plugin_type: view.plugin_type,
|
||||
@ -208,11 +214,6 @@ impl ViewController {
|
||||
Ok(view)
|
||||
}
|
||||
|
||||
pub(crate) async fn receive_delta(&self, params: BlockDelta) -> Result<BlockDelta, FlowyError> {
|
||||
let doc = self.block_manager.receive_local_delta(params).await?;
|
||||
Ok(doc)
|
||||
}
|
||||
|
||||
pub(crate) async fn latest_visit_view(&self) -> FlowyResult<Option<View>> {
|
||||
match KV::get_str(LATEST_VIEW_ID) {
|
||||
None => Ok(None),
|
||||
@ -311,10 +312,10 @@ impl ViewController {
|
||||
}
|
||||
}
|
||||
|
||||
#[tracing::instrument(level = "trace", skip(persistence, document_manager, trash_can))]
|
||||
#[tracing::instrument(level = "trace", skip(persistence, block_manager, trash_can))]
|
||||
async fn handle_trash_event(
|
||||
persistence: Arc<FolderPersistence>,
|
||||
document_manager: Arc<BlockManager>,
|
||||
block_manager: Arc<BlockManager>,
|
||||
trash_can: Arc<TrashController>,
|
||||
event: TrashEvent,
|
||||
) {
|
||||
@ -352,7 +353,7 @@ async fn handle_trash_event(
|
||||
for identifier in identifiers.items {
|
||||
let view = transaction.read_view(&identifier.id)?;
|
||||
let _ = transaction.delete_view(&identifier.id)?;
|
||||
let _ = document_manager.delete(&identifier.id)?;
|
||||
let _ = block_manager.delete_block(&identifier.id)?;
|
||||
notify_ids.insert(view.belong_to_id);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user