fix: collab workspace issues (#4961)

This commit is contained in:
Lucas.Xu
2024-03-22 16:15:18 +07:00
committed by GitHub
parent 99ee60a60d
commit c0642d3ff3
37 changed files with 651 additions and 483 deletions

View File

@ -285,8 +285,7 @@ impl TryInto<CreateViewParams> for CreateOrphanViewPayloadPB {
meta: Default::default(),
set_as_current: false,
index: None,
// TODO: lucas.xu add section to CreateOrphanViewPayloadPB
section: Some(ViewSectionPB::Public),
section: None,
})
}
}

View File

@ -53,7 +53,7 @@ pub(crate) async fn get_workspace_views_handler(
) -> DataResult<RepeatedViewPB, FlowyError> {
let folder = upgrade_folder(folder)?;
let params: GetWorkspaceViewParams = data.into_inner().try_into()?;
let child_views = folder.get_workspace_views(&params.value).await?;
let child_views = folder.get_workspace_public_views(&params.value).await?;
let repeated_view: RepeatedViewPB = child_views.into();
data_result_ok(repeated_view)
}
@ -63,7 +63,7 @@ pub(crate) async fn get_current_workspace_views_handler(
folder: AFPluginState<Weak<FolderManager>>,
) -> DataResult<RepeatedViewPB, FlowyError> {
let folder = upgrade_folder(folder)?;
let child_views = folder.get_current_workspace_views().await?;
let child_views = folder.get_current_workspace_public_views().await?;
let repeated_view: RepeatedViewPB = child_views.into();
data_result_ok(repeated_view)
}
@ -286,7 +286,7 @@ pub(crate) async fn read_trash_handler(
folder: AFPluginState<Weak<FolderManager>>,
) -> DataResult<RepeatedTrashPB, FlowyError> {
let folder = upgrade_folder(folder)?;
let trash = folder.get_all_trash().await;
let trash = folder.get_my_trash_info().await;
data_result_ok(trash.into())
}
@ -323,11 +323,11 @@ pub(crate) async fn restore_all_trash_handler(
}
#[tracing::instrument(level = "debug", skip(folder), err)]
pub(crate) async fn delete_all_trash_handler(
pub(crate) async fn delete_my_trash_handler(
folder: AFPluginState<Weak<FolderManager>>,
) -> Result<(), FlowyError> {
let folder = upgrade_folder(folder)?;
folder.delete_all_trash().await;
folder.delete_my_trash().await;
Ok(())
}

View File

@ -29,7 +29,7 @@ pub fn init(folder: Weak<FolderManager>) -> AFPlugin {
.event(FolderEvent::RestoreTrashItem, putback_trash_handler)
.event(FolderEvent::PermanentlyDeleteTrashItem, delete_trash_handler)
.event(FolderEvent::RecoverAllTrashItems, restore_all_trash_handler)
.event(FolderEvent::PermanentlyDeleteAllTrashItem, delete_all_trash_handler)
.event(FolderEvent::PermanentlyDeleteAllTrashItem, delete_my_trash_handler)
.event(FolderEvent::ImportData, import_data_handler)
.event(FolderEvent::GetFolderSnapshots, get_folder_snapshots_handler)
.event(FolderEvent::UpdateViewIcon, update_view_icon_handler)

View File

@ -128,7 +128,7 @@ impl FolderManager {
/// Return a list of views of the current workspace.
/// Only the first level of child views are included.
pub async fn get_current_workspace_views(&self) -> FlowyResult<Vec<ViewPB>> {
pub async fn get_current_workspace_public_views(&self) -> FlowyResult<Vec<ViewPB>> {
let workspace_id = self
.mutex_folder
.lock()
@ -136,14 +136,14 @@ impl FolderManager {
.map(|folder| folder.get_workspace_id());
if let Some(workspace_id) = workspace_id {
self.get_workspace_views(&workspace_id).await
self.get_workspace_public_views(&workspace_id).await
} else {
tracing::warn!("Can't get current workspace views");
Ok(vec![])
}
}
pub async fn get_workspace_views(&self, workspace_id: &str) -> FlowyResult<Vec<ViewPB>> {
pub async fn get_workspace_public_views(&self, workspace_id: &str) -> FlowyResult<Vec<ViewPB>> {
let views = self.with_folder(Vec::new, |folder| {
get_workspace_public_view_pbs(workspace_id, folder)
});
@ -519,7 +519,7 @@ impl FolderManager {
let folder = self.mutex_folder.lock();
let folder = folder.as_ref().ok_or_else(folder_not_init_error)?;
let trash_ids = folder
.get_all_trash()
.get_all_trash_sections()
.into_iter()
.map(|trash| trash.id)
.collect::<Vec<String>>();
@ -559,7 +559,7 @@ impl FolderManager {
|folder| {
if let Some(view) = folder.views.get_view(view_id) {
self.unfavorite_view_and_decendants(view.clone(), folder);
folder.add_trash(vec![view_id.to_string()]);
folder.add_trash_view_ids(vec![view_id.to_string()]);
// notify the parent view that the view is moved to trash
send_notification(view_id, FolderNotification::DidMoveViewToTrash)
.payload(DeletedViewPB {
@ -590,7 +590,7 @@ impl FolderManager {
.collect();
if !favorite_descendant_views.is_empty() {
folder.delete_favorites(
folder.delete_favorite_view_ids(
favorite_descendant_views
.iter()
.map(|v| v.id.clone())
@ -754,6 +754,16 @@ impl FolderManager {
None
};
let is_private = self.with_folder(
|| false,
|folder| folder.is_view_in_section(Section::Private, &view.id),
);
let section = if is_private {
ViewSectionPB::Private
} else {
ViewSectionPB::Public
};
let duplicate_params = CreateViewParams {
parent_view_id: view.parent_view_id.clone(),
name: format!("{} (copy)", &view.name),
@ -764,8 +774,7 @@ impl FolderManager {
meta: Default::default(),
set_as_current: true,
index,
// TODO: lucas.xu fetch the section from the view
section: Some(ViewSectionPB::Public),
section: Some(section),
};
self.create_view_with_params(duplicate_params).await?;
@ -801,9 +810,9 @@ impl FolderManager {
|folder| {
if let Some(old_view) = folder.views.get_view(view_id) {
if old_view.is_favorite {
folder.delete_favorites(vec![view_id.to_string()]);
folder.delete_favorite_view_ids(vec![view_id.to_string()]);
} else {
folder.add_favorites(vec![view_id.to_string()]);
folder.add_favorite_view_ids(vec![view_id.to_string()]);
}
}
},
@ -878,8 +887,8 @@ impl FolderManager {
}
#[tracing::instrument(level = "trace", skip(self))]
pub(crate) async fn get_all_trash(&self) -> Vec<TrashInfo> {
self.with_folder(Vec::new, |folder| folder.get_all_trash())
pub(crate) async fn get_my_trash_info(&self) -> Vec<TrashInfo> {
self.with_folder(Vec::new, |folder| folder.get_my_trash_info())
}
#[tracing::instrument(level = "trace", skip(self))]
@ -887,7 +896,7 @@ impl FolderManager {
self.with_folder(
|| (),
|folder| {
folder.remote_all_trash();
folder.remove_all_my_trash_sections();
},
);
send_notification("trash", FolderNotification::DidUpdateTrash)
@ -900,15 +909,15 @@ impl FolderManager {
self.with_folder(
|| (),
|folder| {
folder.delete_trash(vec![trash_id.to_string()]);
folder.delete_trash_view_ids(vec![trash_id.to_string()]);
},
);
}
/// Delete all the trash permanently.
#[tracing::instrument(level = "trace", skip(self))]
pub(crate) async fn delete_all_trash(&self) {
let deleted_trash = self.with_folder(Vec::new, |folder| folder.get_all_trash());
pub(crate) async fn delete_my_trash(&self) {
let deleted_trash = self.with_folder(Vec::new, |folder| folder.get_my_trash_info());
for trash in deleted_trash {
let _ = self.delete_trash(&trash.id).await;
}
@ -926,7 +935,7 @@ impl FolderManager {
self.with_folder(
|| (),
|folder| {
folder.delete_trash(vec![view_id.to_string()]);
folder.delete_trash_view_ids(vec![view_id.to_string()]);
folder.views.delete_views(vec![view_id]);
},
);
@ -977,8 +986,7 @@ impl FolderManager {
meta: Default::default(),
set_as_current: false,
index: None,
// TODO: Lucas.xu fetch the section from the view
section: Some(ViewSectionPB::Public),
section: None,
};
let view = create_view(self.user.user_id()?, params, import_data.view_layout);
@ -1117,14 +1125,14 @@ impl FolderManager {
fn get_sections(&self, section_type: Section) -> Vec<SectionItem> {
self.with_folder(Vec::new, |folder| {
let trash_ids = folder
.get_all_trash()
.get_all_trash_sections()
.into_iter()
.map(|trash| trash.id)
.collect::<Vec<String>>();
let mut views = match section_type {
Section::Favorite => folder.get_all_favorites(),
Section::Recent => folder.get_all_recent_sections(),
Section::Favorite => folder.get_my_favorite_sections(),
Section::Recent => folder.get_my_recent_sections(),
_ => vec![],
};
@ -1139,14 +1147,14 @@ impl FolderManager {
pub(crate) fn get_workspace_public_view_pbs(_workspace_id: &str, folder: &Folder) -> Vec<ViewPB> {
// get the trash ids
let trash_ids = folder
.get_all_trash()
.get_all_trash_sections()
.into_iter()
.map(|trash| trash.id)
.collect::<Vec<String>>();
// get the private view ids
let private_view_ids = folder
.get_all_private_views()
.get_all_private_sections()
.into_iter()
.map(|view| view.id)
.collect::<Vec<String>>();
@ -1174,14 +1182,14 @@ pub(crate) fn get_workspace_public_view_pbs(_workspace_id: &str, folder: &Folder
pub(crate) fn get_workspace_private_view_pbs(_workspace_id: &str, folder: &Folder) -> Vec<ViewPB> {
// get the trash ids
let trash_ids = folder
.get_all_trash()
.get_all_trash_sections()
.into_iter()
.map(|trash| trash.id)
.collect::<Vec<String>>();
// get the private view ids
let private_view_ids = folder
.get_my_private_views()
.get_my_private_sections()
.into_iter()
.map(|view| view.id)
.collect::<Vec<String>>();

View File

@ -125,7 +125,7 @@ pub(crate) fn subscribe_folder_trash_changed(
unique_ids.insert(view.parent_view_id.clone());
}
let repeated_trash: RepeatedTrashPB = folder.get_all_trash().into();
let repeated_trash: RepeatedTrashPB = folder.get_my_trash_info().into();
send_notification("trash", FolderNotification::DidUpdateTrash)
.payload(repeated_trash)
.send();
@ -150,7 +150,7 @@ pub(crate) fn notify_parent_view_did_change<T: AsRef<str>>(
let folder = folder.as_ref()?;
let workspace_id = folder.get_workspace_id();
let trash_ids = folder
.get_all_trash()
.get_all_trash_sections()
.into_iter()
.map(|trash| trash.id)
.collect::<Vec<String>>();