From 4e25f7ddf1a1f2c55f2ad993103f8d63df6a81f0 Mon Sep 17 00:00:00 2001 From: mdecimus <11444311+mdecimus@users.noreply.github.com> Date: Fri, 12 Dec 2025 16:12:04 +0100 Subject: [PATCH] FileNode/set fails to delete files (fixes #2485) --- crates/common/src/lib.rs | 13 +++++++++++++ crates/jmap/src/file/set.rs | 6 ++++-- tests/src/jmap/files/node.rs | 13 ++++++++++++- 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/crates/common/src/lib.rs b/crates/common/src/lib.rs index 4fdea626..d81acd03 100644 --- a/crates/common/src/lib.rs +++ b/crates/common/src/lib.rs @@ -594,6 +594,19 @@ impl DavResources { }) } + pub fn any_resource_path_by_id(&self, id: u32) -> Option> { + self.resources + .iter() + .enumerate() + .find(|(_, resource)| resource.document_id == id) + .and_then(|(idx, resource)| { + self.paths + .iter() + .find(|path| path.resource_idx == idx) + .map(|path| DavResourcePath { path, resource }) + }) + } + pub fn subtree(&self, search_path: &str) -> impl Iterator> { let prefix = format!("{search_path}/"); self.paths.iter().filter_map(move |path| { diff --git a/crates/jmap/src/file/set.rs b/crates/jmap/src/file/set.rs index fde7c741..968d8d49 100644 --- a/crates/jmap/src/file/set.rs +++ b/crates/jmap/src/file/set.rs @@ -21,7 +21,9 @@ use jmap_proto::{ }; use jmap_tools::{JsonPointerItem, Key, Value}; use store::{ - ValueKey, ahash::{AHashMap, AHashSet}, write::{AlignedBytes, Archive, BatchBuilder} + ValueKey, + ahash::{AHashMap, AHashSet}, + write::{AlignedBytes, Archive, BatchBuilder}, }; use trc::AddContext; use types::{ @@ -307,7 +309,7 @@ impl FileNodeSet for Server { 'destroy: for id in will_destroy { let document_id = id.document_id(); - let Some(file_node) = cache.container_resource_path_by_id(document_id) else { + let Some(file_node) = cache.any_resource_path_by_id(document_id) else { response.not_destroyed.append(id, SetError::not_found()); continue 'destroy; }; diff --git a/tests/src/jmap/files/node.rs b/tests/src/jmap/files/node.rs index e3807b3a..ec0bb8d0 100644 --- a/tests/src/jmap/files/node.rs +++ b/tests/src/jmap/files/node.rs @@ -297,6 +297,18 @@ pub async fn test(params: &mut JMAPTest) { ); // Delete file and sub folders + assert_eq!( + account + .jmap_destroy( + MethodObject::FileNode, + [&file_id], + [("onDestroyRemoveChildren", true)], + ) + .await + .destroyed() + .collect::>(), + [file_id.as_str(),].into_iter().collect::>() + ); assert_eq!( account .jmap_destroy( @@ -308,7 +320,6 @@ pub async fn test(params: &mut JMAPTest) { .destroyed() .collect::>(), [ - file_id.as_str(), sub_sub_folder_id.as_str(), sub_folder_id.as_str(), root_folder_id.as_str()