@flusys/nestjs-storage 5.1.1 → 5.1.3

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.
@@ -1,3 +1,4 @@
1
+ /// <reference types="multer" />
1
2
  "use strict";
2
3
  Object.defineProperty(exports, "__esModule", {
3
4
  value: true
@@ -26,6 +26,7 @@ _export(exports, {
26
26
  }
27
27
  });
28
28
  const _swagger = require("@nestjs/swagger");
29
+ const _classtransformer = require("class-transformer");
29
30
  const _classvalidator = require("class-validator");
30
31
  const _enums = require("../enums");
31
32
  function _define_property(obj, key, value) {
@@ -164,44 +165,82 @@ let FileManagerResponseDto = class FileManagerResponseDto {
164
165
  }
165
166
  };
166
167
  _ts_decorate([
167
- (0, _swagger.ApiProperty)(),
168
+ (0, _classtransformer.Expose)(),
169
+ (0, _swagger.ApiProperty)({
170
+ description: 'Unique identifier of the file',
171
+ example: 'f2e9c8d0-7a2a-11eb-9439-0242ac130002'
172
+ }),
168
173
  _ts_metadata("design:type", String)
169
174
  ], FileManagerResponseDto.prototype, "id", void 0);
170
175
  _ts_decorate([
171
- (0, _swagger.ApiProperty)(),
176
+ (0, _classtransformer.Expose)(),
177
+ (0, _swagger.ApiProperty)({
178
+ description: 'Original filename as uploaded',
179
+ example: 'profile-photo.png'
180
+ }),
172
181
  _ts_metadata("design:type", String)
173
182
  ], FileManagerResponseDto.prototype, "name", void 0);
174
183
  _ts_decorate([
175
- (0, _swagger.ApiProperty)(),
184
+ (0, _classtransformer.Expose)(),
185
+ (0, _swagger.ApiProperty)({
186
+ description: 'Storage key / path used to retrieve the file from the provider',
187
+ example: 'uploads/users/abc123/profile-photo.png'
188
+ }),
176
189
  _ts_metadata("design:type", String)
177
190
  ], FileManagerResponseDto.prototype, "key", void 0);
178
191
  _ts_decorate([
179
- (0, _swagger.ApiProperty)(),
192
+ (0, _classtransformer.Expose)(),
193
+ (0, _swagger.ApiProperty)({
194
+ description: 'File size in bytes',
195
+ example: '204800'
196
+ }),
180
197
  _ts_metadata("design:type", String)
181
198
  ], FileManagerResponseDto.prototype, "size", void 0);
182
199
  _ts_decorate([
183
- (0, _swagger.ApiProperty)(),
200
+ (0, _classtransformer.Expose)(),
201
+ (0, _swagger.ApiProperty)({
202
+ description: 'MIME type of the file',
203
+ example: 'image/png'
204
+ }),
184
205
  _ts_metadata("design:type", String)
185
206
  ], FileManagerResponseDto.prototype, "contentType", void 0);
186
207
  _ts_decorate([
187
- (0, _swagger.ApiProperty)(),
208
+ (0, _classtransformer.Expose)(),
209
+ (0, _swagger.ApiProperty)({
210
+ description: 'Whether the file is private and requires signed URL access',
211
+ example: false
212
+ }),
188
213
  _ts_metadata("design:type", Boolean)
189
214
  ], FileManagerResponseDto.prototype, "isPrivate", void 0);
190
215
  _ts_decorate([
191
- (0, _swagger.ApiPropertyOptional)(),
216
+ (0, _classtransformer.Expose)(),
217
+ (0, _swagger.ApiPropertyOptional)({
218
+ description: 'ID of the folder this file belongs to; absent if in root',
219
+ example: 'a1b2c3d4-0000-0000-0000-000000000001'
220
+ }),
192
221
  _ts_metadata("design:type", String)
193
222
  ], FileManagerResponseDto.prototype, "folderId", void 0);
194
223
  _ts_decorate([
195
- (0, _swagger.ApiPropertyOptional)(),
224
+ (0, _classtransformer.Expose)(),
225
+ (0, _swagger.ApiPropertyOptional)({
226
+ description: 'ID of the storage configuration used to store this file',
227
+ example: 'a1b2c3d4-0000-0000-0000-000000000002'
228
+ }),
196
229
  _ts_metadata("design:type", String)
197
230
  ], FileManagerResponseDto.prototype, "storageConfigId", void 0);
198
231
  _ts_decorate([
199
- (0, _swagger.ApiPropertyOptional)(),
232
+ (0, _classtransformer.Expose)(),
233
+ (0, _swagger.ApiPropertyOptional)({
234
+ description: 'Storage provider type (e.g. s3, gcs, local)',
235
+ example: 's3'
236
+ }),
200
237
  _ts_metadata("design:type", String)
201
238
  ], FileManagerResponseDto.prototype, "location", void 0);
202
239
  _ts_decorate([
240
+ (0, _classtransformer.Expose)(),
203
241
  (0, _swagger.ApiPropertyOptional)({
204
- description: 'Name of the storage provider'
242
+ description: 'Human-readable name of the storage provider',
243
+ example: 'AWS S3 — Production Bucket'
205
244
  }),
206
245
  _ts_metadata("design:type", String)
207
246
  ], FileManagerResponseDto.prototype, "providerName", void 0);
@@ -212,6 +251,7 @@ let GetFilesRequestDto = class GetFilesRequestDto {
212
251
  };
213
252
  _ts_decorate([
214
253
  (0, _swagger.ApiProperty)({
254
+ description: 'Unique identifier of the file to retrieve',
215
255
  example: 'f2e9c8d0-7a2a-11eb-9439-0242ac130002'
216
256
  }),
217
257
  (0, _classvalidator.IsUUID)(),
@@ -230,36 +270,58 @@ let FilesResponseDto = class FilesResponseDto {
230
270
  }
231
271
  };
232
272
  _ts_decorate([
233
- (0, _swagger.ApiProperty)(),
273
+ (0, _classtransformer.Expose)(),
274
+ (0, _swagger.ApiProperty)({
275
+ description: 'Unique identifier of the file',
276
+ example: 'f2e9c8d0-7a2a-11eb-9439-0242ac130002'
277
+ }),
234
278
  _ts_metadata("design:type", String)
235
279
  ], FilesResponseDto.prototype, "id", void 0);
236
280
  _ts_decorate([
237
- (0, _swagger.ApiProperty)(),
281
+ (0, _classtransformer.Expose)(),
282
+ (0, _swagger.ApiProperty)({
283
+ description: 'Original filename as uploaded',
284
+ example: 'quarterly-report.pdf'
285
+ }),
238
286
  _ts_metadata("design:type", String)
239
287
  ], FilesResponseDto.prototype, "name", void 0);
240
288
  _ts_decorate([
241
- (0, _swagger.ApiProperty)(),
289
+ (0, _classtransformer.Expose)(),
290
+ (0, _swagger.ApiProperty)({
291
+ description: 'MIME type of the file',
292
+ example: 'application/pdf'
293
+ }),
242
294
  _ts_metadata("design:type", String)
243
295
  ], FilesResponseDto.prototype, "contentType", void 0);
244
296
  _ts_decorate([
245
- (0, _swagger.ApiProperty)(),
297
+ (0, _classtransformer.Expose)(),
298
+ (0, _swagger.ApiProperty)({
299
+ description: 'Publicly accessible or pre-signed URL to download the file',
300
+ example: 'https://cdn.example.com/uploads/quarterly-report.pdf'
301
+ }),
246
302
  _ts_metadata("design:type", String)
247
303
  ], FilesResponseDto.prototype, "url", void 0);
248
304
  _ts_decorate([
305
+ (0, _classtransformer.Expose)(),
249
306
  (0, _swagger.ApiPropertyOptional)({
250
- description: 'Storage provider type'
307
+ description: 'Storage provider type (e.g. s3, gcs, local)',
308
+ example: 'gcs'
251
309
  }),
252
310
  _ts_metadata("design:type", String)
253
311
  ], FilesResponseDto.prototype, "location", void 0);
254
312
  _ts_decorate([
313
+ (0, _classtransformer.Expose)(),
255
314
  (0, _swagger.ApiPropertyOptional)({
256
- description: 'Storage configuration ID'
315
+ description: 'ID of the storage configuration used to store this file',
316
+ example: 'a1b2c3d4-0000-0000-0000-000000000002'
257
317
  }),
258
318
  _ts_metadata("design:type", String)
259
319
  ], FilesResponseDto.prototype, "storageConfigId", void 0);
260
320
  _ts_decorate([
321
+ (0, _classtransformer.Expose)(),
261
322
  (0, _swagger.ApiPropertyOptional)({
262
- description: 'Name of the storage provider'
323
+ description: 'Human-readable name of the storage provider',
324
+ example: 'Google Cloud Storage — EU'
263
325
  }),
264
326
  _ts_metadata("design:type", String)
265
327
  ], FilesResponseDto.prototype, "providerName", void 0);
@@ -20,6 +20,7 @@ _export(exports, {
20
20
  }
21
21
  });
22
22
  const _swagger = require("@nestjs/swagger");
23
+ const _classtransformer = require("class-transformer");
23
24
  const _classvalidator = require("class-validator");
24
25
  function _define_property(obj, key, value) {
25
26
  if (key in obj) {
@@ -79,14 +80,26 @@ let FolderResponseDto = class FolderResponseDto {
79
80
  }
80
81
  };
81
82
  _ts_decorate([
82
- (0, _swagger.ApiProperty)(),
83
+ (0, _classtransformer.Expose)(),
84
+ (0, _swagger.ApiProperty)({
85
+ description: 'Unique identifier of the folder',
86
+ example: 'f2e9c8d0-7a2a-11eb-9439-0242ac130002'
87
+ }),
83
88
  _ts_metadata("design:type", String)
84
89
  ], FolderResponseDto.prototype, "id", void 0);
85
90
  _ts_decorate([
86
- (0, _swagger.ApiProperty)(),
91
+ (0, _classtransformer.Expose)(),
92
+ (0, _swagger.ApiProperty)({
93
+ description: 'Human-readable name of the folder',
94
+ example: 'Profile Photos'
95
+ }),
87
96
  _ts_metadata("design:type", String)
88
97
  ], FolderResponseDto.prototype, "name", void 0);
89
98
  _ts_decorate([
90
- (0, _swagger.ApiProperty)(),
99
+ (0, _classtransformer.Expose)(),
100
+ (0, _swagger.ApiProperty)({
101
+ description: 'URL-friendly unique identifier derived from the folder name',
102
+ example: 'profile-photos'
103
+ }),
91
104
  _ts_metadata("design:type", String)
92
105
  ], FolderResponseDto.prototype, "slug", void 0);
@@ -20,9 +20,10 @@ _export(exports, {
20
20
  }
21
21
  });
22
22
  const _dtos = require("@flusys/nestjs-shared/dtos");
23
- const _enums = require("../enums");
24
23
  const _swagger = require("@nestjs/swagger");
24
+ const _classtransformer = require("class-transformer");
25
25
  const _classvalidator = require("class-validator");
26
+ const _enums = require("../enums");
26
27
  function _define_property(obj, key, value) {
27
28
  if (key in obj) {
28
29
  Object.defineProperty(obj, key, {
@@ -121,3 +122,49 @@ let StorageConfigResponseDto = class StorageConfigResponseDto extends _dtos.Iden
121
122
  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);
122
123
  }
123
124
  };
125
+ _ts_decorate([
126
+ (0, _classtransformer.Expose)(),
127
+ (0, _swagger.ApiProperty)({
128
+ description: 'Human-readable name for this storage configuration',
129
+ example: 'AWS S3 — Production Bucket'
130
+ }),
131
+ _ts_metadata("design:type", String)
132
+ ], StorageConfigResponseDto.prototype, "name", void 0);
133
+ _ts_decorate([
134
+ (0, _classtransformer.Expose)(),
135
+ (0, _swagger.ApiProperty)({
136
+ description: 'Storage provider type',
137
+ example: 's3'
138
+ }),
139
+ _ts_metadata("design:type", String)
140
+ ], StorageConfigResponseDto.prototype, "storage", void 0);
141
+ _ts_decorate([
142
+ (0, _classtransformer.Expose)(),
143
+ (0, _swagger.ApiProperty)({
144
+ description: 'Provider-specific configuration key-value pairs',
145
+ type: 'object',
146
+ additionalProperties: true,
147
+ example: {
148
+ bucket: 'my-production-bucket',
149
+ region: 'us-east-1',
150
+ endpoint: 'https://s3.amazonaws.com'
151
+ }
152
+ }),
153
+ _ts_metadata("design:type", typeof Record === "undefined" ? Object : Record)
154
+ ], StorageConfigResponseDto.prototype, "config", void 0);
155
+ _ts_decorate([
156
+ (0, _classtransformer.Expose)(),
157
+ (0, _swagger.ApiProperty)({
158
+ description: 'Whether this storage configuration is currently active',
159
+ example: true
160
+ }),
161
+ _ts_metadata("design:type", Boolean)
162
+ ], StorageConfigResponseDto.prototype, "isActive", void 0);
163
+ _ts_decorate([
164
+ (0, _classtransformer.Expose)(),
165
+ (0, _swagger.ApiProperty)({
166
+ description: 'Whether this is the default storage configuration',
167
+ example: false
168
+ }),
169
+ _ts_metadata("design:type", Boolean)
170
+ ], StorageConfigResponseDto.prototype, "isDefault", void 0);
@@ -26,8 +26,8 @@ _export(exports, {
26
26
  }
27
27
  });
28
28
  const _swagger = require("@nestjs/swagger");
29
- const _classvalidator = require("class-validator");
30
29
  const _classtransformer = require("class-transformer");
30
+ const _classvalidator = require("class-validator");
31
31
  function _define_property(obj, key, value) {
32
32
  if (key in obj) {
33
33
  Object.defineProperty(obj, key, {
@@ -222,40 +222,51 @@ let FileUploadResponsePayloadDto = class FileUploadResponsePayloadDto {
222
222
  }
223
223
  };
224
224
  _ts_decorate([
225
+ (0, _classtransformer.Expose)(),
225
226
  (0, _swagger.ApiProperty)({
226
- example: 'file123.jpg'
227
+ description: 'Original filename of the uploaded file',
228
+ example: 'profile-photo.jpg'
227
229
  }),
228
230
  _ts_metadata("design:type", String)
229
231
  ], FileUploadResponsePayloadDto.prototype, "name", void 0);
230
232
  _ts_decorate([
233
+ (0, _classtransformer.Expose)(),
231
234
  (0, _swagger.ApiProperty)({
235
+ description: 'MIME type of the uploaded file',
232
236
  example: 'image/jpeg'
233
237
  }),
234
238
  _ts_metadata("design:type", String)
235
239
  ], FileUploadResponsePayloadDto.prototype, "contentType", void 0);
236
240
  _ts_decorate([
241
+ (0, _classtransformer.Expose)(),
237
242
  (0, _swagger.ApiProperty)({
238
- example: 2048
243
+ description: 'File size in bytes',
244
+ example: 204800,
245
+ minimum: 0
239
246
  }),
240
247
  _ts_metadata("design:type", Number)
241
248
  ], FileUploadResponsePayloadDto.prototype, "size", void 0);
242
249
  _ts_decorate([
250
+ (0, _classtransformer.Expose)(),
243
251
  (0, _swagger.ApiProperty)({
244
- example: 'uploads/file123.jpg'
252
+ description: 'Storage key / path used to retrieve the file from the provider',
253
+ example: 'uploads/users/abc123/profile-photo.jpg'
245
254
  }),
246
255
  _ts_metadata("design:type", String)
247
256
  ], FileUploadResponsePayloadDto.prototype, "key", void 0);
248
257
  _ts_decorate([
258
+ (0, _classtransformer.Expose)(),
249
259
  (0, _swagger.ApiProperty)({
250
- example: 'local',
251
- description: 'Storage provider type'
260
+ description: 'Storage provider type (e.g. s3, gcs, local)',
261
+ example: 's3'
252
262
  }),
253
263
  _ts_metadata("design:type", String)
254
264
  ], FileUploadResponsePayloadDto.prototype, "location", void 0);
255
265
  _ts_decorate([
266
+ (0, _classtransformer.Expose)(),
256
267
  (0, _swagger.ApiProperty)({
257
- example: '123e4567-e89b-12d3-a456-426614174000',
258
- description: 'Storage configuration ID'
268
+ description: 'ID of the storage configuration used to store this file',
269
+ example: '123e4567-e89b-12d3-a456-426614174000'
259
270
  }),
260
271
  _ts_metadata("design:type", String)
261
272
  ], FileUploadResponsePayloadDto.prototype, "storageConfigId", void 0);
@@ -103,13 +103,10 @@ const DEFAULT_SELECT_FIELDS = [
103
103
  'createdAt',
104
104
  'deletedAt'
105
105
  ];
106
- let FileManagerService = class FileManagerService extends _classes.RequestScopedApiService {
106
+ let FileManagerService = class FileManagerService extends _classes.ApiService {
107
107
  resolveEntity() {
108
108
  return this.storageConfig.isCompanyFeatureEnabled() ? _entities.FileManagerWithCompany : _entities.FileManager;
109
109
  }
110
- getDataSourceProvider() {
111
- return this.dataSourceProvider;
112
- }
113
110
  // ─── Override Methods ───────────────────────────────────────────────────────
114
111
  async convertSingleDtoToEntity(dto, user) {
115
112
  let entity = {};
@@ -196,7 +193,7 @@ let FileManagerService = class FileManagerService extends _classes.RequestScoped
196
193
  }
197
194
  // ─── Public Methods ─────────────────────────────────────────────────────────
198
195
  async getFiles(dtos, protocol, host, user) {
199
- await this.ensureRepositoryInitialized();
196
+ await this.ensureDataSourceRepository();
200
197
  const ids = dtos.map((d)=>d.id).filter(Boolean);
201
198
  if (!ids.length) throw new _common.BadRequestException({
202
199
  message: 'No valid file IDs provided',
@@ -364,7 +361,7 @@ let FileManagerService = class FileManagerService extends _classes.RequestScoped
364
361
  };
365
362
  }
366
363
  constructor(cacheManager, utilsService, uploadService, storageConfig, dataSourceProvider){
367
- super('file_manager', null, cacheManager, utilsService, FileManagerService.name, true, 'storage'), _define_property(this, "cacheManager", void 0), _define_property(this, "utilsService", void 0), _define_property(this, "uploadService", void 0), _define_property(this, "storageConfig", void 0), _define_property(this, "dataSourceProvider", void 0), this.cacheManager = cacheManager, this.utilsService = utilsService, this.uploadService = uploadService, this.storageConfig = storageConfig, this.dataSourceProvider = dataSourceProvider;
364
+ super('file_manager', cacheManager, utilsService, FileManagerService.name, true, 'storage', undefined, dataSourceProvider), _define_property(this, "cacheManager", void 0), _define_property(this, "utilsService", void 0), _define_property(this, "uploadService", void 0), _define_property(this, "storageConfig", void 0), _define_property(this, "dataSourceProvider", void 0), this.cacheManager = cacheManager, this.utilsService = utilsService, this.uploadService = uploadService, this.storageConfig = storageConfig, this.dataSourceProvider = dataSourceProvider;
368
365
  }
369
366
  };
370
367
  FileManagerService = _ts_decorate([
@@ -42,13 +42,10 @@ function _ts_param(paramIndex, decorator) {
42
42
  decorator(target, key, paramIndex);
43
43
  };
44
44
  }
45
- let FolderService = class FolderService extends _classes.RequestScopedApiService {
45
+ let FolderService = class FolderService extends _classes.ApiService {
46
46
  resolveEntity() {
47
47
  return this.storageConfig.isCompanyFeatureEnabled() ? _entities.FolderWithCompany : _entities.Folder;
48
48
  }
49
- getDataSourceProvider() {
50
- return this.dataSourceProvider;
51
- }
52
49
  // ─── Override Methods ───────────────────────────────────────────────────────
53
50
  async convertSingleDtoToEntity(dto, user) {
54
51
  const entity = await super.convertSingleDtoToEntity(dto, user);
@@ -85,7 +82,7 @@ let FolderService = class FolderService extends _classes.RequestScopedApiService
85
82
  return result;
86
83
  }
87
84
  constructor(cacheManager, utilsService, storageConfig, dataSourceProvider){
88
- super('folder', null, cacheManager, utilsService, FolderService.name, true, 'storage'), _define_property(this, "cacheManager", void 0), _define_property(this, "utilsService", void 0), _define_property(this, "storageConfig", void 0), _define_property(this, "dataSourceProvider", void 0), this.cacheManager = cacheManager, this.utilsService = utilsService, this.storageConfig = storageConfig, this.dataSourceProvider = dataSourceProvider;
85
+ super('folder', cacheManager, utilsService, FolderService.name, true, 'storage', undefined, dataSourceProvider), _define_property(this, "cacheManager", void 0), _define_property(this, "utilsService", void 0), _define_property(this, "storageConfig", void 0), this.cacheManager = cacheManager, this.utilsService = utilsService, this.storageConfig = storageConfig;
89
86
  }
90
87
  };
91
88
  FolderService = _ts_decorate([
@@ -8,7 +8,6 @@ Object.defineProperty(exports, "StorageDataSourceProvider", {
8
8
  return StorageDataSourceProvider;
9
9
  }
10
10
  });
11
- const _constants = require("@flusys/nestjs-shared/constants");
12
11
  const _modules = require("@flusys/nestjs-shared/modules");
13
12
  const _common = require("@nestjs/common");
14
13
  const _core = require("@nestjs/core");
@@ -83,8 +82,7 @@ function _ts_param(paramIndex, decorator) {
83
82
  };
84
83
  }
85
84
  let StorageDataSourceProvider = class StorageDataSourceProvider extends _modules.MultiTenantDataSourceService {
86
- // Factory Methods
87
- /** Build parent options from StorageModuleOptions */ static buildParentOptions(options) {
85
+ static buildParentOptions(options) {
88
86
  return {
89
87
  bootstrapAppConfig: options.bootstrapAppConfig,
90
88
  defaultDatabaseConfig: options.config?.defaultDatabaseConfig,
@@ -92,19 +90,10 @@ let StorageDataSourceProvider = class StorageDataSourceProvider extends _modules
92
90
  tenants: options.config?.tenants
93
91
  };
94
92
  }
95
- // Feature Flags
96
- /**
97
- * Get enable company feature for specific tenant
98
- * Falls back to global setting if not specified per-tenant
99
- */ getEnableCompanyFeatureForTenant(tenant) {
93
+ getEnableCompanyFeatureForTenant(tenant) {
100
94
  return tenant?.enableCompanyFeature ?? this.configService.isCompanyFeatureEnabled();
101
95
  }
102
- // Entity Management
103
- /**
104
- * Get storage entities for migrations based on company feature flag.
105
- * For TypeORM repositories, we always use the base entities (FileManager, etc.)
106
- * but for migrations, we need the correct entity based on the feature flag.
107
- */ async getStorageEntities(enableCompanyFeature) {
96
+ async getStorageEntities(enableCompanyFeature) {
108
97
  const enable = enableCompanyFeature ?? this.configService.isCompanyFeatureEnabled();
109
98
  const entities = await Promise.resolve().then(()=>/*#__PURE__*/ _interop_require_wildcard(require("../entities")));
110
99
  return enable ? [
@@ -117,72 +106,16 @@ let StorageDataSourceProvider = class StorageDataSourceProvider extends _modules
117
106
  entities.StorageConfig
118
107
  ];
119
108
  }
120
- // Overrides
121
- /** Override to dynamically set entities based on tenant config */ async createDataSourceFromConfig(config) {
109
+ async createDataSourceFromConfig(config) {
122
110
  const currentTenant = this.getCurrentTenant();
123
111
  const enableCompanyFeature = this.getEnableCompanyFeatureForTenant(currentTenant ?? undefined);
124
112
  const entities = await this.getStorageEntities(enableCompanyFeature);
125
113
  return super.createDataSourceFromConfig(config, entities);
126
114
  }
127
- /**
128
- * Override to use Storage-specific static cache
129
- */ async getSingleDataSource() {
130
- // Return existing initialized connection from Storage-specific cache
131
- if (StorageDataSourceProvider.singleDataSource?.isInitialized) {
132
- return StorageDataSourceProvider.singleDataSource;
133
- }
134
- // If another request is creating the connection, wait for it
135
- if (StorageDataSourceProvider.singleConnectionLock) {
136
- return StorageDataSourceProvider.singleConnectionLock;
137
- }
138
- const config = this.getDefaultDatabaseConfig();
139
- if (!config) {
140
- throw new _common.InternalServerErrorException({
141
- message: 'No database config available. Provide defaultDatabaseConfig or tenantDefaultDatabaseConfig.',
142
- messageKey: _constants.SYSTEM_MESSAGES.DATABASE_CONFIG_NOT_AVAILABLE
143
- });
144
- }
145
- // Create connection with lock to prevent race conditions
146
- const connectionPromise = this.createDataSourceFromConfig(config);
147
- StorageDataSourceProvider.singleConnectionLock = connectionPromise;
148
- try {
149
- const dataSource = await connectionPromise;
150
- StorageDataSourceProvider.singleDataSource = dataSource;
151
- return dataSource;
152
- } finally{
153
- StorageDataSourceProvider.singleConnectionLock = null;
154
- }
155
- }
156
- /**
157
- * Override to use Storage-specific static cache for tenant connections
158
- */ async getOrCreateTenantConnection(tenant) {
159
- // Return existing initialized connection from Storage-specific cache
160
- const existing = StorageDataSourceProvider.tenantConnections.get(tenant.id);
161
- if (existing?.isInitialized) {
162
- return existing;
163
- }
164
- // If another request is creating this tenant's connection, wait for it
165
- const pendingConnection = StorageDataSourceProvider.connectionLocks.get(tenant.id);
166
- if (pendingConnection) {
167
- return pendingConnection;
168
- }
169
- // Create connection with lock to prevent race conditions
170
- const config = this.buildTenantDatabaseConfig(tenant);
171
- const connectionPromise = this.createDataSourceFromConfig(config);
172
- StorageDataSourceProvider.connectionLocks.set(tenant.id, connectionPromise);
173
- try {
174
- const dataSource = await connectionPromise;
175
- StorageDataSourceProvider.tenantConnections.set(tenant.id, dataSource);
176
- return dataSource;
177
- } finally{
178
- StorageDataSourceProvider.connectionLocks.delete(tenant.id);
179
- }
180
- }
181
115
  constructor(configService, request){
182
116
  super(StorageDataSourceProvider.buildParentOptions(configService.getOptions()), request), _define_property(this, "configService", void 0), this.configService = configService;
183
117
  }
184
118
  };
185
- // Override parent's static properties to have Storage-specific cache
186
119
  _define_property(StorageDataSourceProvider, "tenantConnections", new Map());
187
120
  _define_property(StorageDataSourceProvider, "singleDataSource", null);
188
121
  _define_property(StorageDataSourceProvider, "tenantsRegistry", new Map());
@@ -42,13 +42,10 @@ function _ts_param(paramIndex, decorator) {
42
42
  decorator(target, key, paramIndex);
43
43
  };
44
44
  }
45
- let StorageProviderConfigService = class StorageProviderConfigService extends _classes.RequestScopedApiService {
45
+ let StorageProviderConfigService = class StorageProviderConfigService extends _classes.ApiService {
46
46
  resolveEntity() {
47
47
  return this.storageConfig.isCompanyFeatureEnabled() ? _entities.StorageConfigWithCompany : _entities.StorageConfig;
48
48
  }
49
- getDataSourceProvider() {
50
- return this.dataSourceProvider;
51
- }
52
49
  // ─── Override Methods ───────────────────────────────────────────────────────
53
50
  async convertSingleDtoToEntity(dto, user) {
54
51
  const entity = await super.convertSingleDtoToEntity(dto, user);
@@ -89,7 +86,7 @@ let StorageProviderConfigService = class StorageProviderConfigService extends _c
89
86
  return result;
90
87
  }
91
88
  async findByIdDirect(id) {
92
- await this.ensureRepositoryInitialized();
89
+ await this.ensureDataSourceRepository();
93
90
  return await this.repository.findOne({
94
91
  where: {
95
92
  id
@@ -97,7 +94,7 @@ let StorageProviderConfigService = class StorageProviderConfigService extends _c
97
94
  });
98
95
  }
99
96
  async getDefaultConfig(user) {
100
- await this.ensureRepositoryInitialized();
97
+ await this.ensureDataSourceRepository();
101
98
  const baseWhere = (0, _utils.buildCompanyWhereCondition)({
102
99
  isActive: true
103
100
  }, this.storageConfig.isCompanyFeatureEnabled(), user);
@@ -121,7 +118,7 @@ let StorageProviderConfigService = class StorageProviderConfigService extends _c
121
118
  });
122
119
  }
123
120
  async getConfigByType(storage, user) {
124
- await this.ensureRepositoryInitialized();
121
+ await this.ensureDataSourceRepository();
125
122
  const where = (0, _utils.buildCompanyWhereCondition)({
126
123
  storage,
127
124
  isActive: true
@@ -131,7 +128,7 @@ let StorageProviderConfigService = class StorageProviderConfigService extends _c
131
128
  });
132
129
  }
133
130
  constructor(cacheManager, utilsService, storageConfig, dataSourceProvider){
134
- super('storageConfig', null, cacheManager, utilsService, StorageProviderConfigService.name, true, 'storage'), _define_property(this, "cacheManager", void 0), _define_property(this, "utilsService", void 0), _define_property(this, "storageConfig", void 0), _define_property(this, "dataSourceProvider", void 0), this.cacheManager = cacheManager, this.utilsService = utilsService, this.storageConfig = storageConfig, this.dataSourceProvider = dataSourceProvider;
131
+ super('storageConfig', cacheManager, utilsService, StorageProviderConfigService.name, true, 'storage', undefined, dataSourceProvider), _define_property(this, "cacheManager", void 0), _define_property(this, "utilsService", void 0), _define_property(this, "storageConfig", void 0), this.cacheManager = cacheManager, this.utilsService = utilsService, this.storageConfig = storageConfig;
135
132
  }
136
133
  };
137
134
  StorageProviderConfigService = _ts_decorate([
@@ -4,19 +4,19 @@ import { CreateFileManagerDto, FileManagerResponseDto, FilesResponseDto, GetFile
4
4
  import { Request } from 'express';
5
5
  import { FileManagerService } from '../services/file-manager.service';
6
6
  declare const FileManagerController_base: abstract new (service: FileManagerService) => {
7
- readonly enabledEndpoints: import("@flusys/nestjs-shared/classes").ApiEndpoint[] | "all";
7
+ readonly enabledEndpoints: import("@flusys/nestjs-shared").ApiEndpoint[] | "all";
8
8
  service: FileManagerService;
9
- isEnabled(endpoint: import("@flusys/nestjs-shared/classes").ApiEndpoint): boolean;
9
+ isEnabled(endpoint: import("@flusys/nestjs-shared").ApiEndpoint): boolean;
10
10
  insert(addDto: CreateFileManagerDto, user: ILoggedUserInfo | null): Promise<SingleResponseDto<FileManagerResponseDto>>;
11
- insertMany(addDto: CreateFileManagerDto[], user: ILoggedUserInfo | null): Promise<import("@flusys/nestjs-shared/dtos").BulkResponseDto<FileManagerResponseDto>>;
12
- getById(id: string, body: import("@flusys/nestjs-shared/dtos").GetByIdBodyDto, user: ILoggedUserInfo | null): Promise<SingleResponseDto<FileManagerResponseDto>>;
13
- getByIds(body: import("@flusys/nestjs-shared/dtos").GetByIdsDto, user: ILoggedUserInfo | null): Promise<import("@flusys/nestjs-shared/dtos").ListResponseDto<FileManagerResponseDto>>;
11
+ insertMany(addDto: CreateFileManagerDto[], user: ILoggedUserInfo | null): Promise<import("@flusys/nestjs-shared").BulkResponseDto<FileManagerResponseDto>>;
12
+ getById(id: string, body: import("@flusys/nestjs-shared").GetByIdBodyDto, user: ILoggedUserInfo | null): Promise<SingleResponseDto<FileManagerResponseDto>>;
13
+ getByIds(body: import("@flusys/nestjs-shared").GetByIdsDto, user: ILoggedUserInfo | null): Promise<import("@flusys/nestjs-shared").ListResponseDto<FileManagerResponseDto>>;
14
14
  update(updateDto: UpdateFileManagerDto, user: ILoggedUserInfo | null): Promise<SingleResponseDto<FileManagerResponseDto>>;
15
- updateMany(updateDtos: UpdateFileManagerDto[], user: ILoggedUserInfo | null): Promise<import("@flusys/nestjs-shared/dtos").BulkResponseDto<FileManagerResponseDto>>;
16
- bulkUpsert(dtos: (CreateFileManagerDto | UpdateFileManagerDto)[], user: ILoggedUserInfo | null): Promise<import("@flusys/nestjs-shared/dtos").BulkResponseDto<FileManagerResponseDto>>;
15
+ updateMany(updateDtos: UpdateFileManagerDto[], user: ILoggedUserInfo | null): Promise<import("@flusys/nestjs-shared").BulkResponseDto<FileManagerResponseDto>>;
16
+ bulkUpsert(dtos: (CreateFileManagerDto | UpdateFileManagerDto)[], user: ILoggedUserInfo | null): Promise<import("@flusys/nestjs-shared").BulkResponseDto<FileManagerResponseDto>>;
17
17
  getByFilter(filter: Record<string, any>, user: ILoggedUserInfo | null): Promise<SingleResponseDto<FileManagerResponseDto>>;
18
- getAll(filterAndPaginationDto: import("@flusys/nestjs-shared/dtos").FilterAndPaginationDto, user: ILoggedUserInfo | null, search?: string): Promise<import("@flusys/nestjs-shared/dtos").ListResponseDto<FileManagerResponseDto>>;
19
- delete(deleteDto: import("@flusys/nestjs-shared/dtos").DeleteDto, user: ILoggedUserInfo | null): Promise<import("@flusys/nestjs-shared/dtos").MessageResponseDto>;
18
+ getAll(filterAndPaginationDto: import("@flusys/nestjs-shared").FilterAndPaginationDto, user: ILoggedUserInfo | null, search?: string): Promise<import("@flusys/nestjs-shared").ListResponseDto<FileManagerResponseDto>>;
19
+ delete(deleteDto: import("@flusys/nestjs-shared").DeleteDto, user: ILoggedUserInfo | null): Promise<import("@flusys/nestjs-shared").MessageResponseDto>;
20
20
  };
21
21
  export declare class FileManagerController extends FileManagerController_base {
22
22
  protected fileService: FileManagerService;
@@ -1,9 +1,9 @@
1
1
  import { CreateFolderDto, FolderResponseDto, UpdateFolderDto } from '../dtos';
2
2
  import { FolderService } from '../services/folder.service';
3
3
  declare const FolderController_base: abstract new (service: FolderService) => {
4
- readonly enabledEndpoints: import("@flusys/nestjs-shared/classes").ApiEndpoint[] | "all";
4
+ readonly enabledEndpoints: import("@flusys/nestjs-shared").ApiEndpoint[] | "all";
5
5
  service: FolderService;
6
- isEnabled(endpoint: import("@flusys/nestjs-shared/classes").ApiEndpoint): boolean;
6
+ isEnabled(endpoint: import("@flusys/nestjs-shared").ApiEndpoint): boolean;
7
7
  insert(addDto: CreateFolderDto, user: import("@flusys/nestjs-shared").ILoggedUserInfo | null): Promise<import("@flusys/nestjs-shared").SingleResponseDto<FolderResponseDto>>;
8
8
  insertMany(addDto: CreateFolderDto[], user: import("@flusys/nestjs-shared").ILoggedUserInfo | null): Promise<import("@flusys/nestjs-shared").BulkResponseDto<FolderResponseDto>>;
9
9
  getById(id: string, body: import("@flusys/nestjs-shared").GetByIdBodyDto, user: import("@flusys/nestjs-shared").ILoggedUserInfo | null): Promise<import("@flusys/nestjs-shared").SingleResponseDto<FolderResponseDto>>;
@@ -1,9 +1,9 @@
1
1
  import { CreateStorageConfigDto, StorageConfigResponseDto, UpdateStorageConfigDto } from '../dtos';
2
2
  import { StorageProviderConfigService } from '../services/storage-provider-config.service';
3
3
  declare const StorageConfigController_base: abstract new (service: StorageProviderConfigService) => {
4
- readonly enabledEndpoints: import("@flusys/nestjs-shared/classes").ApiEndpoint[] | "all";
4
+ readonly enabledEndpoints: import("@flusys/nestjs-shared").ApiEndpoint[] | "all";
5
5
  service: StorageProviderConfigService;
6
- isEnabled(endpoint: import("@flusys/nestjs-shared/classes").ApiEndpoint): boolean;
6
+ isEnabled(endpoint: import("@flusys/nestjs-shared").ApiEndpoint): boolean;
7
7
  insert(addDto: CreateStorageConfigDto, user: import("@flusys/nestjs-shared").ILoggedUserInfo | null): Promise<import("@flusys/nestjs-shared").SingleResponseDto<StorageConfigResponseDto>>;
8
8
  insertMany(addDto: CreateStorageConfigDto[], user: import("@flusys/nestjs-shared").ILoggedUserInfo | null): Promise<import("@flusys/nestjs-shared").BulkResponseDto<StorageConfigResponseDto>>;
9
9
  getById(id: string, body: import("@flusys/nestjs-shared").GetByIdBodyDto, user: import("@flusys/nestjs-shared").ILoggedUserInfo | null): Promise<import("@flusys/nestjs-shared").SingleResponseDto<StorageConfigResponseDto>>;
@@ -25,6 +25,7 @@ function _ts_param(paramIndex, decorator) {
25
25
  decorator(target, key, paramIndex);
26
26
  };
27
27
  }
28
+ /// <reference types="multer" />
28
29
  import { UPLOAD_CONFIG_PERMISSIONS } from '@flusys/nestjs-shared';
29
30
  import { ApiResponseDto, CurrentUser, RequirePermission } from '@flusys/nestjs-shared/decorators';
30
31
  import { JwtAuthGuard, PermissionGuard } from '@flusys/nestjs-shared/guards';