user_default.rs 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. use std::sync::Arc;
  2. use collab_folder::core::{FolderData, RepeatedViewIdentifier, ViewIdentifier, Workspace};
  3. use tokio::sync::RwLock;
  4. use lib_infra::util::timestamp;
  5. use crate::entities::{view_pb_with_child_views, ViewPB};
  6. use crate::view_operation::{
  7. FlattedViews, FolderOperationHandlers, ParentChildViews, WorkspaceViewBuilder,
  8. };
  9. pub struct DefaultFolderBuilder();
  10. impl DefaultFolderBuilder {
  11. pub async fn build(
  12. uid: i64,
  13. workspace_id: String,
  14. handlers: &FolderOperationHandlers,
  15. ) -> FolderData {
  16. let workspace_view_builder =
  17. Arc::new(RwLock::new(WorkspaceViewBuilder::new(workspace_id.clone())));
  18. for handler in handlers.values() {
  19. let _ = handler
  20. .create_workspace_view(uid, workspace_view_builder.clone())
  21. .await;
  22. }
  23. let views = workspace_view_builder.write().await.build();
  24. // Safe to unwrap because we have at least one view. check out the DocumentFolderOperation.
  25. let first_view = views.first().unwrap().parent_view.clone();
  26. let first_level_views = views
  27. .iter()
  28. .map(|value| ViewIdentifier {
  29. id: value.parent_view.id.clone(),
  30. })
  31. .collect::<Vec<_>>();
  32. let workspace = Workspace {
  33. id: workspace_id,
  34. name: "Workspace".to_string(),
  35. child_views: RepeatedViewIdentifier::new(first_level_views),
  36. created_at: timestamp(),
  37. };
  38. FolderData {
  39. current_workspace_id: workspace.id.clone(),
  40. current_view: first_view.id,
  41. workspaces: vec![workspace],
  42. views: FlattedViews::flatten_views(views),
  43. }
  44. }
  45. }
  46. impl From<&ParentChildViews> for ViewPB {
  47. fn from(value: &ParentChildViews) -> Self {
  48. view_pb_with_child_views(
  49. Arc::new(value.parent_view.clone()),
  50. value
  51. .child_views
  52. .iter()
  53. .map(|v| Arc::new(v.parent_view.clone()))
  54. .collect(),
  55. )
  56. }
  57. }