2023-06-03 23:35:55 +08:00
|
|
|
use std::sync::Arc;
|
|
|
|
|
2023-11-01 11:45:35 +08:00
|
|
|
use collab_folder::{FolderData, RepeatedViewIdentifier, ViewIdentifier, Workspace};
|
2024-01-11 14:42:03 +08:00
|
|
|
use flowy_folder_pub::folder_builder::{FlattedViews, ParentChildViews, WorkspaceViewBuilder};
|
2023-06-03 13:55:43 +08:00
|
|
|
use tokio::sync::RwLock;
|
2023-05-17 09:49:39 +08:00
|
|
|
|
2023-06-03 23:35:55 +08:00
|
|
|
use lib_infra::util::timestamp;
|
|
|
|
|
2023-07-14 13:37:13 +08:00
|
|
|
use crate::entities::{view_pb_with_child_views, ViewPB};
|
2023-12-29 13:02:27 +08:00
|
|
|
use crate::view_operation::FolderOperationHandlers;
|
2023-04-04 08:41:16 +08:00
|
|
|
|
|
|
|
pub struct DefaultFolderBuilder();
|
|
|
|
impl DefaultFolderBuilder {
|
|
|
|
pub async fn build(
|
2023-08-17 23:46:39 +08:00
|
|
|
uid: i64,
|
2023-05-21 18:53:59 +08:00
|
|
|
workspace_id: String,
|
2023-05-31 14:08:54 +08:00
|
|
|
handlers: &FolderOperationHandlers,
|
2023-07-14 13:37:13 +08:00
|
|
|
) -> FolderData {
|
2023-11-08 21:48:17 +08:00
|
|
|
let workspace_view_builder = Arc::new(RwLock::new(WorkspaceViewBuilder::new(
|
|
|
|
workspace_id.clone(),
|
|
|
|
uid,
|
|
|
|
)));
|
2023-06-03 13:55:43 +08:00
|
|
|
for handler in handlers.values() {
|
|
|
|
let _ = handler
|
2023-08-17 23:46:39 +08:00
|
|
|
.create_workspace_view(uid, workspace_view_builder.clone())
|
2023-06-03 13:55:43 +08:00
|
|
|
.await;
|
|
|
|
}
|
2023-04-04 08:41:16 +08:00
|
|
|
|
2023-06-03 13:55:43 +08:00
|
|
|
let views = workspace_view_builder.write().await.build();
|
|
|
|
// Safe to unwrap because we have at least one view. check out the DocumentFolderOperation.
|
2023-07-31 19:06:01 +07:00
|
|
|
let first_view = views.first().unwrap().parent_view.clone();
|
2023-04-04 08:41:16 +08:00
|
|
|
|
2023-06-03 13:55:43 +08:00
|
|
|
let first_level_views = views
|
|
|
|
.iter()
|
|
|
|
.map(|value| ViewIdentifier {
|
|
|
|
id: value.parent_view.id.clone(),
|
|
|
|
})
|
|
|
|
.collect::<Vec<_>>();
|
2023-04-04 08:41:16 +08:00
|
|
|
|
|
|
|
let workspace = Workspace {
|
|
|
|
id: workspace_id,
|
|
|
|
name: "Workspace".to_string(),
|
2023-06-23 23:19:34 +08:00
|
|
|
child_views: RepeatedViewIdentifier::new(first_level_views),
|
2023-06-03 13:55:43 +08:00
|
|
|
created_at: timestamp(),
|
2023-11-08 21:48:17 +08:00
|
|
|
created_by: Some(uid),
|
|
|
|
last_edited_time: timestamp(),
|
|
|
|
last_edited_by: Some(uid),
|
2023-04-04 08:41:16 +08:00
|
|
|
};
|
|
|
|
|
2023-07-14 13:37:13 +08:00
|
|
|
FolderData {
|
2023-11-01 11:45:35 +08:00
|
|
|
workspace,
|
2023-07-14 13:37:13 +08:00
|
|
|
current_view: first_view.id,
|
|
|
|
views: FlattedViews::flatten_views(views),
|
2023-11-01 11:45:35 +08:00
|
|
|
favorites: Default::default(),
|
2023-11-08 21:48:17 +08:00
|
|
|
recent: Default::default(),
|
2023-12-26 02:03:42 +08:00
|
|
|
trash: Default::default(),
|
2024-03-21 11:02:03 +07:00
|
|
|
private: Default::default(),
|
2023-07-14 13:37:13 +08:00
|
|
|
}
|
2023-04-04 08:41:16 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-06-03 13:55:43 +08:00
|
|
|
impl From<&ParentChildViews> for ViewPB {
|
|
|
|
fn from(value: &ParentChildViews) -> Self {
|
|
|
|
view_pb_with_child_views(
|
2023-06-23 23:19:34 +08:00
|
|
|
Arc::new(value.parent_view.clone()),
|
2023-06-03 13:55:43 +08:00
|
|
|
value
|
|
|
|
.child_views
|
|
|
|
.iter()
|
2023-06-23 23:19:34 +08:00
|
|
|
.map(|v| Arc::new(v.parent_view.clone()))
|
2023-06-03 13:55:43 +08:00
|
|
|
.collect(),
|
|
|
|
)
|
2023-04-04 08:41:16 +08:00
|
|
|
}
|
|
|
|
}
|