import * as plugins from './smartbucket.plugins'; import { Bucket } from './smartbucket.classes.bucket'; import { File } from './smartbucket.classes.file'; export class Directory { public bucketRef: Bucket; public parentDirectory: Directory; public name: string; public tree: string[]; public files: string[]; public folders: string[]; constructor(bucketRefArg: Bucket, parentDiretory: Directory, name: string) { this.bucketRef = bucketRefArg; this.parentDirectory = parentDiretory; this.name = name; } /** * returns an array of parent directories */ public getParentDirectories(): Directory[] { let parentDirectories: Directory[] = []; if (this.parentDirectory) { parentDirectories.push(this.parentDirectory); parentDirectories = parentDirectories.concat(this.parentDirectory.getParentDirectories()); } return parentDirectories; } /** * returns the directory level */ public getDirectoryLevel(): number { return this.getParentDirectories().length; }; /** * updates the base path */ public getBasePath(): string { const parentDirectories = this.getParentDirectories(); let basePath = ''; for(const parentDir of parentDirectories) { basePath = parentDir.name + '/' + basePath; } return basePath; } /** * lists all files */ public async listFiles(): Promise { const done = plugins.smartpromise.defer(); const fileNameStream = await this.bucketRef.smartbucketRef.minioClient.listObjectsV2( this.bucketRef.name, this.getBasePath() ); const fileArray: File[] = []; const duplexStream = plugins.streamfunction.createDuplexStream(async fileName => { fileArray.push(new File(this, fileName)); }, async (tools) => { done.resolve(); }); fileNameStream.pipe(duplexStream); await done.promise; return fileArray; } /** * lists all folders */ public async listDirectories(): Promise { const done = plugins.smartpromise.defer(); const completeDirStream = await this.bucketRef.smartbucketRef.minioClient.listObjectsV2( this.bucketRef.name, this.getBasePath(), true ); const directoryArray: Directory[] = []; const duplexStream = plugins.streamfunction.createDuplexStream(async fileName => { console.log(fileName); const subtractedPath = fileName.name.replace(this.getBasePath(), ''); if (subtractedPath.includes('/')) { const dirName = fileName.name.split('/')[0]; if (directoryArray.find(directory => directory.name === dirName)) { return; } directoryArray.push(new Directory(this.bucketRef, this, dirName)); } }, async (tools) => { done.resolve(); }); completeDirStream.pipe(duplexStream); await done.promise; return directoryArray; } /** * 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 ); } /** * gets a sub directory */ public async getSubDirectory(): Promise { return this; // TODO } /** * moves the directory */ public async move () { // TODO } /** * creates a file within this directory * @param relativePathArg */ public async createFile(relativePathArg) { let completeFilePath: string = ''; } }