Skip to content

Commit cfeed3a

Browse files
committed
chore: improve 'delete_folder' API
1 parent 3cf65e4 commit cfeed3a

File tree

4 files changed

+53
-22
lines changed

4 files changed

+53
-22
lines changed

Cargo.lock

Lines changed: 6 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ strip = true
1717
opt-level = 's'
1818

1919
[workspace.package]
20-
version = "0.9.7"
20+
version = "0.9.8"
2121
edition = "2021"
2222
repository = "https://github.com/ldclabs/ic-oss"
2323
keywords = ["file", "storage", "oss", "s3", "icp"]

src/ic_oss_bucket/src/api_update.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -379,7 +379,7 @@ fn delete_folder(id: u32, access_token: Option<ByteBuf>) -> Result<bool, String>
379379
};
380380

381381
store::fs::delete_folder(id, now_ms, |folder| {
382-
match permission::check_file_delete(&ctx.ps, &canister, folder.parent) {
382+
match permission::check_folder_delete(&ctx.ps, &canister, folder.parent) {
383383
true => Ok(()),
384384
false => Err("permission denied".to_string()),
385385
}

src/ic_oss_bucket/src/store.rs

Lines changed: 45 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -722,20 +722,14 @@ impl FoldersTree {
722722
});
723723
}
724724

725-
fn delete_folder(
726-
&mut self,
727-
id: u32,
728-
now_ms: u64,
729-
checker: impl FnOnce(&FolderMetadata) -> Result<(), String>,
730-
) -> Result<bool, String> {
725+
fn delete_folder(&mut self, id: u32, now_ms: u64) -> Result<bool, String> {
731726
if id == 0 {
732727
Err("root folder cannot be deleted".to_string())?;
733728
}
734729

735730
let parent_id = match self.get(&id) {
736731
None => return Ok(false),
737732
Some(folder) => {
738-
checker(folder)?;
739733
if folder.status > 0 {
740734
Err("folder is readonly".to_string())?;
741735
}
@@ -1349,7 +1343,44 @@ pub mod fs {
13491343
now_ms: u64,
13501344
checker: impl FnOnce(&FolderMetadata) -> Result<(), String>,
13511345
) -> Result<bool, String> {
1352-
FOLDERS.with(|r| r.borrow_mut().delete_folder(id, now_ms, checker))
1346+
if id == 0 {
1347+
Err("root folder cannot be deleted".to_string())?;
1348+
}
1349+
1350+
FOLDERS.with(|r| {
1351+
let mut folders = r.borrow_mut();
1352+
let folder = folders.parent_to_update(id)?;
1353+
let files = folder.files.clone();
1354+
checker(&folder)?;
1355+
1356+
FS_METADATA_STORE.with(|r| {
1357+
let mut fs_metadata = r.borrow_mut();
1358+
1359+
FS_CHUNKS_STORE.with(|r| {
1360+
let mut fs_data = r.borrow_mut();
1361+
for id in files {
1362+
match fs_metadata.get(&id) {
1363+
Some(file) => {
1364+
if file.status < 1 && fs_metadata.remove(&id).is_some() {
1365+
folder.files.remove(&id);
1366+
if let Some(hash) = file.hash {
1367+
HASHS.with(|r| r.borrow_mut().remove(&hash));
1368+
}
1369+
1370+
for i in 0..file.chunks {
1371+
fs_data.remove(&FileId(id, i));
1372+
}
1373+
}
1374+
}
1375+
None => {
1376+
folder.files.remove(&id);
1377+
}
1378+
}
1379+
}
1380+
});
1381+
});
1382+
folders.delete_folder(id, now_ms)
1383+
})
13531384
}
13541385

13551386
pub fn delete_file(
@@ -2139,11 +2170,11 @@ mod test {
21392170
fn test_folders_delete_folder() {
21402171
let mut tree = FoldersTree::new();
21412172
assert!(tree
2142-
.delete_folder(0, 99, |_| Ok(()))
2173+
.delete_folder(0, 99)
21432174
.err()
21442175
.unwrap()
21452176
.contains("root folder cannot be deleted"));
2146-
assert!(!tree.delete_folder(1, 99, |_| Ok(())).unwrap());
2177+
assert!(!tree.delete_folder(1, 99).unwrap());
21472178
tree.add_folder(
21482179
FolderMetadata {
21492180
parent: 0,
@@ -2158,25 +2189,25 @@ mod test {
21582189
)
21592190
.unwrap();
21602191
assert!(tree
2161-
.delete_folder(1, 99, |_| Ok(()))
2192+
.delete_folder(1, 99)
21622193
.err()
21632194
.unwrap()
21642195
.contains("folder is readonly"));
21652196
tree.get_mut(&1).unwrap().status = 0;
21662197
assert!(tree
2167-
.delete_folder(1, 99, |_| Ok(()))
2198+
.delete_folder(1, 99)
21682199
.err()
21692200
.unwrap()
21702201
.contains("folder is not empty"));
21712202
tree.get_mut(&1).unwrap().files.clear();
21722203
tree.get_mut(&0).unwrap().status = 1;
21732204
assert!(tree
2174-
.delete_folder(1, 99, |_| Ok(()))
2205+
.delete_folder(1, 99)
21752206
.err()
21762207
.unwrap()
21772208
.contains("parent folder is not writable"));
21782209
tree.get_mut(&0).unwrap().status = 0;
2179-
assert!(tree.delete_folder(1, 99, |_| Ok(())).unwrap());
2210+
assert!(tree.delete_folder(1, 99).unwrap());
21802211
assert_eq!(tree.len(), 1);
21812212
assert_eq!(tree.get_mut(&0).unwrap().folders, BTreeSet::new());
21822213
assert_eq!(tree.get_mut(&0).unwrap().updated_at, 99);

0 commit comments

Comments
 (0)