user_default.rs 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. use std::collections::HashMap;
  2. use chrono::Utc;
  3. use collab_folder::core::{FolderData, RepeatedView, View, ViewIdentifier, ViewLayout, Workspace};
  4. use nanoid::nanoid;
  5. use crate::entities::{view_pb_with_child_views, WorkspacePB};
  6. use crate::view_ext::{gen_view_id, FolderOperationHandlers};
  7. pub struct DefaultFolderBuilder();
  8. impl DefaultFolderBuilder {
  9. pub async fn build(
  10. uid: i64,
  11. workspace_id: String,
  12. handlers: &FolderOperationHandlers,
  13. ) -> (FolderData, WorkspacePB) {
  14. let time = Utc::now().timestamp();
  15. let view_id = gen_view_id();
  16. let child_view_id = gen_view_id();
  17. let child_view_layout = ViewLayout::Document;
  18. let child_view = View {
  19. id: child_view_id.clone(),
  20. bid: view_id.clone(),
  21. name: "Read me".to_string(),
  22. desc: "".to_string(),
  23. created_at: time,
  24. layout: child_view_layout.clone(),
  25. children: Default::default(),
  26. };
  27. // create the document
  28. // TODO: use the initial data from the view processor
  29. // let data = initial_read_me().into_bytes();
  30. let handler = handlers.get(&child_view_layout).unwrap();
  31. handler
  32. .create_built_in_view(
  33. uid,
  34. &child_view.id,
  35. &child_view.name,
  36. child_view_layout.clone(),
  37. HashMap::default(),
  38. )
  39. .await
  40. .unwrap();
  41. let view = View {
  42. id: view_id,
  43. bid: workspace_id.clone(),
  44. name: "⭐️ Getting started".to_string(),
  45. desc: "".to_string(),
  46. children: RepeatedView::new(vec![ViewIdentifier {
  47. id: child_view.id.clone(),
  48. }]),
  49. created_at: time,
  50. layout: ViewLayout::Document,
  51. };
  52. let workspace = Workspace {
  53. id: workspace_id,
  54. name: "Workspace".to_string(),
  55. child_views: RepeatedView::new(vec![ViewIdentifier {
  56. id: view.id.clone(),
  57. }]),
  58. created_at: time,
  59. };
  60. let workspace_pb = workspace_pb_from_workspace(&workspace, &view, &child_view);
  61. (
  62. FolderData {
  63. current_workspace: workspace.id.clone(),
  64. current_view: child_view_id,
  65. workspaces: vec![workspace],
  66. views: vec![view, child_view],
  67. },
  68. workspace_pb,
  69. )
  70. }
  71. }
  72. pub fn gen_workspace_id() -> String {
  73. nanoid!(10)
  74. }
  75. fn workspace_pb_from_workspace(
  76. workspace: &Workspace,
  77. view: &View,
  78. child_view: &View,
  79. ) -> WorkspacePB {
  80. let view_pb = view_pb_with_child_views(view.clone(), vec![child_view.clone()]);
  81. WorkspacePB {
  82. id: workspace.id.clone(),
  83. name: workspace.name.clone(),
  84. views: vec![view_pb],
  85. create_time: workspace.created_at,
  86. }
  87. }