@flusys/nestjs-storage 1.0.0-rc → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/README.md +44 -1
  2. package/cjs/config/index.js +0 -1
  3. package/cjs/config/storage.constants.js +0 -9
  4. package/cjs/controllers/upload.controller.js +12 -17
  5. package/cjs/docs/storage-swagger.config.js +24 -136
  6. package/cjs/dtos/file-manager.dto.js +65 -32
  7. package/cjs/dtos/folder.dto.js +15 -9
  8. package/cjs/dtos/storage-config.dto.js +5 -86
  9. package/cjs/dtos/upload.dto.js +17 -17
  10. package/cjs/entities/file-manager-with-company.entity.js +3 -4
  11. package/cjs/entities/file-manager.entity.js +71 -3
  12. package/cjs/entities/folder-with-company.entity.js +3 -4
  13. package/cjs/entities/folder.entity.js +19 -3
  14. package/cjs/entities/index.js +9 -10
  15. package/cjs/entities/storage-config-with-company.entity.js +3 -4
  16. package/cjs/entities/storage-config.entity.js +73 -3
  17. package/cjs/middlewares/file-serve.middleware.js +107 -100
  18. package/cjs/modules/storage.module.js +82 -136
  19. package/cjs/providers/azure-provider.optional.js +10 -38
  20. package/cjs/providers/local-provider.js +0 -43
  21. package/cjs/providers/s3-provider.optional.js +19 -40
  22. package/cjs/providers/storage-factory.service.js +54 -99
  23. package/cjs/providers/storage-provider.registry.js +8 -18
  24. package/cjs/services/file-manager.service.js +239 -337
  25. package/cjs/services/folder.service.js +3 -3
  26. package/cjs/services/index.js +1 -0
  27. package/cjs/{config → services}/storage-config.service.js +30 -79
  28. package/cjs/services/storage-datasource.provider.js +16 -26
  29. package/cjs/services/storage-provider-config.service.js +3 -3
  30. package/cjs/services/upload.service.js +33 -61
  31. package/cjs/utils/file-validator.util.js +54 -66
  32. package/cjs/utils/image-compressor.util.js +2 -5
  33. package/config/index.d.ts +0 -1
  34. package/config/storage.constants.d.ts +0 -6
  35. package/controllers/upload.controller.d.ts +1 -0
  36. package/dtos/file-manager.dto.d.ts +11 -3
  37. package/dtos/folder.dto.d.ts +3 -1
  38. package/dtos/storage-config.dto.d.ts +7 -11
  39. package/entities/file-manager-with-company.entity.d.ts +2 -2
  40. package/entities/file-manager.entity.d.ts +11 -2
  41. package/entities/folder-with-company.entity.d.ts +2 -2
  42. package/entities/folder.entity.d.ts +4 -2
  43. package/entities/index.d.ts +3 -4
  44. package/entities/storage-config-with-company.entity.d.ts +2 -2
  45. package/entities/storage-config.entity.d.ts +7 -2
  46. package/fesm/config/index.js +0 -1
  47. package/fesm/config/storage.constants.js +0 -6
  48. package/fesm/controllers/upload.controller.js +12 -17
  49. package/fesm/docs/storage-swagger.config.js +27 -142
  50. package/fesm/dtos/file-manager.dto.js +66 -33
  51. package/fesm/dtos/folder.dto.js +16 -10
  52. package/fesm/dtos/storage-config.dto.js +7 -88
  53. package/fesm/dtos/upload.dto.js +17 -18
  54. package/fesm/entities/file-manager-with-company.entity.js +3 -4
  55. package/fesm/entities/file-manager.entity.js +72 -4
  56. package/fesm/entities/folder-with-company.entity.js +3 -4
  57. package/fesm/entities/folder.entity.js +20 -4
  58. package/fesm/entities/index.js +4 -8
  59. package/fesm/entities/storage-config-with-company.entity.js +3 -4
  60. package/fesm/entities/storage-config.entity.js +74 -4
  61. package/fesm/middlewares/file-serve.middleware.js +107 -100
  62. package/fesm/modules/storage.module.js +83 -136
  63. package/fesm/providers/azure-provider.optional.js +11 -42
  64. package/fesm/providers/local-provider.js +0 -43
  65. package/fesm/providers/s3-provider.optional.js +20 -44
  66. package/fesm/providers/storage-factory.service.js +52 -97
  67. package/fesm/providers/storage-provider.registry.js +10 -20
  68. package/fesm/services/file-manager.service.js +237 -335
  69. package/fesm/services/folder.service.js +1 -1
  70. package/fesm/services/index.js +1 -0
  71. package/fesm/{config → services}/storage-config.service.js +30 -79
  72. package/fesm/services/storage-datasource.provider.js +16 -26
  73. package/fesm/services/storage-provider-config.service.js +1 -1
  74. package/fesm/services/upload.service.js +31 -59
  75. package/fesm/utils/file-validator.util.js +54 -66
  76. package/fesm/utils/image-compressor.util.js +2 -5
  77. package/interfaces/storage-config.interface.d.ts +1 -2
  78. package/interfaces/storage-module-options.interface.d.ts +0 -5
  79. package/middlewares/file-serve.middleware.d.ts +9 -1
  80. package/modules/storage.module.d.ts +1 -2
  81. package/package.json +3 -3
  82. package/providers/azure-provider.optional.d.ts +8 -6
  83. package/providers/local-provider.d.ts +0 -7
  84. package/providers/s3-provider.optional.d.ts +9 -7
  85. package/providers/storage-factory.service.d.ts +8 -9
  86. package/providers/storage-provider.registry.d.ts +4 -4
  87. package/services/file-manager.service.d.ts +21 -14
  88. package/services/folder.service.d.ts +4 -4
  89. package/services/index.d.ts +1 -0
  90. package/{config → services}/storage-config.service.d.ts +9 -10
  91. package/services/storage-datasource.provider.d.ts +3 -4
  92. package/services/storage-provider-config.service.d.ts +5 -6
  93. package/services/upload.service.d.ts +5 -5
  94. package/utils/file-validator.util.d.ts +3 -0
  95. package/cjs/entities/file-manager-base.entity.js +0 -115
  96. package/cjs/entities/folder-base.entity.js +0 -55
  97. package/cjs/entities/storage-config-base.entity.js +0 -93
  98. package/entities/file-manager-base.entity.d.ts +0 -13
  99. package/entities/folder-base.entity.d.ts +0 -5
  100. package/entities/storage-config-base.entity.d.ts +0 -9
  101. package/fesm/entities/file-manager-base.entity.js +0 -108
  102. package/fesm/entities/folder-base.entity.js +0 -48
  103. package/fesm/entities/storage-config-base.entity.js +0 -83
@@ -1,17 +1,18 @@
1
1
  import { UploadOptionsDto } from '../dtos';
2
2
  import { IStorageProvider, IUploadedFileInfo } from '../interfaces';
3
+ interface AzureConfig {
4
+ accountName: string;
5
+ accountKey: string;
6
+ containerName: string;
7
+ connectionString?: string;
8
+ }
3
9
  export declare class AzureProvider implements IStorageProvider {
4
10
  private logger;
5
11
  private blobServiceClient;
6
12
  private containerClient;
7
13
  private containerName;
8
14
  private accountName;
9
- initialize(config: {
10
- accountName: string;
11
- accountKey: string;
12
- containerName: string;
13
- connectionString?: string;
14
- }): Promise<void>;
15
+ initialize(config: AzureConfig): Promise<void>;
15
16
  uploadFile(file: Express.Multer.File, options: UploadOptionsDto): Promise<IUploadedFileInfo>;
16
17
  uploadMultipleFiles(files: Express.Multer.File[], options: UploadOptionsDto): Promise<IUploadedFileInfo[]>;
17
18
  deleteFile(key: string): Promise<void>;
@@ -19,3 +20,4 @@ export declare class AzureProvider implements IStorageProvider {
19
20
  generatePresignedUrl(key: string, expiresInSeconds?: number): Promise<string>;
20
21
  healthCheck(): Promise<boolean>;
21
22
  }
23
+ export {};
@@ -17,11 +17,4 @@ export declare class LocalProvider implements IStorageProvider {
17
17
  deleteMultipleFiles(keys: string[]): Promise<void>;
18
18
  generatePresignedUrl(key: string, _expiresInSeconds?: number): Promise<string>;
19
19
  healthCheck(): Promise<boolean>;
20
- getAbsolutePath(key: string): string;
21
- fileExists(key: string): Promise<boolean>;
22
- getFileStats(key: string): Promise<{
23
- size: number;
24
- createdAt: Date;
25
- modifiedAt: Date;
26
- }>;
27
20
  }
@@ -1,17 +1,18 @@
1
1
  import { UploadOptionsDto } from '../dtos';
2
2
  import { IStorageProvider, IUploadedFileInfo } from '../interfaces';
3
+ interface S3Config {
4
+ region: string;
5
+ bucket: string;
6
+ accessKeyId?: string;
7
+ secretAccessKey?: string;
8
+ endpoint?: string;
9
+ }
3
10
  export declare class S3Provider implements IStorageProvider {
4
11
  private logger;
5
12
  private s3;
6
13
  private bucketName;
7
14
  private region;
8
- initialize(config: {
9
- region: string;
10
- bucket: string;
11
- accessKeyId?: string;
12
- secretAccessKey?: string;
13
- endpoint?: string;
14
- }): Promise<void>;
15
+ initialize(config: S3Config): Promise<void>;
15
16
  uploadFile(file: Express.Multer.File, options: UploadOptionsDto): Promise<IUploadedFileInfo>;
16
17
  uploadMultipleFiles(files: Express.Multer.File[], options: UploadOptionsDto): Promise<IUploadedFileInfo[]>;
17
18
  deleteFile(key: string): Promise<void>;
@@ -19,3 +20,4 @@ export declare class S3Provider implements IStorageProvider {
19
20
  generatePresignedUrl(key: string, expiresInSeconds?: number): Promise<string>;
20
21
  healthCheck(): Promise<boolean>;
21
22
  }
23
+ export {};
@@ -1,17 +1,16 @@
1
- import { IStorageProvider, IStorageProviderConfig } from '../interfaces/storage-provider.interface';
2
1
  import { OnModuleDestroy } from '@nestjs/common';
3
- import { StorageConfigService } from '../config';
2
+ import { IStorageProvider, IStorageProviderConfig } from '../interfaces/storage-provider.interface';
3
+ import { StorageConfigService } from '../services';
4
4
  export declare class StorageFactoryService implements OnModuleDestroy {
5
- private readonly storageConfigService;
5
+ private readonly configService;
6
6
  private readonly logger;
7
- private providerCache;
8
- constructor(storageConfigService: StorageConfigService);
9
- private generateCacheKey;
7
+ private readonly cache;
8
+ constructor(configService: StorageConfigService);
10
9
  createProvider(config: IStorageProviderConfig): Promise<IStorageProvider>;
11
10
  getProvider(providerName: string): Promise<IStorageProvider>;
12
- clearCache(): void;
13
- isProviderAvailable(providerName: string): boolean;
14
- getAvailableProviders(): string[];
15
11
  getLocalProviderBasePath(): string | null;
12
+ clearCache(): void;
16
13
  onModuleDestroy(): Promise<void>;
14
+ private generateCacheKey;
15
+ private initializeProvider;
17
16
  }
@@ -1,10 +1,10 @@
1
- import { IStorageProvider } from '../interfaces';
2
1
  import { Type } from '@nestjs/common';
2
+ import { IStorageProvider } from '../interfaces';
3
3
  export declare class StorageProviderRegistry {
4
4
  private static providers;
5
- static register(providerName: string, providerClass: Type<IStorageProvider>): void;
6
- static get(providerName: string): Type<IStorageProvider> | undefined;
7
- static has(providerName: string): boolean;
5
+ static register(name: string, providerClass: Type<IStorageProvider>): void;
6
+ static get(name: string): Type<IStorageProvider> | undefined;
7
+ static has(name: string): boolean;
8
8
  static getAll(): string[];
9
9
  static clear(): void;
10
10
  }
@@ -3,9 +3,9 @@ import { DeleteDto, FilterAndPaginationDto } from '@flusys/nestjs-shared/dtos';
3
3
  import { ILoggedUserInfo } from '@flusys/nestjs-shared/interfaces';
4
4
  import { UtilsService } from '@flusys/nestjs-shared/modules';
5
5
  import { EntityTarget, QueryRunner, Repository, SelectQueryBuilder } from 'typeorm';
6
- import { StorageConfigService } from '../config';
6
+ import { StorageConfigService } from './storage-config.service';
7
7
  import { CreateFileManagerDto, FilesResponseDto, GetFilesRequestDto, UpdateFileManagerDto } from '../dtos';
8
- import { FileManagerBase } from '../entities';
8
+ import { FileManager, FileManagerBase } from '../entities';
9
9
  import { IFileManager } from '../interfaces';
10
10
  import { StorageDataSourceProvider } from './storage-datasource.provider';
11
11
  import { UploadService } from './upload.service';
@@ -15,24 +15,15 @@ export declare class FileManagerService extends RequestScopedApiService<CreateFi
15
15
  protected uploadService: UploadService;
16
16
  private readonly storageConfig;
17
17
  private readonly dataSourceProvider;
18
- private readonly FILE_URL_EXPIRY_SECONDS;
19
- private getFileBaseUrl;
20
18
  constructor(cacheManager: HybridCache, utilsService: UtilsService, uploadService: UploadService, storageConfig: StorageConfigService, dataSourceProvider: StorageDataSourceProvider);
21
19
  protected resolveEntity(): EntityTarget<FileManagerBase>;
22
20
  protected getDataSourceProvider(): StorageDataSourceProvider;
23
21
  convertSingleDtoToEntity(dto: CreateFileManagerDto | UpdateFileManagerDto, user: ILoggedUserInfo | null): Promise<FileManagerBase>;
24
22
  getSelectQuery(query: SelectQueryBuilder<FileManagerBase>, _user: ILoggedUserInfo | null, select?: string[]): Promise<{
25
- query: SelectQueryBuilder<FileManagerBase>;
23
+ query: SelectQueryBuilder<FileManager>;
26
24
  isRaw: boolean;
27
25
  }>;
28
- enrichWithProviderNames<T extends {
29
- storageConfigId?: string | null;
30
- }>(items: T[]): Promise<(T & {
31
- providerName?: string;
32
- })[]>;
33
- protected getFilterQuery(query: SelectQueryBuilder<FileManagerBase>, filter: {
34
- [key: string]: any;
35
- }, _user: ILoggedUserInfo | null): Promise<{
26
+ protected getFilterQuery(query: SelectQueryBuilder<FileManagerBase>, filter: Record<string, any>, _user: ILoggedUserInfo | null): Promise<{
36
27
  query: SelectQueryBuilder<FileManagerBase>;
37
28
  isRaw: boolean;
38
29
  }>;
@@ -40,6 +31,22 @@ export declare class FileManagerService extends RequestScopedApiService<CreateFi
40
31
  query: SelectQueryBuilder<FileManagerBase>;
41
32
  isRaw: boolean;
42
33
  }>;
43
- beforeDeleteOperation(dto: DeleteDto, user: ILoggedUserInfo | null, _queryRunner: QueryRunner): Promise<void>;
34
+ beforeDeleteOperation(dto: DeleteDto, user: ILoggedUserInfo | null, _qr: QueryRunner): Promise<void>;
35
+ enrichWithProviderNames<T extends {
36
+ storageConfigId?: string | null;
37
+ }>(items: T[]): Promise<(T & {
38
+ providerName?: string;
39
+ })[]>;
44
40
  getFiles(dtos: GetFilesRequestDto[], protocol: string, host: string, user?: ILoggedUserInfo): Promise<FilesResponseDto[]>;
41
+ private getStorageConfigRepository;
42
+ private buildWhereWithCompany;
43
+ private getStorageConfigBasePath;
44
+ private validateFolder;
45
+ private resolveStorageLocation;
46
+ private applyContentTypeFilter;
47
+ private applyPrivateFileFilter;
48
+ private groupFilesByConfig;
49
+ private getFileBaseUrl;
50
+ private refreshFileUrl;
51
+ private toFileResponse;
45
52
  }
@@ -2,9 +2,9 @@ import { RequestScopedApiService, HybridCache } from '@flusys/nestjs-shared/clas
2
2
  import { ILoggedUserInfo } from '@flusys/nestjs-shared/interfaces';
3
3
  import { UtilsService } from '@flusys/nestjs-shared/modules';
4
4
  import { EntityTarget, Repository, SelectQueryBuilder } from 'typeorm';
5
- import { StorageConfigService } from '../config';
5
+ import { StorageConfigService } from './storage-config.service';
6
6
  import { CreateFolderDto, UpdateFolderDto } from '../dtos';
7
- import { FolderBase } from '../entities';
7
+ import { Folder, FolderBase } from '../entities';
8
8
  import { IFolder } from '../interfaces';
9
9
  import { StorageDataSourceProvider } from './storage-datasource.provider';
10
10
  export declare class FolderService extends RequestScopedApiService<CreateFolderDto, UpdateFolderDto, IFolder, FolderBase, Repository<FolderBase>> {
@@ -17,11 +17,11 @@ export declare class FolderService extends RequestScopedApiService<CreateFolderD
17
17
  protected getDataSourceProvider(): StorageDataSourceProvider;
18
18
  convertSingleDtoToEntity(dto: CreateFolderDto | UpdateFolderDto, user: ILoggedUserInfo | null): Promise<FolderBase>;
19
19
  getSelectQuery(query: SelectQueryBuilder<FolderBase>, _user: ILoggedUserInfo | null, select?: string[]): Promise<{
20
- query: SelectQueryBuilder<FolderBase>;
20
+ query: SelectQueryBuilder<Folder>;
21
21
  isRaw: boolean;
22
22
  }>;
23
23
  protected getExtraManipulateQuery(query: SelectQueryBuilder<FolderBase>, filterDto: any, user: ILoggedUserInfo | null): Promise<{
24
- query: SelectQueryBuilder<FolderBase>;
24
+ query: SelectQueryBuilder<Folder>;
25
25
  isRaw: boolean;
26
26
  }>;
27
27
  }
@@ -1,5 +1,6 @@
1
1
  export * from './file-manager.service';
2
2
  export * from './folder.service';
3
+ export * from './storage-config.service';
3
4
  export * from './storage-provider-config.service';
4
5
  export * from './storage-datasource.provider';
5
6
  export * from './upload.service';
@@ -1,6 +1,10 @@
1
1
  import { DatabaseMode } from '@flusys/nestjs-core';
2
2
  import { IModuleConfigService } from '@flusys/nestjs-shared/interfaces';
3
3
  import { StorageModuleOptions } from '../interfaces';
4
+ interface ValidationResult {
5
+ valid: boolean;
6
+ message?: string;
7
+ }
4
8
  export declare class StorageConfigService implements IModuleConfigService {
5
9
  private readonly options;
6
10
  constructor(options: StorageModuleOptions);
@@ -9,17 +13,12 @@ export declare class StorageConfigService implements IModuleConfigService {
9
13
  isMultiTenant(): boolean;
10
14
  getMaxFileSize(): number;
11
15
  getAllowedFileTypes(): string[];
12
- isFileTypeAllowed(mimeType: string): boolean;
13
- validateFileSize(fileSize: number): {
14
- valid: boolean;
15
- message?: string;
16
- };
17
- validateFileType(mimeType: string): {
18
- valid: boolean;
19
- message?: string;
20
- };
21
- getDefaultDatabaseConfig(): import("@flusys/nestjs-core").IDatabaseConfig;
22
16
  getOptions(): StorageModuleOptions;
23
17
  getDefaultLocalStoragePath(): string;
24
18
  getAppUrl(): string;
19
+ isFileTypeAllowed(mimeType: string): boolean;
20
+ validateFileSize(fileSize: number): ValidationResult;
21
+ validateFileType(mimeType: string): ValidationResult;
22
+ private toMB;
25
23
  }
24
+ export {};
@@ -3,9 +3,9 @@ import { IDatabaseConfig, ITenantDatabaseConfig } from '@flusys/nestjs-core';
3
3
  import { Logger } from '@nestjs/common';
4
4
  import { Request } from 'express';
5
5
  import { DataSource } from 'typeorm';
6
- import { StorageModuleOptions } from '../interfaces';
6
+ import { StorageConfigService } from './storage-config.service';
7
7
  export declare class StorageDataSourceProvider extends MultiTenantDataSourceService {
8
- private readonly storageOptions;
8
+ private readonly configService;
9
9
  protected readonly logger: Logger;
10
10
  protected static readonly tenantConnections: Map<string, DataSource>;
11
11
  protected static singleDataSource: DataSource | null;
@@ -13,9 +13,8 @@ export declare class StorageDataSourceProvider extends MultiTenantDataSourceServ
13
13
  protected static initialized: boolean;
14
14
  protected static readonly connectionLocks: Map<string, Promise<DataSource>>;
15
15
  protected static singleConnectionLock: Promise<DataSource> | null;
16
- constructor(storageOptions: StorageModuleOptions, request?: Request);
16
+ constructor(configService: StorageConfigService, request?: Request);
17
17
  private static buildParentOptions;
18
- getEnableCompanyFeature(): boolean;
19
18
  getEnableCompanyFeatureForTenant(tenant?: ITenantDatabaseConfig): boolean;
20
19
  getEnableCompanyFeatureForCurrentTenant(): boolean;
21
20
  getStorageEntities(enableCompanyFeature?: boolean): Promise<any[]>;
@@ -2,10 +2,9 @@ import { RequestScopedApiService, HybridCache } from '@flusys/nestjs-shared/clas
2
2
  import { ILoggedUserInfo } from '@flusys/nestjs-shared/interfaces';
3
3
  import { UtilsService } from '@flusys/nestjs-shared/modules';
4
4
  import { EntityTarget, Repository, SelectQueryBuilder } from 'typeorm';
5
- import { StorageConfigService } from '../config';
5
+ import { StorageConfigService } from './storage-config.service';
6
6
  import { CreateStorageConfigDto, UpdateStorageConfigDto } from '../dtos';
7
- import { StorageConfigBase } from '../entities';
8
- import { FileLocationEnum } from '../enums';
7
+ import { StorageConfig, StorageConfigBase } from '../entities';
9
8
  import { IStorageConfig } from '../interfaces';
10
9
  import { StorageDataSourceProvider } from './storage-datasource.provider';
11
10
  export declare class StorageProviderConfigService extends RequestScopedApiService<CreateStorageConfigDto, UpdateStorageConfigDto, IStorageConfig, StorageConfigBase, Repository<StorageConfigBase>> {
@@ -18,14 +17,14 @@ export declare class StorageProviderConfigService extends RequestScopedApiServic
18
17
  protected getDataSourceProvider(): StorageDataSourceProvider;
19
18
  convertSingleDtoToEntity(dto: CreateStorageConfigDto | UpdateStorageConfigDto, user: ILoggedUserInfo | null): Promise<StorageConfigBase>;
20
19
  getSelectQuery(query: SelectQueryBuilder<StorageConfigBase>, _user: ILoggedUserInfo | null, select?: string[]): Promise<{
21
- query: SelectQueryBuilder<StorageConfigBase>;
20
+ query: SelectQueryBuilder<StorageConfig>;
22
21
  isRaw: boolean;
23
22
  }>;
24
23
  protected getExtraManipulateQuery(query: SelectQueryBuilder<StorageConfigBase>, filterDto: any, user: ILoggedUserInfo | null): Promise<{
25
- query: SelectQueryBuilder<StorageConfigBase>;
24
+ query: SelectQueryBuilder<StorageConfig>;
26
25
  isRaw: boolean;
27
26
  }>;
28
27
  findByIdDirect(id: string): Promise<StorageConfigBase | null>;
29
28
  getDefaultConfig(user?: ILoggedUserInfo): Promise<StorageConfigBase | null>;
30
- getConfigByType(storage: FileLocationEnum, user?: ILoggedUserInfo): Promise<StorageConfigBase[]>;
29
+ getConfigByType(storage: string, user?: ILoggedUserInfo): Promise<StorageConfigBase[]>;
31
30
  }
@@ -1,7 +1,6 @@
1
1
  import { ILoggedUserInfo } from '@flusys/nestjs-shared/interfaces';
2
- import { StorageConfigService } from '../config';
2
+ import { StorageConfigService } from './storage-config.service';
3
3
  import { UploadOptionsDto } from '../dtos/upload.dto';
4
- import { FileLocationEnum } from '../enums/file-location.enum';
5
4
  import { IUploadedFileInfo } from '../interfaces/storage-provider.interface';
6
5
  import { StorageFactoryService } from '../providers/storage-factory.service';
7
6
  import { StorageProviderConfigService } from './storage-provider-config.service';
@@ -12,13 +11,14 @@ export declare class UploadService {
12
11
  private logger;
13
12
  constructor(storageFactory: StorageFactoryService, storageConfigService: StorageConfigService, storageProviderConfigService: StorageProviderConfigService);
14
13
  private validateFile;
14
+ private createProviderFromConfig;
15
+ private createFallbackLocalProvider;
15
16
  private getStorageProviderWithConfig;
16
- private getStorageProvider;
17
17
  private getStorageProviderForDelete;
18
18
  uploadSingleFile(file: Express.Multer.File, options: UploadOptionsDto, user?: ILoggedUserInfo): Promise<IUploadedFileInfo>;
19
19
  uploadMultipleFiles(files: Express.Multer.File[], options: UploadOptionsDto, user?: ILoggedUserInfo): Promise<IUploadedFileInfo[]>;
20
- deleteSingleFile(key: string, storageConfigId?: string, user?: ILoggedUserInfo, locationHint?: FileLocationEnum): Promise<boolean>;
21
- deleteMultipleFile(keys: string[], storageConfigId?: string, user?: ILoggedUserInfo, locationHint?: FileLocationEnum): Promise<boolean>;
20
+ deleteSingleFile(key: string, storageConfigId?: string, user?: ILoggedUserInfo, locationHint?: string): Promise<boolean>;
21
+ deleteMultipleFile(keys: string[], storageConfigId?: string, user?: ILoggedUserInfo, locationHint?: string): Promise<boolean>;
22
22
  bytesToKb(bytes: number): number;
23
23
  getLocalStorageBasePath(): Promise<string | null>;
24
24
  makeFileUrl(key: string, storageConfigId: string, expiresIn?: number, user?: ILoggedUserInfo): Promise<string>;
@@ -6,11 +6,14 @@ export interface FileValidationResult {
6
6
  }
7
7
  export declare class FileValidator {
8
8
  private static logger;
9
+ private static failureResult;
10
+ private static successResult;
9
11
  static detectFileType(buffer: Buffer): string | null;
10
12
  static isTextBasedType(mimeType: string): boolean;
11
13
  static isDangerousTextType(mimeType: string): boolean;
12
14
  static mimeTypesMatch(detected: string, declared: string): boolean;
13
15
  static isTypeAllowed(mimeType: string, allowedTypes: string[]): boolean;
14
16
  static validateFileContent(buffer: Buffer, declaredMimeType: string, allowedTypes?: string[]): FileValidationResult;
17
+ private static validateUndetectedType;
15
18
  static sanitizeFilename(filename: string): string;
16
19
  }
@@ -1,115 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "FileManagerBase", {
6
- enumerable: true,
7
- get: function() {
8
- return FileManagerBase;
9
- }
10
- });
11
- const _entities = require("@flusys/nestjs-shared/entities");
12
- const _enums = require("../enums");
13
- const _typeorm = require("typeorm");
14
- function _define_property(obj, key, value) {
15
- if (key in obj) {
16
- Object.defineProperty(obj, key, {
17
- value: value,
18
- enumerable: true,
19
- configurable: true,
20
- writable: true
21
- });
22
- } else {
23
- obj[key] = value;
24
- }
25
- return obj;
26
- }
27
- function _ts_decorate(decorators, target, key, desc) {
28
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
29
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
30
- else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
31
- return c > 3 && r && Object.defineProperty(target, key, r), r;
32
- }
33
- function _ts_metadata(k, v) {
34
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
35
- }
36
- let FileManagerBase = class FileManagerBase extends _entities.Identity {
37
- constructor(...args){
38
- super(...args), _define_property(this, "name", void 0 // Store original name of the file
39
- ), _define_property(this, "contentType", void 0 // MIME type of the file
40
- ), _define_property(this, "size", void 0 // Size of the file in KB
41
- ), _define_property(this, "key", void 0 // Storage key or path of the file
42
- ), _define_property(this, "url", void 0 // Accessible URL of the file
43
- ), _define_property(this, "location", void 0 // aws, azure, sftp
44
- ), _define_property(this, "storageConfigId", void 0 // Reference to storage_config table
45
- ), _define_property(this, "expiresAt", null) // Expiration timestamp for the URL
46
- , _define_property(this, "isPrivate", void 0);
47
- }
48
- };
49
- _ts_decorate([
50
- (0, _typeorm.Column)({
51
- type: 'varchar',
52
- length: 255,
53
- nullable: false
54
- }),
55
- _ts_metadata("design:type", String)
56
- ], FileManagerBase.prototype, "name", void 0);
57
- _ts_decorate([
58
- (0, _typeorm.Column)({
59
- type: 'varchar',
60
- length: 255,
61
- nullable: false
62
- }),
63
- _ts_metadata("design:type", String)
64
- ], FileManagerBase.prototype, "contentType", void 0);
65
- _ts_decorate([
66
- (0, _typeorm.Column)({
67
- type: 'varchar',
68
- length: 255,
69
- nullable: false
70
- }),
71
- _ts_metadata("design:type", String)
72
- ], FileManagerBase.prototype, "size", void 0);
73
- _ts_decorate([
74
- (0, _typeorm.Column)({
75
- type: 'text',
76
- nullable: false
77
- }),
78
- _ts_metadata("design:type", String)
79
- ], FileManagerBase.prototype, "key", void 0);
80
- _ts_decorate([
81
- (0, _typeorm.Column)({
82
- type: 'text',
83
- nullable: true
84
- }),
85
- _ts_metadata("design:type", Object)
86
- ], FileManagerBase.prototype, "url", void 0);
87
- _ts_decorate([
88
- (0, _typeorm.Column)({
89
- type: 'text',
90
- nullable: false
91
- }),
92
- _ts_metadata("design:type", typeof _enums.FileLocationEnum === "undefined" ? Object : _enums.FileLocationEnum)
93
- ], FileManagerBase.prototype, "location", void 0);
94
- _ts_decorate([
95
- (0, _typeorm.Column)({
96
- type: 'uuid',
97
- nullable: true
98
- }),
99
- _ts_metadata("design:type", Object)
100
- ], FileManagerBase.prototype, "storageConfigId", void 0);
101
- _ts_decorate([
102
- (0, _typeorm.Column)({
103
- type: 'bigint',
104
- nullable: true
105
- }),
106
- _ts_metadata("design:type", Object)
107
- ], FileManagerBase.prototype, "expiresAt", void 0);
108
- _ts_decorate([
109
- (0, _typeorm.Column)({
110
- type: 'boolean',
111
- nullable: false,
112
- default: false
113
- }),
114
- _ts_metadata("design:type", Boolean)
115
- ], FileManagerBase.prototype, "isPrivate", void 0);
@@ -1,55 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "FolderBase", {
6
- enumerable: true,
7
- get: function() {
8
- return FolderBase;
9
- }
10
- });
11
- const _entities = require("@flusys/nestjs-shared/entities");
12
- const _typeorm = require("typeorm");
13
- function _define_property(obj, key, value) {
14
- if (key in obj) {
15
- Object.defineProperty(obj, key, {
16
- value: value,
17
- enumerable: true,
18
- configurable: true,
19
- writable: true
20
- });
21
- } else {
22
- obj[key] = value;
23
- }
24
- return obj;
25
- }
26
- function _ts_decorate(decorators, target, key, desc) {
27
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
28
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
29
- else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
30
- return c > 3 && r && Object.defineProperty(target, key, r), r;
31
- }
32
- function _ts_metadata(k, v) {
33
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
34
- }
35
- let FolderBase = class FolderBase extends _entities.Identity {
36
- constructor(...args){
37
- super(...args), _define_property(this, "name", void 0), _define_property(this, "slug", void 0);
38
- }
39
- };
40
- _ts_decorate([
41
- (0, _typeorm.Column)({
42
- type: 'varchar',
43
- length: 255,
44
- nullable: false
45
- }),
46
- _ts_metadata("design:type", String)
47
- ], FolderBase.prototype, "name", void 0);
48
- _ts_decorate([
49
- (0, _typeorm.Column)({
50
- type: 'varchar',
51
- length: 255,
52
- nullable: false
53
- }),
54
- _ts_metadata("design:type", String)
55
- ], FolderBase.prototype, "slug", void 0);
@@ -1,93 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "StorageConfigBase", {
6
- enumerable: true,
7
- get: function() {
8
- return StorageConfigBase;
9
- }
10
- });
11
- const _entities = require("@flusys/nestjs-shared/entities");
12
- const _enums = require("../enums");
13
- const _typeorm = require("typeorm");
14
- function _define_property(obj, key, value) {
15
- if (key in obj) {
16
- Object.defineProperty(obj, key, {
17
- value: value,
18
- enumerable: true,
19
- configurable: true,
20
- writable: true
21
- });
22
- } else {
23
- obj[key] = value;
24
- }
25
- return obj;
26
- }
27
- function _ts_decorate(decorators, target, key, desc) {
28
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
29
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
30
- else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
31
- return c > 3 && r && Object.defineProperty(target, key, r), r;
32
- }
33
- function _ts_metadata(k, v) {
34
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
35
- }
36
- let StorageConfigBase = class StorageConfigBase extends _entities.Identity {
37
- constructor(...args){
38
- super(...args), _define_property(this, "name", void 0), _define_property(this, "storage", void 0), _define_property(this, "config", void 0), _define_property(this, "isActive", void 0), _define_property(this, "isDefault", void 0);
39
- }
40
- };
41
- _ts_decorate([
42
- (0, _typeorm.Column)({
43
- type: 'varchar',
44
- length: 255,
45
- nullable: false
46
- }),
47
- _ts_metadata("design:type", String)
48
- ], StorageConfigBase.prototype, "name", void 0);
49
- _ts_decorate([
50
- (0, _typeorm.Column)({
51
- type: 'enum',
52
- enum: _enums.FileLocationEnum,
53
- nullable: false
54
- }),
55
- _ts_metadata("design:type", typeof _enums.FileLocationEnum === "undefined" ? Object : _enums.FileLocationEnum)
56
- ], StorageConfigBase.prototype, "storage", void 0);
57
- _ts_decorate([
58
- (0, _typeorm.Column)({
59
- type: 'json',
60
- nullable: false
61
- }),
62
- _ts_metadata("design:type", typeof Record === "undefined" ? Object : Record)
63
- ], StorageConfigBase.prototype, "config", void 0);
64
- _ts_decorate([
65
- (0, _typeorm.Column)({
66
- type: 'boolean',
67
- default: true,
68
- name: 'is_active'
69
- }),
70
- _ts_metadata("design:type", Boolean)
71
- ], StorageConfigBase.prototype, "isActive", void 0);
72
- _ts_decorate([
73
- (0, _typeorm.Column)({
74
- type: 'boolean',
75
- default: false,
76
- name: 'is_default'
77
- }),
78
- _ts_metadata("design:type", Boolean)
79
- ], StorageConfigBase.prototype, "isDefault", void 0);
80
- StorageConfigBase = _ts_decorate([
81
- (0, _typeorm.Index)([
82
- 'name'
83
- ]),
84
- (0, _typeorm.Index)([
85
- 'storage'
86
- ]),
87
- (0, _typeorm.Index)([
88
- 'isActive'
89
- ]),
90
- (0, _typeorm.Index)([
91
- 'isDefault'
92
- ])
93
- ], StorageConfigBase);
@@ -1,13 +0,0 @@
1
- import { Identity } from '@flusys/nestjs-shared/entities';
2
- import { FileLocationEnum } from '../enums';
3
- export declare abstract class FileManagerBase extends Identity {
4
- name: string;
5
- contentType: string;
6
- size: string;
7
- key: string;
8
- url: string | null;
9
- location: FileLocationEnum;
10
- storageConfigId: string | null;
11
- expiresAt: number | null;
12
- isPrivate: boolean;
13
- }
@@ -1,5 +0,0 @@
1
- import { Identity } from '@flusys/nestjs-shared/entities';
2
- export declare abstract class FolderBase extends Identity {
3
- name: string;
4
- slug: string;
5
- }
@@ -1,9 +0,0 @@
1
- import { Identity } from '@flusys/nestjs-shared/entities';
2
- import { FileLocationEnum } from '../enums';
3
- export declare abstract class StorageConfigBase extends Identity {
4
- name: string;
5
- storage: FileLocationEnum;
6
- config: Record<string, any>;
7
- isActive: boolean;
8
- isDefault: boolean;
9
- }