@eleven-am/nestjs-storage
Version:
A NestJS module for uploading files to cloud storage providers
104 lines (84 loc) • 3.03 kB
text/typescript
import { Injectable } from '@nestjs/common';
import { BaseStorage } from '../providers/baseStorage';
import { Provider, StorageOption } from '../types/options';
import { LocalStorage } from '../providers/localStorage';
import { S3BaseStorage } from '../providers/s3BaseStorage';
import { GDriveStorage } from '../providers/gDriveStorage';
import { DropboxStorage } from '../providers/dropboxStorage';
import { IFileWithParentName } from '../types/storage';
()
export class StorageService {
constructor(private readonly storageProvider: BaseStorage) {}
putFile(path: string, data: Buffer) {
return this.storageProvider.putFile(path, data);
}
getFileOrFolder(fileId: string) {
return this.storageProvider.getFileOrFolder(fileId);
}
readFile(fileId: string) {
return this.storageProvider.readFile(fileId);
}
deleteFileOrFolder(fileId: string) {
return this.storageProvider.deleteFileOrFolder(fileId);
}
moveFileOrFolder(fileId: string, newPath: string) {
return this.storageProvider.moveFileOrFolder(fileId, newPath);
}
renameFileOrFolder(fileId: string, newName: string) {
return this.storageProvider.renameFileOrFolder(fileId, newName);
}
createFolder(path: string) {
return this.storageProvider.createFolder(path);
}
readFolder(folderId?: string) {
return folderId
? this.storageProvider.readFolder(folderId)
: this.storageProvider.readRootFolder();
}
async readFolderRecursive(folderId: string) {
const items = await this.storageProvider.readFolder(folderId);
const folder = await this.storageProvider.getFileOrFolder(folderId);
const files = items.filter((file) => !file.isFolder);
const folders = items.filter((file) => file.isFolder);
const mappedFiles = files.map(
(file): IFileWithParentName => ({
...file,
parentName: folder.name,
}),
);
const internalFiles = await Promise.all(
folders.map((folder) => this.readFolderRecursive(folder.path)),
);
return [...mappedFiles, ...internalFiles.flat()] as IFileWithParentName[];
}
getSignedUrl(fileId: string, expires?: number) {
return this.storageProvider.getSignedUrl(fileId, expires);
}
streamFile(fileId: string, range: string) {
return this.storageProvider.streamFile(fileId, range);
}
createProvider(options: StorageOption) {
let provider: BaseStorage | null = null;
switch (options.provider) {
case Provider.LOCAL:
provider = new LocalStorage(options);
break;
case Provider.S3:
case Provider.R2:
provider = new S3BaseStorage(options);
break;
case Provider.GDRIVE:
provider = new GDriveStorage(options);
break;
case Provider.DROPBOX:
provider = new DropboxStorage(options);
break;
default:
throw new Error('Invalid storage provider');
}
return new StorageService(provider);
}
getProvider() {
return this.storageProvider.storageProvider;
}
}