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};
|
2022-01-19 16:00:11 +08:00
|
|
|
use flowy_core_data_model::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-19 16:00:11 +08:00
|
|
|
use flowy_collaboration::folder::FolderPad;
|
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},
|
2022-01-19 16:00:11 +08:00
|
|
|
services::{
|
|
|
|
persistence::FolderPersistence,
|
|
|
|
set_current_workspace,
|
|
|
|
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! {
|
2022-01-19 16:00:11 +08:00
|
|
|
static ref INIT_FOLDER_FLAG: RwLock<HashMap<String, bool>> = RwLock::new(HashMap::new());
|
2021-12-06 15:49:21 +08:00
|
|
|
}
|
|
|
|
|
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() {
|
2022-01-19 16:00:11 +08:00
|
|
|
INIT_FOLDER_FLAG.write().insert(token, false);
|
2021-12-06 15:49:21 +08:00
|
|
|
}
|
|
|
|
|
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-19 16:00:11 +08:00
|
|
|
pub async fn initialize(&self, user_id: &str) -> FlowyResult<()> {
|
|
|
|
if let Some(is_init) = INIT_FOLDER_FLAG.read().get(user_id) {
|
2022-01-18 22:56:57 +08:00
|
|
|
if *is_init {
|
|
|
|
return Ok(());
|
|
|
|
}
|
|
|
|
}
|
2022-01-19 16:00:11 +08:00
|
|
|
let _ = self.persistence.initialize(user_id).await?;
|
2022-01-18 22:56:57 +08:00
|
|
|
let _ = self.app_controller.initialize()?;
|
|
|
|
let _ = self.view_controller.initialize()?;
|
2022-01-19 16:00:11 +08:00
|
|
|
INIT_FOLDER_FLAG.write().insert(user_id.to_owned(), true);
|
2022-01-18 22:56:57 +08:00
|
|
|
Ok(())
|
|
|
|
}
|
2021-12-06 15:49:21 +08:00
|
|
|
|
2022-01-19 16:00:11 +08:00
|
|
|
pub async fn initialize_with_new_user(&self, user_id: &str, token: &str) -> FlowyResult<()> {
|
|
|
|
DefaultFolderBuilder::build(token, user_id, self.persistence.clone(), self.view_controller.clone()).await?;
|
|
|
|
self.initialize(user_id).await
|
|
|
|
}
|
|
|
|
|
|
|
|
pub async fn clear(&self) { self.persistence.user_did_logout() }
|
|
|
|
}
|
|
|
|
|
|
|
|
struct DefaultFolderBuilder();
|
|
|
|
impl DefaultFolderBuilder {
|
|
|
|
async fn build(
|
|
|
|
token: &str,
|
|
|
|
user_id: &str,
|
|
|
|
persistence: Arc<FolderPersistence>,
|
|
|
|
view_controller: Arc<ViewController>,
|
|
|
|
) -> 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);
|
2022-01-19 16:00:11 +08:00
|
|
|
set_current_workspace(&workspace.id);
|
|
|
|
for app in workspace.apps.iter() {
|
|
|
|
for (index, view) in app.belongings.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()
|
|
|
|
};
|
2022-01-19 16:00:11 +08:00
|
|
|
view_controller.set_latest_view(&view);
|
|
|
|
let _ = view_controller
|
|
|
|
.create_view_document_content(&view.id, view_data)
|
|
|
|
.await?;
|
2021-12-06 15:49:21 +08:00
|
|
|
}
|
|
|
|
}
|
2022-01-19 16:00:11 +08:00
|
|
|
let folder = FolderPad::new(vec![workspace.clone()], vec![])?;
|
|
|
|
let _ = persistence.save_folder(user_id, folder).await?;
|
|
|
|
let repeated_workspace = RepeatedWorkspace { items: vec![workspace] };
|
|
|
|
send_dart_notification(token, WorkspaceNotification::UserCreateWorkspace)
|
2021-12-06 15:49:21 +08:00
|
|
|
.payload(repeated_workspace)
|
|
|
|
.send();
|
2021-12-06 21:47:21 +08:00
|
|
|
Ok(())
|
|
|
|
}
|
2021-12-06 15:49:21 +08:00
|
|
|
}
|