dev: update deleteUser to use FS provider

The previous implementation of deleteUser was hard-coded to use the
PuterFSProvider file system type's storage implementation specifically,
even if a different filesystem type is mounted as root or for a
particular user.

This change was tested by creating a user, adding some fsentries, and
then deleting that user. The following classes of filesystem entry were
checked:
- [x] user created directory (with contents)
  - [x] directory fsentry was deleted
- [x] user created directory (empty)
  - [x] directory fsentry was deleted
- [x] immutable directory
  - [x] directory fsentry was deleted
- [x] user created file
  - [x] file fsentry was deleted
  - [x] file storage was deleted
- [x] user created file in trash
  - [x] file fsentry was deleted
  - [x] file storage was deleted
This commit is contained in:
KernelDeimos
2025-10-30 14:06:28 -04:00
committed by Eric Dubé
parent 896082ba62
commit 571cd91380
2 changed files with 10 additions and 15 deletions
+6 -11
View File
@@ -1151,17 +1151,12 @@ async function deleteUser(user_id){
// delete all files from S3
if(files !== null && files.length > 0){
for(let i=0; i<files.length; i++){
// init S3 SDK
const svc_fs = Context.get('services').get('filesystem');
const svc_mountpoint =
Context.get('services').get('mountpoint');
// NB: We use a hard-coded string to avoid circular dependency.
//
// TODO (xiaochen): what if the provider is not PuterFSProvider?
const storage = svc_mountpoint.get_storage('PuterFSProvider');
const op_delete = storage.create_delete();
await op_delete.run({
node: await svc_fs.node(new NodeUIDSelector(files[i].uuid))
const node = await svc_fs.node(new NodeUIDSelector(files[i].uuid));
await node.provider.unlink({
context: Context.get(),
override_immutable: true,
node,
});
}
}
@@ -409,13 +409,13 @@ class PuterFSProvider extends putility.AdvancedBase {
return node;
}
async unlink({ context, node }) {
async unlink({ context, node, options = {} }) {
if ( await node.get('type') === TYPE_DIRECTORY ) {
console.log(`\x1B[31;1m===N=====${await node.get('path')}=========\x1B[0m`);
throw new APIError(409, 'Cannot unlink a directory.');
}
await this.#rmnode({ context, node });
await this.#rmnode({ context, node, options });
}
async rmdir({ context, node, options = {} }) {
@@ -442,12 +442,12 @@ class PuterFSProvider extends putility.AdvancedBase {
await this.#rmnode({ context, node, options });
}
async #rmnode({ node, options: _options }) {
async #rmnode({ node, options }) {
// Services
const svc_size = this.#services.get('sizeService');
const svc_fsEntry = this.#services.get('fsEntryService');
if ( await node.get('immutable') ) {
if ( ! options.override_immutable && await node.get('immutable') ) {
throw new APIError(403, 'File is immutable.');
}