@flusys/nestjs-storage
v5.0.3
Published
Modular storage package with optional AWS S3, Azure Blob, and SFTP providers
Maintainers
Readme
@flusys/nestjs-storage
Multi-provider file storage for NestJS — Local disk, AWS S3, Azure Blob, and SFTP with folder management, image compression, and multi-tenant support.
Installation
npm install @flusys/nestjs-storage @flusys/nestjs-shared @flusys/nestjs-core sharp uuid mime-typesOptional cloud SDKs — install only what you need:
npm install @aws-sdk/client-s3 @aws-sdk/lib-storage @aws-sdk/s3-request-presigner # S3
npm install @azure/storage-blob # Azure
npm install ssh2-sftp-client # SFTP1. Register the Module
Synchronous
Mode 1: Single Database
import { StorageModule } from '@flusys/nestjs-storage';
@Module({
imports: [
StorageModule.forRoot({
global: true,
includeController: true,
bootstrapAppConfig: {
databaseMode: 'single',
enableCompanyFeature: false,
},
config: {
defaultDatabaseConfig: {
type: 'mysql',
host: process.env.DB_HOST,
port: Number(process.env.DB_PORT ?? 3306),
username: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,
},
maxFileSize: 10 * 1024 * 1024, // 10 MB (default: 100 MB)
allowedFileTypes: ['image/*', 'application/pdf'], // default: ['*/*']
localStoragePath: './uploads',
appUrl: process.env.APP_URL,
},
}),
],
})
export class AppModule {}Mode 2: Multi-Tenant
StorageModule.forRoot({
global: true,
includeController: true,
bootstrapAppConfig: {
databaseMode: 'multi-tenant',
enableCompanyFeature: true,
},
config: {
tenantDefaultDatabaseConfig: {
type: 'mysql',
host: process.env.TENANT_DB_HOST,
port: Number(process.env.TENANT_DB_PORT ?? 3306),
username: process.env.TENANT_DB_USER,
password: process.env.TENANT_DB_PASSWORD,
database: process.env.TENANT_DB_NAME,
},
tenants: [
{ id: 'tenant-a', database: 'tenant_a_db' },
{ id: 'tenant-b', database: 'tenant_b_db' },
],
maxFileSize: 10 * 1024 * 1024,
localStoragePath: './uploads',
appUrl: process.env.APP_URL,
},
});Asynchronous (with ConfigService)
import { ConfigModule, ConfigService } from '@nestjs/config';
import { StorageModule, ITenantDatabaseConfig } from '@flusys/nestjs-storage';
// Single database
StorageModule.forRootAsync({
global: true,
includeController: true,
bootstrapAppConfig: {
databaseMode: 'single',
enableCompanyFeature: true,
},
imports: [ConfigModule],
useFactory: (configService: ConfigService) => ({
defaultDatabaseConfig: {
type: 'mysql',
host: configService.get('DB_HOST'),
port: configService.get<number>('DB_PORT'),
username: configService.get('DB_USER'),
password: configService.get('DB_PASSWORD'),
database: configService.get('DB_NAME'),
},
maxFileSize: configService.get<number>('MAX_FILE_SIZE', 10 * 1024 * 1024),
appUrl: configService.get('APP_URL'),
localStoragePath: configService.get('UPLOAD_PATH', './uploads'),
}),
inject: [ConfigService],
});
// Multi-tenant
StorageModule.forRootAsync({
global: true,
includeController: true,
bootstrapAppConfig: {
databaseMode: 'multi-tenant',
enableCompanyFeature: true,
},
imports: [ConfigModule],
useFactory: (configService: ConfigService) => ({
tenantDefaultDatabaseConfig: {
type: 'mysql',
host: configService.get('TENANT_DB_HOST'),
port: configService.get<number>('TENANT_DB_PORT'),
username: configService.get('TENANT_DB_USER'),
password: configService.get('TENANT_DB_PASSWORD'),
database: configService.get('TENANT_DB_NAME'),
},
tenants: configService.get<ITenantDatabaseConfig[]>('TENANTS'),
maxFileSize: configService.get<number>('MAX_FILE_SIZE', 10 * 1024 * 1024),
appUrl: configService.get('APP_URL'),
localStoragePath: configService.get('UPLOAD_PATH', './uploads'),
}),
inject: [ConfigService],
});2. Register Entities in TypeORM
import { getStorageEntitiesByConfig } from '@flusys/nestjs-storage/entities';
TypeOrmModule.forRoot({
entities: [
...getStorageEntitiesByConfig(true), // match enableCompanyFeature in bootstrapAppConfig
],
});License
MIT © FLUSYS
