173 lines
5.7 KiB
Rust
Raw Normal View History

2022-01-14 20:52:03 +08:00
use bytes::Bytes;
2021-12-13 13:55:44 +08:00
use chrono::Utc;
2022-01-12 17:08:50 +08:00
use flowy_collaboration::client_document::default::{initial_delta, initial_read_me};
2021-12-29 00:34:00 +08:00
use flowy_core_data_model::{entities::view::CreateViewParams, user_default};
2022-01-14 20:52:03 +08:00
use flowy_document::context::DocumentContext;
use flowy_sync::RevisionWebSocket;
2022-01-10 23:45:59 +08:00
use lazy_static::lazy_static;
2022-01-17 11:55:36 +08:00
2022-01-18 22:56:57 +08:00
use futures_core::future::BoxFuture;
2022-01-10 23:45:59 +08:00
use parking_lot::RwLock;
use std::{collections::HashMap, sync::Arc};
2021-12-13 13:55:44 +08:00
2021-12-06 15:49:21 +08:00
use crate::{
2022-01-13 11:16:26 +08:00
dart_notification::{send_dart_notification, WorkspaceNotification},
2021-12-06 15:49:21 +08:00
entities::workspace::RepeatedWorkspace,
2022-01-18 22:56:57 +08:00
errors::FlowyResult,
2022-01-17 11:55:36 +08:00
module::{FolderCouldServiceV1, WorkspaceUser},
services::{persistence::FolderPersistence, AppController, TrashController, ViewController, WorkspaceController},
2021-12-06 15:49:21 +08:00
};
2021-12-13 13:55:44 +08:00
2021-12-06 15:49:21 +08:00
lazy_static! {
static ref INIT_WORKSPACE: RwLock<HashMap<String, bool>> = RwLock::new(HashMap::new());
}
2022-01-14 20:52:03 +08:00
pub struct FolderManager {
2021-12-06 15:49:21 +08:00
pub user: Arc<dyn WorkspaceUser>,
2022-01-17 11:55:36 +08:00
pub(crate) cloud_service: Arc<dyn FolderCouldServiceV1>,
pub(crate) persistence: Arc<FolderPersistence>,
2021-12-06 15:49:21 +08:00
pub workspace_controller: Arc<WorkspaceController>,
pub(crate) app_controller: Arc<AppController>,
pub(crate) view_controller: Arc<ViewController>,
pub(crate) trash_controller: Arc<TrashController>,
2022-01-14 20:52:03 +08:00
ws_sender: Arc<dyn RevisionWebSocket>,
2021-12-06 15:49:21 +08:00
}
2022-01-14 20:52:03 +08:00
impl FolderManager {
2021-12-06 15:49:21 +08:00
pub(crate) fn new(
user: Arc<dyn WorkspaceUser>,
2022-01-17 11:55:36 +08:00
cloud_service: Arc<dyn FolderCouldServiceV1>,
persistence: Arc<FolderPersistence>,
2022-01-14 20:52:03 +08:00
flowy_document: Arc<DocumentContext>,
ws_sender: Arc<dyn RevisionWebSocket>,
2021-12-06 15:49:21 +08:00
) -> Self {
if let Ok(token) = user.token() {
INIT_WORKSPACE.write().insert(token, false);
}
2022-01-14 20:52:03 +08:00
let trash_controller = Arc::new(TrashController::new(
persistence.clone(),
cloud_service.clone(),
user.clone(),
));
let view_controller = Arc::new(ViewController::new(
user.clone(),
persistence.clone(),
cloud_service.clone(),
trash_controller.clone(),
flowy_document,
));
let app_controller = Arc::new(AppController::new(
user.clone(),
persistence.clone(),
trash_controller.clone(),
cloud_service.clone(),
));
let workspace_controller = Arc::new(WorkspaceController::new(
user.clone(),
persistence.clone(),
trash_controller.clone(),
cloud_service.clone(),
));
2021-12-06 15:49:21 +08:00
Self {
user,
2022-01-10 23:45:59 +08:00
cloud_service,
2022-01-14 09:09:25 +08:00
persistence,
2021-12-06 15:49:21 +08:00
workspace_controller,
app_controller,
view_controller,
trash_controller,
2022-01-14 20:52:03 +08:00
ws_sender,
2021-12-06 15:49:21 +08:00
}
}
2022-01-10 23:45:59 +08:00
// pub fn network_state_changed(&self, new_type: NetworkType) {
// match new_type {
// NetworkType::UnknownNetworkType => {},
// NetworkType::Wifi => {},
// NetworkType::Cell => {},
// NetworkType::Ethernet => {},
// }
// }
2021-12-06 15:49:21 +08:00
2022-01-14 20:52:03 +08:00
pub async fn did_receive_ws_data(&self, _data: Bytes) {}
2022-01-18 22:56:57 +08:00
pub async fn initialize(&self, token: &str) -> FlowyResult<()> {
self.initialize_with_fn(token, || Box::pin(async { Ok(()) })).await?;
2021-12-06 15:49:21 +08:00
Ok(())
}
2022-01-18 22:56:57 +08:00
pub async fn clear(&self) { self.persistence.user_did_logout() }
pub async fn initialize_with_new_user(&self, token: &str) -> FlowyResult<()> {
self.initialize_with_fn(token, || Box::pin(self.initial_default_workspace()))
.await
}
async fn initialize_with_fn<'a, F>(&'a self, token: &str, f: F) -> FlowyResult<()>
where
F: FnOnce() -> BoxFuture<'a, FlowyResult<()>>,
{
if let Some(is_init) = INIT_WORKSPACE.read().get(token) {
if *is_init {
return Ok(());
}
}
INIT_WORKSPACE.write().insert(token.to_owned(), true);
2021-12-06 15:49:21 +08:00
2022-01-18 22:56:57 +08:00
self.persistence.initialize().await?;
f().await?;
let _ = self.app_controller.initialize()?;
let _ = self.view_controller.initialize()?;
Ok(())
}
2021-12-06 15:49:21 +08:00
2022-01-18 22:56:57 +08:00
async fn initial_default_workspace(&self) -> FlowyResult<()> {
2021-12-06 15:49:21 +08:00
log::debug!("Create user default workspace");
let time = Utc::now();
2022-01-18 22:56:57 +08:00
let workspace = user_default::create_default_workspace(time);
let apps = workspace.apps.clone().into_inner();
2021-12-06 15:49:21 +08:00
let cloned_workspace = workspace.clone();
2021-12-29 00:34:00 +08:00
let _ = self.workspace_controller.create_workspace_on_local(workspace).await?;
2022-01-18 22:56:57 +08:00
for app in apps {
2021-12-29 00:34:00 +08:00
let app_id = app.id.clone();
2022-01-18 22:56:57 +08:00
let views = app.belongings.clone().into_inner();
2021-12-29 00:34:00 +08:00
let _ = self.app_controller.create_app_on_local(app).await?;
2021-12-06 15:49:21 +08:00
for (index, view) in views.into_iter().enumerate() {
2021-12-29 00:34:00 +08:00
let view_data = if index == 0 {
initial_read_me().to_json()
} else {
initial_delta().to_json()
};
self.view_controller.set_latest_view(&view);
let params = CreateViewParams {
belong_to_id: app_id.clone(),
name: view.name,
desc: view.desc,
thumbnail: "".to_string(),
view_type: view.view_type,
view_data,
view_id: view.id.clone(),
};
let _ = self.view_controller.create_view_from_params(params).await?;
2021-12-06 15:49:21 +08:00
}
}
let token = self.user.token()?;
let repeated_workspace = RepeatedWorkspace {
items: vec![cloned_workspace],
};
send_dart_notification(&token, WorkspaceNotification::UserCreateWorkspace)
.payload(repeated_workspace)
.send();
2021-12-06 21:47:21 +08:00
Ok(())
}
2021-12-06 15:49:21 +08:00
}