From 0bcf1457bb3240207f96834858b7cf22c43454b7 Mon Sep 17 00:00:00 2001 From: khorshuheng Date: Fri, 6 Dec 2024 13:01:45 +0800 Subject: [PATCH] fix: filter non space document from workspace's children --- src/biz/collab/folder_view.rs | 23 ++++++++--- src/biz/collab/ops.rs | 8 +++- src/biz/workspace/page_view.rs | 4 +- tests/workspace/publish.rs | 74 +++++++++++++++++++++++----------- 4 files changed, 78 insertions(+), 31 deletions(-) diff --git a/src/biz/collab/folder_view.rs b/src/biz/collab/folder_view.rs index 46b77b8b..86c425b0 100644 --- a/src/biz/collab/folder_view.rs +++ b/src/biz/collab/folder_view.rs @@ -9,9 +9,11 @@ use shared_entity::dto::workspace_dto::{ self, FavoriteFolderView, FolderView, FolderViewMinimal, RecentFolderView, TrashFolderView, ViewLayout, }; +use uuid::Uuid; /// Return all folders belonging to a workspace, excluding private sections which the user does not have access to. pub fn collab_folder_to_folder_view( + workspace_id: Uuid, root_view_id: &str, folder: &Folder, max_depth: u32, @@ -24,7 +26,8 @@ pub fn collab_folder_to_folder_view( } for private_section in folder.get_all_private_sections() { if let Some(private_view) = folder.get_view(&private_section.id) { - if view_is_space(&private_view) && !my_private_view_ids.contains(&private_section.id) { + if check_if_view_is_space(&private_view) && !my_private_view_ids.contains(&private_section.id) + { unviewable.insert(private_section.id); } } @@ -34,6 +37,7 @@ pub fn collab_folder_to_folder_view( } to_folder_view( + workspace_id, "", root_view_id, folder, @@ -52,6 +56,7 @@ pub fn collab_folder_to_folder_view( #[allow(clippy::too_many_arguments)] fn to_folder_view( + workspace_id: Uuid, parent_view_id: &str, view_id: &str, folder: &Folder, @@ -78,8 +83,15 @@ fn to_folder_view( return None; } - let is_private = - parent_is_private || (view_is_space(&view) && private_view_ids.contains(view_id)); + let view_is_space = check_if_view_is_space(&view); + // There is currently a bug, which a document that is not a space ended up as child + // of the workspace + let parent_is_workspace = workspace_id.to_string() == parent_view_id; + if !view_is_space && parent_is_workspace { + return None; + } + + let is_private = parent_is_private || (view_is_space && private_view_ids.contains(view_id)); let extra = view.extra.as_deref().map(|extra| { serde_json::from_str::(extra).unwrap_or_else(|e| { tracing::warn!("failed to parse extra field({}): {}", extra, e); @@ -91,6 +103,7 @@ fn to_folder_view( .iter() .filter_map(|child_view_id| { to_folder_view( + workspace_id, view_id, &child_view_id.id, folder, @@ -110,7 +123,7 @@ fn to_folder_view( .icon .as_ref() .map(|icon| to_dto_view_icon(icon.clone())), - is_space: view_is_space(&view), + is_space: view_is_space, is_private, is_published: published_view_ids.contains(view_id), layout: to_dto_view_layout(&view.layout), @@ -216,7 +229,7 @@ pub fn section_items_to_trash_folder_view( .collect() } -pub fn view_is_space(view: &collab_folder::View) -> bool { +pub fn check_if_view_is_space(view: &collab_folder::View) -> bool { let extra = match view.extra.as_ref() { Some(extra) => extra, None => return false, diff --git a/src/biz/collab/ops.rs b/src/biz/collab/ops.rs index 34e0be4c..b2780566 100644 --- a/src/biz/collab/ops.rs +++ b/src/biz/collab/ops.rs @@ -295,7 +295,13 @@ pub async fn get_user_workspace_structure( .into_iter() .map(|id| id.to_string()) .collect(); - collab_folder_to_folder_view(root_view_id, &folder, depth, &publish_view_ids) + collab_folder_to_folder_view( + workspace_id, + root_view_id, + &folder, + depth, + &publish_view_ids, + ) } pub async fn get_latest_workspace_database( diff --git a/src/biz/workspace/page_view.rs b/src/biz/workspace/page_view.rs index 46bb6b4b..31495b98 100644 --- a/src/biz/workspace/page_view.rs +++ b/src/biz/workspace/page_view.rs @@ -48,7 +48,7 @@ use crate::biz::collab::folder_view::{ }; use crate::biz::collab::ops::{collab_from_doc_state, get_latest_workspace_database}; use crate::biz::collab::{ - folder_view::view_is_space, + folder_view::check_if_view_is_space, ops::{get_latest_collab_encoded, get_latest_collab_folder}, }; @@ -1054,7 +1054,7 @@ pub async fn get_page_view_collab( .icon .as_ref() .map(|icon| to_dto_view_icon(icon.clone())), - is_space: view_is_space(&view), + is_space: check_if_view_is_space(&view), is_private: false, is_published: publish_view_ids.contains(view_id), layout: to_dto_view_layout(&view.layout), diff --git a/tests/workspace/publish.rs b/tests/workspace/publish.rs index a48a3c48..56957b95 100644 --- a/tests/workspace/publish.rs +++ b/tests/workspace/publish.rs @@ -23,6 +23,7 @@ use std::collections::{HashMap, HashSet}; use std::sync::Arc; use std::thread::sleep; use std::time::Duration; +use uuid::Uuid; use crate::workspace::published_data::{self}; @@ -973,7 +974,7 @@ async fn duplicate_to_workspace_references() { .duplicate_published_to_workspace( &workspace_id_2, &doc_2_view_id.to_string(), - &fv.view_id, // use the root view + &fv.children[0].view_id, // use the first space found in the workspace ) .await; @@ -983,7 +984,12 @@ async fn duplicate_to_workspace_references() { .await .unwrap(); - let doc_2_fv = fv.children.into_iter().find(|v| v.name == "doc2").unwrap(); + let doc_2_fv = fv.children[0] + .children + .iter() + .find(|v| v.name == "doc2") + .unwrap() + .clone(); assert_ne!(doc_2_fv.view_id, doc_1_view_id.to_string()); let doc_1_fv = doc_2_fv @@ -1036,6 +1042,7 @@ async fn duplicate_to_workspace_doc_inline_database() { { let mut client_2 = TestClient::new_user().await; let workspace_id_2 = client_2.workspace_id().await; + let workspace_uuid_2 = Uuid::parse_str(&workspace_id_2).unwrap(); // Open workspace to trigger group creation client_2 @@ -1059,7 +1066,7 @@ async fn duplicate_to_workspace_doc_inline_database() { .duplicate_published_to_workspace( &workspace_id_2, &doc_3_view_id.to_string(), - &fv.view_id, // use the root view + &fv.children[0].view_id, // use the first space found in the workspace ) .await; @@ -1069,7 +1076,12 @@ async fn duplicate_to_workspace_doc_inline_database() { .get_workspace_folder(&workspace_id_2, Some(5), None) .await .unwrap(); - let doc_3_fv = fv.children.into_iter().find(|v| v.name == "doc3").unwrap(); + let doc_3_fv = fv.children[0] + .children + .iter() + .find(|v| v.name == "doc3") + .unwrap() + .clone(); let grid1_fv = doc_3_fv .children .into_iter() @@ -1100,13 +1112,20 @@ async fn duplicate_to_workspace_doc_inline_database() { ) .unwrap(); - let folder_view = - collab_folder_to_folder_view(&workspace_id_2, &folder, 5, &HashSet::default()).unwrap(); - let doc_3_fv = folder_view + let folder_view = collab_folder_to_folder_view( + workspace_uuid_2, + &workspace_id_2, + &folder, + 5, + &HashSet::default(), + ) + .unwrap(); + let doc_3_fv = folder_view.children[0] .children - .into_iter() + .iter() .find(|v| v.name == "doc3") - .unwrap(); + .unwrap() + .clone(); assert_ne!(doc_3_fv.view_id, doc_3_view_id.to_string()); let grid1_fv = doc_3_fv @@ -1217,7 +1236,7 @@ async fn duplicate_to_workspace_db_embedded_in_doc() { .duplicate_published_to_workspace( &workspace_id_2, &doc_with_embedded_db_view_id.to_string(), - &fv.view_id, // use the root view + &fv.children[0].view_id, // use the first space found in the workspace ) .await; @@ -1227,11 +1246,12 @@ async fn duplicate_to_workspace_db_embedded_in_doc() { .get_workspace_folder(&workspace_id_2, Some(5), None) .await .unwrap(); - let doc_with_embedded_db = fv + let doc_with_embedded_db = fv.children[0] .children - .into_iter() + .iter() .find(|v| v.name == "docwithembeddeddb") - .unwrap(); + .unwrap() + .clone(); let doc_collab = client_2 .get_collab_to_collab( workspace_id_2.clone(), @@ -1318,7 +1338,7 @@ async fn duplicate_to_workspace_db_with_relation() { .duplicate_published_to_workspace( &workspace_id_2, &db_with_rel_col_view_id.to_string(), - &fv.view_id, // use the root view + &fv.children[0].view_id, // use the first space found in the workspace ) .await; @@ -1329,12 +1349,12 @@ async fn duplicate_to_workspace_db_with_relation() { .await .unwrap(); let db_with_rel_col = fv - .children + .children[0].children .iter() .find(|v| v.name == "grid3") // db_with_rel_col .unwrap(); let related_db = fv - .children + .children[0].children .iter() .find(|v| v.name == "grid2") // related-db .unwrap(); @@ -1408,7 +1428,7 @@ async fn duplicate_to_workspace_db_row_with_doc() { .duplicate_published_to_workspace( &workspace_id_2, &db_with_row_doc_view_id.to_string(), - &fv.view_id, // use the root view + &fv.children[0].view_id, // use the first space found in the workspace ) .await; @@ -1419,7 +1439,7 @@ async fn duplicate_to_workspace_db_row_with_doc() { .await .unwrap(); let db_with_row_doc = fv - .children + .children[0].children .iter() .find(|v| v.name == "db_with_row_doc") // db_w ith_rel_col .unwrap(); @@ -1492,7 +1512,7 @@ async fn duplicate_to_workspace_db_rel_self() { .duplicate_published_to_workspace( &workspace_id_2, &db_rel_self_view_id.to_string(), - &fv.view_id, // use the root view + &fv.children[0].view_id, // use the first space found in the workspace ) .await; @@ -1503,7 +1523,7 @@ async fn duplicate_to_workspace_db_rel_self() { .unwrap(); println!("{:#?}", fv); - let db_rel_self = fv + let db_rel_self = fv.children[0] .children .iter() .find(|v| v.name == "self_ref_db") @@ -1588,7 +1608,7 @@ async fn duplicate_to_workspace_inline_db_doc_with_relation() { .duplicate_published_to_workspace( &workspace_id_2, &doc_4_view_id.to_string(), - &fv.view_id, // use the root view + &fv.children[0].view_id, // use the first space found in the workspace ) .await; @@ -1598,13 +1618,21 @@ async fn duplicate_to_workspace_inline_db_doc_with_relation() { .await .unwrap(); - let doc_4_fv = fv.children.iter().find(|v| v.name == "doc4").unwrap(); + let doc_4_fv = fv.children[0] + .children + .iter() + .find(|v| v.name == "doc4") + .unwrap(); let _ = doc_4_fv .children .iter() .find(|v| v.name == "grid3") .unwrap(); - let _ = fv.children.iter().find(|v| v.name == "grid2").unwrap(); + let _ = fv.children[0] + .children + .iter() + .find(|v| v.name == "grid2") + .unwrap(); } }