@flusys/nestjs-storage 1.1.0-beta → 2.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.
- package/README.md +148 -6
- package/cjs/config/index.js +0 -1
- package/cjs/config/storage.constants.js +0 -17
- package/cjs/controllers/file-manager.controller.js +44 -1
- package/cjs/controllers/folder.controller.js +44 -1
- package/cjs/controllers/storage-config.controller.js +44 -1
- package/cjs/controllers/upload.controller.js +18 -29
- package/cjs/docs/storage-swagger.config.js +24 -136
- package/cjs/dtos/file-manager.dto.js +70 -34
- package/cjs/dtos/folder.dto.js +15 -9
- package/cjs/dtos/storage-config.dto.js +4 -85
- package/cjs/dtos/upload.dto.js +24 -17
- package/cjs/entities/file-manager-with-company.entity.js +3 -4
- package/cjs/entities/file-manager.entity.js +71 -3
- package/cjs/entities/folder-with-company.entity.js +3 -4
- package/cjs/entities/folder.entity.js +19 -3
- package/cjs/entities/index.js +9 -10
- package/cjs/entities/storage-config-with-company.entity.js +3 -4
- package/cjs/entities/storage-config.entity.js +74 -3
- package/cjs/interfaces/index.js +0 -1
- package/cjs/middlewares/file-serve.middleware.js +113 -100
- package/cjs/modules/storage.module.js +82 -136
- package/cjs/providers/azure-provider.optional.js +10 -38
- package/cjs/providers/local-provider.js +38 -31
- package/cjs/providers/s3-provider.optional.js +19 -40
- package/cjs/providers/storage-factory.service.js +54 -99
- package/cjs/providers/storage-provider.registry.js +8 -18
- package/cjs/services/file-manager.service.js +238 -323
- package/cjs/services/folder.service.js +8 -11
- package/cjs/services/index.js +1 -0
- package/cjs/{config → services}/storage-config.service.js +32 -76
- package/cjs/services/storage-datasource.provider.js +16 -26
- package/cjs/services/storage-provider-config.service.js +15 -37
- package/cjs/services/upload.service.js +72 -88
- package/cjs/utils/file-validator.util.js +458 -0
- package/cjs/utils/image-compressor.util.js +3 -8
- package/config/index.d.ts +0 -1
- package/config/storage.constants.d.ts +0 -8
- package/controllers/upload.controller.d.ts +3 -6
- package/dtos/file-manager.dto.d.ts +12 -5
- package/dtos/folder.dto.d.ts +5 -5
- package/dtos/storage-config.dto.d.ts +7 -13
- package/entities/file-manager-with-company.entity.d.ts +2 -2
- package/entities/file-manager.entity.d.ts +12 -2
- package/entities/folder-with-company.entity.d.ts +2 -2
- package/entities/folder.entity.d.ts +4 -2
- package/entities/index.d.ts +3 -4
- package/entities/storage-config-with-company.entity.d.ts +2 -2
- package/entities/storage-config.entity.d.ts +8 -2
- package/fesm/config/index.js +0 -1
- package/fesm/config/storage.constants.js +0 -8
- package/fesm/controllers/file-manager.controller.js +45 -2
- package/fesm/controllers/folder.controller.js +45 -2
- package/fesm/controllers/storage-config.controller.js +45 -2
- package/fesm/controllers/upload.controller.js +19 -30
- package/fesm/docs/storage-swagger.config.js +27 -142
- package/fesm/dtos/file-manager.dto.js +71 -35
- package/fesm/dtos/folder.dto.js +16 -10
- package/fesm/dtos/storage-config.dto.js +8 -95
- package/fesm/dtos/upload.dto.js +25 -19
- package/fesm/entities/file-manager-with-company.entity.js +3 -4
- package/fesm/entities/file-manager.entity.js +72 -4
- package/fesm/entities/folder-with-company.entity.js +3 -4
- package/fesm/entities/folder.entity.js +20 -4
- package/fesm/entities/index.js +5 -13
- package/fesm/entities/storage-config-with-company.entity.js +3 -4
- package/fesm/entities/storage-config.entity.js +75 -4
- package/fesm/interfaces/index.js +0 -1
- package/fesm/interfaces/storage-config.interface.js +1 -3
- package/fesm/middlewares/file-serve.middleware.js +114 -101
- package/fesm/modules/storage.module.js +83 -136
- package/fesm/providers/azure-provider.optional.js +11 -42
- package/fesm/providers/local-provider.js +38 -31
- package/fesm/providers/s3-provider.optional.js +20 -44
- package/fesm/providers/storage-factory.service.js +52 -97
- package/fesm/providers/storage-provider.registry.js +10 -20
- package/fesm/services/file-manager.service.js +237 -322
- package/fesm/services/folder.service.js +6 -9
- package/fesm/services/index.js +1 -0
- package/fesm/{config → services}/storage-config.service.js +32 -76
- package/fesm/services/storage-datasource.provider.js +16 -26
- package/fesm/services/storage-provider-config.service.js +13 -35
- package/fesm/services/upload.service.js +71 -87
- package/fesm/utils/file-validator.util.js +451 -0
- package/fesm/utils/image-compressor.util.js +3 -8
- package/interfaces/file-manager.interface.d.ts +7 -4
- package/interfaces/index.d.ts +0 -1
- package/interfaces/storage-config.interface.d.ts +0 -20
- package/interfaces/storage-module-options.interface.d.ts +0 -5
- package/middlewares/file-serve.middleware.d.ts +9 -1
- package/modules/storage.module.d.ts +1 -2
- package/package.json +6 -6
- package/providers/azure-provider.optional.d.ts +8 -6
- package/providers/local-provider.d.ts +2 -7
- package/providers/s3-provider.optional.d.ts +9 -7
- package/providers/storage-factory.service.d.ts +8 -9
- package/providers/storage-provider.registry.d.ts +4 -4
- package/services/file-manager.service.d.ts +23 -16
- package/services/folder.service.d.ts +4 -4
- package/services/index.d.ts +1 -0
- package/services/storage-config.service.d.ts +24 -0
- package/services/storage-datasource.provider.d.ts +3 -4
- package/services/storage-provider-config.service.d.ts +4 -4
- package/services/upload.service.d.ts +3 -2
- package/utils/file-validator.util.d.ts +19 -0
- package/cjs/entities/file-manager-base.entity.js +0 -115
- package/cjs/entities/folder-base.entity.js +0 -55
- package/cjs/entities/storage-config-base.entity.js +0 -93
- package/cjs/interfaces/file-upload-response.interface.js +0 -4
- package/config/storage-config.service.d.ts +0 -22
- package/entities/file-manager-base.entity.d.ts +0 -13
- package/entities/folder-base.entity.d.ts +0 -5
- package/entities/storage-config-base.entity.d.ts +0 -9
- package/fesm/entities/file-manager-base.entity.js +0 -108
- package/fesm/entities/folder-base.entity.js +0 -48
- package/fesm/entities/storage-config-base.entity.js +0 -83
- package/fesm/interfaces/file-upload-response.interface.js +0 -1
- package/interfaces/file-upload-response.interface.d.ts +0 -6
|
@@ -10,8 +10,9 @@ Object.defineProperty(exports, "FolderService", {
|
|
|
10
10
|
});
|
|
11
11
|
const _classes = require("@flusys/nestjs-shared/classes");
|
|
12
12
|
const _modules = require("@flusys/nestjs-shared/modules");
|
|
13
|
+
const _utils = require("@flusys/nestjs-shared/utils");
|
|
13
14
|
const _common = require("@nestjs/common");
|
|
14
|
-
const
|
|
15
|
+
const _storageconfigservice = require("./storage-config.service");
|
|
15
16
|
const _entities = require("../entities");
|
|
16
17
|
const _storagedatasourceprovider = require("./storage-datasource.provider");
|
|
17
18
|
function _define_property(obj, key, value) {
|
|
@@ -48,16 +49,13 @@ let FolderService = class FolderService extends _classes.RequestScopedApiService
|
|
|
48
49
|
getDataSourceProvider() {
|
|
49
50
|
return this.dataSourceProvider;
|
|
50
51
|
}
|
|
51
|
-
// Entity Conversion
|
|
52
52
|
async convertSingleDtoToEntity(dto, user) {
|
|
53
53
|
const entity = await super.convertSingleDtoToEntity(dto, user);
|
|
54
|
-
// Set companyId from user context if company feature enabled
|
|
55
54
|
if (this.storageConfig.isCompanyFeatureEnabled()) {
|
|
56
55
|
entity.companyId = user?.companyId ?? null;
|
|
57
56
|
}
|
|
58
57
|
return entity;
|
|
59
58
|
}
|
|
60
|
-
// Query Customization
|
|
61
59
|
async getSelectQuery(query, _user, select) {
|
|
62
60
|
if (!select?.length) {
|
|
63
61
|
select = [
|
|
@@ -79,11 +77,10 @@ let FolderService = class FolderService extends _classes.RequestScopedApiService
|
|
|
79
77
|
}
|
|
80
78
|
async getExtraManipulateQuery(query, filterDto, user) {
|
|
81
79
|
const result = await super.getExtraManipulateQuery(query, filterDto, user);
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
}
|
|
80
|
+
(0, _utils.applyCompanyFilter)(query, {
|
|
81
|
+
isCompanyFeatureEnabled: this.storageConfig.isCompanyFeatureEnabled(),
|
|
82
|
+
entityAlias: 'folder'
|
|
83
|
+
}, user);
|
|
87
84
|
return result;
|
|
88
85
|
}
|
|
89
86
|
constructor(cacheManager, utilsService, storageConfig, dataSourceProvider){
|
|
@@ -96,13 +93,13 @@ FolderService = _ts_decorate([
|
|
|
96
93
|
}),
|
|
97
94
|
_ts_param(0, (0, _common.Inject)('CACHE_INSTANCE')),
|
|
98
95
|
_ts_param(1, (0, _common.Inject)(_modules.UtilsService)),
|
|
99
|
-
_ts_param(2, (0, _common.Inject)(
|
|
96
|
+
_ts_param(2, (0, _common.Inject)(_storageconfigservice.StorageConfigService)),
|
|
100
97
|
_ts_param(3, (0, _common.Inject)(_storagedatasourceprovider.StorageDataSourceProvider)),
|
|
101
98
|
_ts_metadata("design:type", Function),
|
|
102
99
|
_ts_metadata("design:paramtypes", [
|
|
103
100
|
typeof _classes.HybridCache === "undefined" ? Object : _classes.HybridCache,
|
|
104
101
|
typeof _modules.UtilsService === "undefined" ? Object : _modules.UtilsService,
|
|
105
|
-
typeof
|
|
102
|
+
typeof _storageconfigservice.StorageConfigService === "undefined" ? Object : _storageconfigservice.StorageConfigService,
|
|
106
103
|
typeof _storagedatasourceprovider.StorageDataSourceProvider === "undefined" ? Object : _storagedatasourceprovider.StorageDataSourceProvider
|
|
107
104
|
])
|
|
108
105
|
], FolderService);
|
package/cjs/services/index.js
CHANGED
|
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
});
|
|
5
5
|
_export_star(require("./file-manager.service"), exports);
|
|
6
6
|
_export_star(require("./folder.service"), exports);
|
|
7
|
+
_export_star(require("./storage-config.service"), exports);
|
|
7
8
|
_export_star(require("./storage-provider-config.service"), exports);
|
|
8
9
|
_export_star(require("./storage-datasource.provider"), exports);
|
|
9
10
|
_export_star(require("./upload.service"), exports);
|
|
@@ -10,7 +10,7 @@ Object.defineProperty(exports, "StorageConfigService", {
|
|
|
10
10
|
});
|
|
11
11
|
const _common = require("@nestjs/common");
|
|
12
12
|
const _interfaces = require("../interfaces");
|
|
13
|
-
const _storageconstants = require("
|
|
13
|
+
const _storageconstants = require("../config/storage.constants");
|
|
14
14
|
function _define_property(obj, key, value) {
|
|
15
15
|
if (key in obj) {
|
|
16
16
|
Object.defineProperty(obj, key, {
|
|
@@ -38,114 +38,70 @@ function _ts_param(paramIndex, decorator) {
|
|
|
38
38
|
decorator(target, key, paramIndex);
|
|
39
39
|
};
|
|
40
40
|
}
|
|
41
|
+
const BYTES_PER_MB = 1024 * 1024;
|
|
42
|
+
const DEFAULT_LOCAL_PATH = './uploads';
|
|
43
|
+
const DEFAULT_PORT = '3000';
|
|
41
44
|
let StorageConfigService = class StorageConfigService {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
*/ isCompanyFeatureEnabled() {
|
|
45
|
+
// ─── IModuleConfigService Implementation ────────────────────────────────────
|
|
46
|
+
isCompanyFeatureEnabled() {
|
|
45
47
|
return this.options.bootstrapAppConfig?.enableCompanyFeature ?? false;
|
|
46
48
|
}
|
|
47
|
-
|
|
48
|
-
* Get database mode
|
|
49
|
-
*/ getDatabaseMode() {
|
|
49
|
+
getDatabaseMode() {
|
|
50
50
|
return this.options.bootstrapAppConfig?.databaseMode ?? 'single';
|
|
51
51
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
52
|
+
isMultiTenant() {
|
|
53
|
+
return this.getDatabaseMode() === 'multi-tenant';
|
|
54
|
+
}
|
|
55
|
+
// ─── Config Getters ─────────────────────────────────────────────────────────
|
|
56
|
+
getMaxFileSize() {
|
|
55
57
|
return this.options.config?.maxFileSize ?? _storageconstants.DEFAULT_MAX_FILE_SIZE;
|
|
56
58
|
}
|
|
57
|
-
|
|
58
|
-
* Get allowed file types (MIME types or patterns)
|
|
59
|
-
*/ getAllowedFileTypes() {
|
|
59
|
+
getAllowedFileTypes() {
|
|
60
60
|
return this.options.config?.allowedFileTypes ?? _storageconstants.DEFAULT_ALLOWED_FILE_TYPES;
|
|
61
61
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
62
|
+
getOptions() {
|
|
63
|
+
return this.options;
|
|
64
|
+
}
|
|
65
|
+
getDefaultLocalStoragePath() {
|
|
66
|
+
return this.options.config?.localStoragePath ?? DEFAULT_LOCAL_PATH;
|
|
67
|
+
}
|
|
68
|
+
getAppUrl() {
|
|
69
|
+
return this.options.config?.appUrl ?? process.env.APP_URL ?? `http://localhost:${process.env.PORT ?? DEFAULT_PORT}`;
|
|
70
|
+
}
|
|
71
|
+
// ─── Validation Methods ─────────────────────────────────────────────────────
|
|
72
|
+
isFileTypeAllowed(mimeType) {
|
|
65
73
|
const allowedTypes = this.getAllowedFileTypes();
|
|
66
|
-
// If wildcard, allow all
|
|
67
74
|
if (allowedTypes.includes('*/*')) {
|
|
68
75
|
return true;
|
|
69
76
|
}
|
|
70
|
-
|
|
71
|
-
return allowedTypes.some((allowedType)=>{
|
|
72
|
-
if (allowedType.endsWith('/*')) {
|
|
73
|
-
const prefix = allowedType.slice(0, -2);
|
|
74
|
-
return mimeType.startsWith(prefix);
|
|
75
|
-
}
|
|
76
|
-
return allowedType === mimeType;
|
|
77
|
-
});
|
|
77
|
+
return allowedTypes.some((type)=>type.endsWith('/*') ? mimeType.startsWith(type.slice(0, -2)) : type === mimeType);
|
|
78
78
|
}
|
|
79
|
-
|
|
80
|
-
* Validate file size
|
|
81
|
-
*/ validateFileSize(fileSize) {
|
|
79
|
+
validateFileSize(fileSize) {
|
|
82
80
|
const maxSize = this.getMaxFileSize();
|
|
83
81
|
if (fileSize > maxSize) {
|
|
84
|
-
const maxSizeMB = (maxSize / (1024 * 1024)).toFixed(2);
|
|
85
|
-
const fileSizeMB = (fileSize / (1024 * 1024)).toFixed(2);
|
|
86
82
|
return {
|
|
87
83
|
valid: false,
|
|
88
|
-
message: `File size (${
|
|
84
|
+
message: `File size (${this.toMB(fileSize)}MB) exceeds maximum ${this.toMB(maxSize)}MB`
|
|
89
85
|
};
|
|
90
86
|
}
|
|
91
87
|
return {
|
|
92
88
|
valid: true
|
|
93
89
|
};
|
|
94
90
|
}
|
|
95
|
-
|
|
96
|
-
* Validate file type
|
|
97
|
-
*/ validateFileType(mimeType) {
|
|
91
|
+
validateFileType(mimeType) {
|
|
98
92
|
if (!this.isFileTypeAllowed(mimeType)) {
|
|
99
|
-
const allowedTypes = this.getAllowedFileTypes();
|
|
100
93
|
return {
|
|
101
94
|
valid: false,
|
|
102
|
-
message: `File type "${mimeType}"
|
|
95
|
+
message: `File type "${mimeType}" not allowed. Allowed: ${this.getAllowedFileTypes().join(', ')}`
|
|
103
96
|
};
|
|
104
97
|
}
|
|
105
98
|
return {
|
|
106
99
|
valid: true
|
|
107
100
|
};
|
|
108
101
|
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
return this.options.config?.defaultDatabaseConfig;
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* Get all options
|
|
116
|
-
*/ getOptions() {
|
|
117
|
-
return this.options;
|
|
118
|
-
}
|
|
119
|
-
/**
|
|
120
|
-
* Get default local storage base path
|
|
121
|
-
* Used for serving local files without database lookup
|
|
122
|
-
* Falls back to './uploads' if not configured
|
|
123
|
-
*/ getDefaultLocalStoragePath() {
|
|
124
|
-
// Check if localStoragePath is configured in module options
|
|
125
|
-
const configuredPath = this.options.config?.localStoragePath;
|
|
126
|
-
if (configuredPath) {
|
|
127
|
-
return configuredPath;
|
|
128
|
-
}
|
|
129
|
-
// Default to ./uploads in the project root
|
|
130
|
-
return './uploads';
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
|
-
* Get application base URL for generating file URLs
|
|
134
|
-
* - First tries module config
|
|
135
|
-
* - Falls back to APP_URL env var
|
|
136
|
-
* - Finally constructs from PORT env var
|
|
137
|
-
*/ getAppUrl() {
|
|
138
|
-
// Try from module config first
|
|
139
|
-
if (this.options.config?.appUrl) {
|
|
140
|
-
return this.options.config.appUrl;
|
|
141
|
-
}
|
|
142
|
-
// Fallback: read directly from environment
|
|
143
|
-
if (process.env.APP_URL) {
|
|
144
|
-
return process.env.APP_URL;
|
|
145
|
-
}
|
|
146
|
-
// Last resort: construct from PORT
|
|
147
|
-
const port = process.env.PORT || '3000';
|
|
148
|
-
return `http://localhost:${port}`;
|
|
102
|
+
// ─── Private Helpers ────────────────────────────────────────────────────────
|
|
103
|
+
toMB(bytes) {
|
|
104
|
+
return (bytes / BYTES_PER_MB).toFixed(2);
|
|
149
105
|
}
|
|
150
106
|
constructor(options){
|
|
151
107
|
_define_property(this, "options", void 0);
|
|
@@ -12,8 +12,7 @@ const _modules = require("@flusys/nestjs-shared/modules");
|
|
|
12
12
|
const _common = require("@nestjs/common");
|
|
13
13
|
const _core = require("@nestjs/core");
|
|
14
14
|
const _express = require("express");
|
|
15
|
-
const
|
|
16
|
-
const _storageconstants = require("../config/storage.constants");
|
|
15
|
+
const _storageconfigservice = require("./storage-config.service");
|
|
17
16
|
function _define_property(obj, key, value) {
|
|
18
17
|
if (key in obj) {
|
|
19
18
|
Object.defineProperty(obj, key, {
|
|
@@ -93,14 +92,11 @@ let StorageDataSourceProvider = class StorageDataSourceProvider extends _modules
|
|
|
93
92
|
};
|
|
94
93
|
}
|
|
95
94
|
// Feature Flags
|
|
96
|
-
/** Get global enable company feature flag */ getEnableCompanyFeature() {
|
|
97
|
-
return this.storageOptions.bootstrapAppConfig?.enableCompanyFeature ?? false;
|
|
98
|
-
}
|
|
99
95
|
/**
|
|
100
96
|
* Get enable company feature for specific tenant
|
|
101
97
|
* Falls back to global setting if not specified per-tenant
|
|
102
98
|
*/ getEnableCompanyFeatureForTenant(tenant) {
|
|
103
|
-
return tenant?.enableCompanyFeature ?? this.
|
|
99
|
+
return tenant?.enableCompanyFeature ?? this.configService.isCompanyFeatureEnabled();
|
|
104
100
|
}
|
|
105
101
|
/**
|
|
106
102
|
* Get enable company feature for current request context
|
|
@@ -113,22 +109,16 @@ let StorageDataSourceProvider = class StorageDataSourceProvider extends _modules
|
|
|
113
109
|
* For TypeORM repositories, we always use the base entities (FileManager, etc.)
|
|
114
110
|
* but for migrations, we need the correct entity based on the feature flag.
|
|
115
111
|
*/ async getStorageEntities(enableCompanyFeature) {
|
|
116
|
-
const enable = enableCompanyFeature ?? this.
|
|
117
|
-
const
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
];
|
|
127
|
-
}
|
|
128
|
-
return [
|
|
129
|
-
FileManager,
|
|
130
|
-
Folder,
|
|
131
|
-
StorageConfig
|
|
112
|
+
const enable = enableCompanyFeature ?? this.configService.isCompanyFeatureEnabled();
|
|
113
|
+
const entities = await Promise.resolve().then(()=>/*#__PURE__*/ _interop_require_wildcard(require("../entities")));
|
|
114
|
+
return enable ? [
|
|
115
|
+
entities.FileManagerWithCompany,
|
|
116
|
+
entities.FolderWithCompany,
|
|
117
|
+
entities.StorageConfigWithCompany
|
|
118
|
+
] : [
|
|
119
|
+
entities.FileManager,
|
|
120
|
+
entities.Folder,
|
|
121
|
+
entities.StorageConfig
|
|
132
122
|
];
|
|
133
123
|
}
|
|
134
124
|
// Overrides
|
|
@@ -189,8 +179,8 @@ let StorageDataSourceProvider = class StorageDataSourceProvider extends _modules
|
|
|
189
179
|
StorageDataSourceProvider.connectionLocks.delete(tenant.id);
|
|
190
180
|
}
|
|
191
181
|
}
|
|
192
|
-
constructor(
|
|
193
|
-
super(StorageDataSourceProvider.buildParentOptions(
|
|
182
|
+
constructor(configService, request){
|
|
183
|
+
super(StorageDataSourceProvider.buildParentOptions(configService.getOptions()), request), _define_property(this, "configService", void 0), _define_property(this, "logger", void 0), this.configService = configService, this.logger = new _common.Logger(StorageDataSourceProvider.name);
|
|
194
184
|
}
|
|
195
185
|
};
|
|
196
186
|
// Override parent's static properties to have Storage-specific cache
|
|
@@ -204,12 +194,12 @@ StorageDataSourceProvider = _ts_decorate([
|
|
|
204
194
|
(0, _common.Injectable)({
|
|
205
195
|
scope: _common.Scope.REQUEST
|
|
206
196
|
}),
|
|
207
|
-
_ts_param(0, (0, _common.Inject)(
|
|
197
|
+
_ts_param(0, (0, _common.Inject)(_storageconfigservice.StorageConfigService)),
|
|
208
198
|
_ts_param(1, (0, _common.Optional)()),
|
|
209
199
|
_ts_param(1, (0, _common.Inject)(_core.REQUEST)),
|
|
210
200
|
_ts_metadata("design:type", Function),
|
|
211
201
|
_ts_metadata("design:paramtypes", [
|
|
212
|
-
typeof
|
|
202
|
+
typeof _storageconfigservice.StorageConfigService === "undefined" ? Object : _storageconfigservice.StorageConfigService,
|
|
213
203
|
typeof _express.Request === "undefined" ? Object : _express.Request
|
|
214
204
|
])
|
|
215
205
|
], StorageDataSourceProvider);
|
|
@@ -10,8 +10,9 @@ Object.defineProperty(exports, "StorageProviderConfigService", {
|
|
|
10
10
|
});
|
|
11
11
|
const _classes = require("@flusys/nestjs-shared/classes");
|
|
12
12
|
const _modules = require("@flusys/nestjs-shared/modules");
|
|
13
|
+
const _utils = require("@flusys/nestjs-shared/utils");
|
|
13
14
|
const _common = require("@nestjs/common");
|
|
14
|
-
const
|
|
15
|
+
const _storageconfigservice = require("./storage-config.service");
|
|
15
16
|
const _entities = require("../entities");
|
|
16
17
|
const _storagedatasourceprovider = require("./storage-datasource.provider");
|
|
17
18
|
function _define_property(obj, key, value) {
|
|
@@ -48,16 +49,13 @@ let StorageProviderConfigService = class StorageProviderConfigService extends _c
|
|
|
48
49
|
getDataSourceProvider() {
|
|
49
50
|
return this.dataSourceProvider;
|
|
50
51
|
}
|
|
51
|
-
// Entity Conversion
|
|
52
52
|
async convertSingleDtoToEntity(dto, user) {
|
|
53
53
|
const entity = await super.convertSingleDtoToEntity(dto, user);
|
|
54
|
-
// Set companyId from user context if company feature enabled
|
|
55
54
|
if (this.storageConfig.isCompanyFeatureEnabled()) {
|
|
56
55
|
entity.companyId = user?.companyId ?? null;
|
|
57
56
|
}
|
|
58
57
|
return entity;
|
|
59
58
|
}
|
|
60
|
-
// Query Customization
|
|
61
59
|
async getSelectQuery(query, _user, select) {
|
|
62
60
|
if (!select?.length) {
|
|
63
61
|
select = [
|
|
@@ -82,19 +80,14 @@ let StorageProviderConfigService = class StorageProviderConfigService extends _c
|
|
|
82
80
|
}
|
|
83
81
|
async getExtraManipulateQuery(query, filterDto, user) {
|
|
84
82
|
const result = await super.getExtraManipulateQuery(query, filterDto, user);
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
}
|
|
83
|
+
(0, _utils.applyCompanyFilter)(query, {
|
|
84
|
+
isCompanyFeatureEnabled: this.storageConfig.isCompanyFeatureEnabled(),
|
|
85
|
+
entityAlias: 'storageConfig'
|
|
86
|
+
}, user);
|
|
90
87
|
query.orderBy(`${this.entityName}.createdAt`, 'DESC');
|
|
91
88
|
return result;
|
|
92
89
|
}
|
|
93
|
-
|
|
94
|
-
* Find storage config by ID without throwing (returns null if not found)
|
|
95
|
-
* Uses direct repository query - bypasses company filtering
|
|
96
|
-
* Use for internal operations like file deletion where config ID is already known
|
|
97
|
-
*/ async findByIdDirect(id) {
|
|
90
|
+
async findByIdDirect(id) {
|
|
98
91
|
await this.ensureRepositoryInitialized();
|
|
99
92
|
return await this.repository.findOne({
|
|
100
93
|
where: {
|
|
@@ -102,19 +95,11 @@ let StorageProviderConfigService = class StorageProviderConfigService extends _c
|
|
|
102
95
|
}
|
|
103
96
|
});
|
|
104
97
|
}
|
|
105
|
-
|
|
106
|
-
* Get default storage configuration (scoped to user's company if enabled)
|
|
107
|
-
* Priority: isDefault=true > any active config (oldest first)
|
|
108
|
-
*/ async getDefaultConfig(user) {
|
|
98
|
+
async getDefaultConfig(user) {
|
|
109
99
|
await this.ensureRepositoryInitialized();
|
|
110
|
-
const baseWhere = {
|
|
100
|
+
const baseWhere = (0, _utils.buildCompanyWhereCondition)({
|
|
111
101
|
isActive: true
|
|
112
|
-
};
|
|
113
|
-
// Filter by company only if company feature is enabled and user is provided
|
|
114
|
-
if (this.storageConfig.isCompanyFeatureEnabled() && user?.companyId) {
|
|
115
|
-
baseWhere.companyId = user.companyId;
|
|
116
|
-
}
|
|
117
|
-
// First try to find config marked as default
|
|
102
|
+
}, this.storageConfig.isCompanyFeatureEnabled(), user);
|
|
118
103
|
const defaultConfig = await this.repository.findOne({
|
|
119
104
|
where: {
|
|
120
105
|
...baseWhere,
|
|
@@ -127,7 +112,6 @@ let StorageProviderConfigService = class StorageProviderConfigService extends _c
|
|
|
127
112
|
if (defaultConfig) {
|
|
128
113
|
return defaultConfig;
|
|
129
114
|
}
|
|
130
|
-
// Fall back to any available active config (oldest first for consistency)
|
|
131
115
|
return await this.repository.findOne({
|
|
132
116
|
where: baseWhere,
|
|
133
117
|
order: {
|
|
@@ -135,18 +119,12 @@ let StorageProviderConfigService = class StorageProviderConfigService extends _c
|
|
|
135
119
|
}
|
|
136
120
|
});
|
|
137
121
|
}
|
|
138
|
-
|
|
139
|
-
* Get storage configuration by type (scoped to user's company if enabled)
|
|
140
|
-
*/ async getConfigByType(storage, user) {
|
|
122
|
+
async getConfigByType(storage, user) {
|
|
141
123
|
await this.ensureRepositoryInitialized();
|
|
142
|
-
const where = {
|
|
124
|
+
const where = (0, _utils.buildCompanyWhereCondition)({
|
|
143
125
|
storage,
|
|
144
126
|
isActive: true
|
|
145
|
-
};
|
|
146
|
-
// Filter by company only if company feature is enabled and user is provided
|
|
147
|
-
if (this.storageConfig.isCompanyFeatureEnabled() && user?.companyId) {
|
|
148
|
-
where.companyId = user.companyId;
|
|
149
|
-
}
|
|
127
|
+
}, this.storageConfig.isCompanyFeatureEnabled(), user);
|
|
150
128
|
return await this.repository.find({
|
|
151
129
|
where
|
|
152
130
|
});
|
|
@@ -161,13 +139,13 @@ StorageProviderConfigService = _ts_decorate([
|
|
|
161
139
|
}),
|
|
162
140
|
_ts_param(0, (0, _common.Inject)('CACHE_INSTANCE')),
|
|
163
141
|
_ts_param(1, (0, _common.Inject)(_modules.UtilsService)),
|
|
164
|
-
_ts_param(2, (0, _common.Inject)(
|
|
142
|
+
_ts_param(2, (0, _common.Inject)(_storageconfigservice.StorageConfigService)),
|
|
165
143
|
_ts_param(3, (0, _common.Inject)(_storagedatasourceprovider.StorageDataSourceProvider)),
|
|
166
144
|
_ts_metadata("design:type", Function),
|
|
167
145
|
_ts_metadata("design:paramtypes", [
|
|
168
146
|
typeof _classes.HybridCache === "undefined" ? Object : _classes.HybridCache,
|
|
169
147
|
typeof _modules.UtilsService === "undefined" ? Object : _modules.UtilsService,
|
|
170
|
-
typeof
|
|
148
|
+
typeof _storageconfigservice.StorageConfigService === "undefined" ? Object : _storageconfigservice.StorageConfigService,
|
|
171
149
|
typeof _storagedatasourceprovider.StorageDataSourceProvider === "undefined" ? Object : _storagedatasourceprovider.StorageDataSourceProvider
|
|
172
150
|
])
|
|
173
151
|
], StorageProviderConfigService);
|