fix: filter non space document from workspace's children
This commit is contained in:
parent
ee87bb9bd6
commit
0bcf1457bb
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue