Merge pull request #1048 from AppFlowy-IO/filter-non-space

fix: filter non space document from workspace's children
This commit is contained in:
Khor Shu Heng 2024-12-06 15:26:29 +08:00 committed by GitHub
commit c9e984aa25
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 78 additions and 31 deletions

View File

@ -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::<serde_json::Value>(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,

View File

@ -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(

View File

@ -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),

View File

@ -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();
}
}