mirror of
https://github.com/HeyPuter/puter.git
synced 2026-08-24 06:58:21 +00:00
dev: ll_rmdir,ll_rmnode -> provider.(rmdir,unlink)
This commit is contained in:
@@ -98,17 +98,10 @@ class LLRmDir extends LLFilesystemOperation {
|
||||
});
|
||||
}
|
||||
|
||||
if ( ! descendants_only ) {
|
||||
tasks.add(`fs:rm:rm-self`, async () => {
|
||||
const ll_rm = new LLRmNode();
|
||||
await ll_rm.run({
|
||||
target,
|
||||
user,
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
await tasks.awaitAll();
|
||||
if ( ! descendants_only ) {
|
||||
await target.provider.rmdir({ context, node: target });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -40,37 +40,7 @@ class LLRmNode extends LLFilesystemOperation {
|
||||
}
|
||||
}
|
||||
|
||||
if ( await target.get('immutable') ) {
|
||||
throw new APIError(403, 'File is immutable.');
|
||||
}
|
||||
|
||||
const svc_size = svc.get('sizeService');
|
||||
const svc_fsEntry = svc.get('fsEntryService');
|
||||
|
||||
svc_size.change_usage(
|
||||
await target.get('user_id'),
|
||||
-1 * await target.get('size')
|
||||
);
|
||||
|
||||
const tracer = svc.get('traceService').tracer;
|
||||
const tasks = new ParallelTasks({ tracer, max: 4 });
|
||||
|
||||
tasks.add(`remove-fsentry`, async () => {
|
||||
await svc_fsEntry.delete(await target.get('uid'));
|
||||
});
|
||||
|
||||
if ( await target.get('has-s3') ) {
|
||||
tasks.add(`remove-from-s3`, async () => {
|
||||
// const storage = new PuterS3StorageStrategy({ services: svc });
|
||||
const storage = Context.get('storage');
|
||||
const state_delete = storage.create_delete();
|
||||
await state_delete.run({
|
||||
node: target,
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
await tasks.awaitAll();
|
||||
await target.provider.unlink({ context, node: target });
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -29,6 +29,9 @@ const FSNodeContext = require('../../../filesystem/FSNodeContext');
|
||||
const { RESOURCE_STATUS_PENDING_CREATE } = require('../ResourceService');
|
||||
const { ParallelTasks } = require('../../../util/otelutil');
|
||||
|
||||
const { TYPE_DIRECTORY } = require('../../../filesystem/FSNodeContext');
|
||||
const APIError = require('../../../api/APIError');
|
||||
|
||||
class PuterFSProvider extends putility.AdvancedBase {
|
||||
static MODULES = {
|
||||
_path: require('path'),
|
||||
@@ -354,6 +357,78 @@ class PuterFSProvider extends putility.AdvancedBase {
|
||||
// TODO: What event do we emit? How do we know if we're overwriting?
|
||||
return node;
|
||||
}
|
||||
|
||||
async unlink ({ context, node }) {
|
||||
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 });
|
||||
}
|
||||
|
||||
async rmdir ({ context, node }) {
|
||||
if ( await node.get('type') !== TYPE_DIRECTORY ) {
|
||||
console.log(`\x1B[31;1m===D1====${await node.get('path')}=========\x1B[0m`)
|
||||
throw new APIError(409, 'Cannot rmdir a file.');
|
||||
}
|
||||
|
||||
if ( await node.get('immutable') ) {
|
||||
console.log(`\x1B[31;1m===D2====${await node.get('path')}=========\x1B[0m`)
|
||||
throw APIError.create('immutable');
|
||||
}
|
||||
|
||||
// Services
|
||||
const services = context.get('services');
|
||||
const svc_fsEntry = services.get('fsEntryService');
|
||||
|
||||
const children = await svc_fsEntry.fast_get_direct_descendants(
|
||||
await node.get('uid')
|
||||
);
|
||||
|
||||
if ( children.length > 0 ) {
|
||||
console.log(`\x1B[31;1m===D3====${await node.get('path')}=========\x1B[0m`)
|
||||
throw APIError.create('not_empty');
|
||||
}
|
||||
|
||||
await this.rmnode_({ context, node });
|
||||
}
|
||||
|
||||
async rmnode_ ({ context, node }) {
|
||||
// Services
|
||||
const services = context.get('services');
|
||||
const svc_size = services.get('sizeService');
|
||||
const svc_fsEntry = services.get('fsEntryService');
|
||||
|
||||
if ( await node.get('immutable') ) {
|
||||
throw new APIError(403, 'File is immutable.');
|
||||
}
|
||||
|
||||
svc_size.change_usage(
|
||||
await node.get('user_id'),
|
||||
-1 * await node.get('size')
|
||||
);
|
||||
|
||||
const tracer = services.get('traceService').tracer;
|
||||
const tasks = new ParallelTasks({ tracer, max: 4 });
|
||||
|
||||
tasks.add(`remove-fsentry`, async () => {
|
||||
await svc_fsEntry.delete(await node.get('uid'));
|
||||
});
|
||||
|
||||
if ( await node.get('has-s3') ) {
|
||||
tasks.add(`remove-from-s3`, async () => {
|
||||
// const storage = new PuterS3StorageStrategy({ services: svc });
|
||||
const storage = Context.get('storage');
|
||||
const state_delete = storage.create_delete();
|
||||
await state_delete.run({
|
||||
node: node,
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
await tasks.awaitAll();
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
|
||||
Reference in New Issue
Block a user