fix(core): update
This commit is contained in:
@@ -1,7 +1,8 @@
|
||||
// classes.directory.ts
|
||||
|
||||
import * as plugins from './plugins.js';
|
||||
import { Bucket } from './classes.bucket.js';
|
||||
import { File } from './classes.file.js';
|
||||
|
||||
import * as helpers from './helpers.js';
|
||||
|
||||
export class Directory {
|
||||
@@ -13,9 +14,9 @@ export class Directory {
|
||||
public files: string[];
|
||||
public folders: string[];
|
||||
|
||||
constructor(bucketRefArg: Bucket, parentDiretory: Directory, name: string) {
|
||||
constructor(bucketRefArg: Bucket, parentDirectory: Directory, name: string) {
|
||||
this.bucketRef = bucketRefArg;
|
||||
this.parentDirectoryRef = parentDiretory;
|
||||
this.parentDirectoryRef = parentDirectory;
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
@@ -73,15 +74,12 @@ export class Directory {
|
||||
directory: this,
|
||||
path: optionsArg.name,
|
||||
};
|
||||
// check wether the file exists
|
||||
const exists = await this.bucketRef.fastExists({
|
||||
path: await helpers.reducePathDescriptorToPath(pathDescriptor),
|
||||
});
|
||||
if (!exists && optionsArg.getFromTrash) {
|
||||
const trash = await this.bucketRef.getTrash();
|
||||
const trashedFile = await trash.getTrashedFileByOriginalName(
|
||||
pathDescriptor
|
||||
)
|
||||
const trashedFile = await trash.getTrashedFileByOriginalName(pathDescriptor);
|
||||
return trashedFile;
|
||||
}
|
||||
if (!exists && !optionsArg.createWithContents) {
|
||||
@@ -104,26 +102,17 @@ export class Directory {
|
||||
* lists all files
|
||||
*/
|
||||
public async listFiles(): Promise<File[]> {
|
||||
const done = plugins.smartpromise.defer();
|
||||
const fileNameStream = await this.bucketRef.smartbucketRef.minioClient.listObjectsV2(
|
||||
this.bucketRef.name,
|
||||
this.getBasePath(),
|
||||
false
|
||||
);
|
||||
const command = new plugins.s3.ListObjectsV2Command({
|
||||
Bucket: this.bucketRef.name,
|
||||
Prefix: this.getBasePath(),
|
||||
Delimiter: '/',
|
||||
});
|
||||
const response = await this.bucketRef.smartbucketRef.s3Client.send(command);
|
||||
const fileArray: File[] = [];
|
||||
const duplexStream = new plugins.smartstream.SmartDuplex<plugins.minio.BucketItem, void>({
|
||||
objectMode: true,
|
||||
writeFunction: async (bucketItem) => {
|
||||
if (bucketItem.prefix) {
|
||||
return;
|
||||
}
|
||||
if (!bucketItem.name) {
|
||||
return;
|
||||
}
|
||||
let subtractedPath = bucketItem.name.replace(this.getBasePath(), '');
|
||||
if (subtractedPath.startsWith('/')) {
|
||||
subtractedPath = subtractedPath.substr(1);
|
||||
}
|
||||
|
||||
response.Contents.forEach((item) => {
|
||||
if (item.Key && !item.Key.endsWith('/')) {
|
||||
const subtractedPath = item.Key.replace(this.getBasePath(), '');
|
||||
if (!subtractedPath.includes('/')) {
|
||||
fileArray.push(
|
||||
new File({
|
||||
@@ -132,13 +121,9 @@ export class Directory {
|
||||
})
|
||||
);
|
||||
}
|
||||
},
|
||||
finalFunction: async (tools) => {
|
||||
done.resolve();
|
||||
},
|
||||
}
|
||||
});
|
||||
fileNameStream.pipe(duplexStream);
|
||||
await done.promise;
|
||||
|
||||
return fileArray;
|
||||
}
|
||||
|
||||
@@ -146,54 +131,52 @@ export class Directory {
|
||||
* lists all folders
|
||||
*/
|
||||
public async listDirectories(): Promise<Directory[]> {
|
||||
const done = plugins.smartpromise.defer();
|
||||
const basePath = this.getBasePath();
|
||||
const completeDirStream = await this.bucketRef.smartbucketRef.minioClient.listObjectsV2(
|
||||
this.bucketRef.name,
|
||||
this.getBasePath(),
|
||||
false
|
||||
);
|
||||
const directoryArray: Directory[] = [];
|
||||
const duplexStream = new plugins.smartstream.SmartDuplex<plugins.minio.BucketItem, void>({
|
||||
objectMode: true,
|
||||
writeFunction: async (bucketItem) => {
|
||||
if (bucketItem.name) {
|
||||
return;
|
||||
}
|
||||
let subtractedPath = bucketItem.prefix.replace(this.getBasePath(), '');
|
||||
if (subtractedPath.startsWith('/')) {
|
||||
subtractedPath = subtractedPath.substr(1);
|
||||
}
|
||||
if (subtractedPath.includes('/')) {
|
||||
const dirName = subtractedPath.split('/')[0];
|
||||
if (directoryArray.find((directory) => directory.name === dirName)) {
|
||||
return;
|
||||
try {
|
||||
const command = new plugins.s3.ListObjectsV2Command({
|
||||
Bucket: this.bucketRef.name,
|
||||
Prefix: this.getBasePath(),
|
||||
Delimiter: '/',
|
||||
});
|
||||
const response = await this.bucketRef.smartbucketRef.s3Client.send(command);
|
||||
const directoryArray: Directory[] = [];
|
||||
|
||||
if (response.CommonPrefixes) {
|
||||
response.CommonPrefixes.forEach((item) => {
|
||||
if (item.Prefix) {
|
||||
const subtractedPath = item.Prefix.replace(this.getBasePath(), '');
|
||||
if (subtractedPath.endsWith('/')) {
|
||||
const dirName = subtractedPath.slice(0, -1);
|
||||
// Ensure the directory name is not empty (which would indicate the base directory itself)
|
||||
if (dirName) {
|
||||
directoryArray.push(new Directory(this.bucketRef, this, dirName));
|
||||
}
|
||||
}
|
||||
}
|
||||
directoryArray.push(new Directory(this.bucketRef, this, dirName));
|
||||
}
|
||||
},
|
||||
finalFunction: async (tools) => {
|
||||
done.resolve();
|
||||
},
|
||||
});
|
||||
completeDirStream.pipe(duplexStream);
|
||||
await done.promise;
|
||||
return directoryArray;
|
||||
});
|
||||
}
|
||||
|
||||
return directoryArray;
|
||||
} catch (error) {
|
||||
console.error('Error listing directories:', error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* gets an array that has all objects with a certain prefix;
|
||||
* gets an array that has all objects with a certain prefix
|
||||
*/
|
||||
public async getTreeArray() {
|
||||
const treeArray = await this.bucketRef.smartbucketRef.minioClient.listObjectsV2(
|
||||
this.bucketRef.name,
|
||||
this.getBasePath(),
|
||||
true
|
||||
);
|
||||
const command = new plugins.s3.ListObjectsV2Command({
|
||||
Bucket: this.bucketRef.name,
|
||||
Prefix: this.getBasePath(),
|
||||
Delimiter: '/',
|
||||
});
|
||||
const response = await this.bucketRef.smartbucketRef.s3Client.send(command);
|
||||
return response.Contents;
|
||||
}
|
||||
|
||||
/**
|
||||
* gets a sub directory
|
||||
* gets a sub directory by name
|
||||
*/
|
||||
public async getSubDirectoryByName(dirNameArg: string): Promise<Directory> {
|
||||
const dirNameArray = dirNameArg.split('/');
|
||||
@@ -204,11 +187,13 @@ export class Directory {
|
||||
return directory.name === dirNameToSearch;
|
||||
});
|
||||
};
|
||||
|
||||
let wantedDirectory: Directory;
|
||||
for (const dirNameToSearch of dirNameArray) {
|
||||
const directoryToSearchIn = wantedDirectory ? wantedDirectory : this;
|
||||
wantedDirectory = await getDirectory(directoryToSearchIn, dirNameToSearch);
|
||||
}
|
||||
|
||||
return wantedDirectory;
|
||||
}
|
||||
|
||||
@@ -217,19 +202,20 @@ export class Directory {
|
||||
*/
|
||||
public async move() {
|
||||
// TODO
|
||||
throw new Error('moving a directory is not yet implemented');
|
||||
throw new Error('Moving a directory is not yet implemented');
|
||||
}
|
||||
|
||||
/**
|
||||
* creates a file within this directory
|
||||
* creates an empty file within this directory
|
||||
* @param relativePathArg
|
||||
*/
|
||||
public async createEmptyFile(relativePathArg: string) {
|
||||
const emtpyFile = await File.create({
|
||||
const emptyFile = await File.create({
|
||||
directory: this,
|
||||
name: relativePathArg,
|
||||
contents: '',
|
||||
});
|
||||
return emptyFile;
|
||||
}
|
||||
|
||||
// file operations
|
||||
@@ -313,7 +299,7 @@ export class Directory {
|
||||
const deleteDirectory = async (directoryArg: Directory) => {
|
||||
const childDirectories = await directoryArg.listDirectories();
|
||||
if (childDirectories.length === 0) {
|
||||
console.log('directory empty! Path complete!');
|
||||
console.log('Directory empty! Path complete!');
|
||||
} else {
|
||||
for (const childDir of childDirectories) {
|
||||
await deleteDirectory(childDir);
|
||||
|
Reference in New Issue
Block a user