@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.
- package/cjs/controllers/upload.controller.js +1 -0
- package/cjs/dtos/file-manager.dto.js +79 -17
- package/cjs/dtos/folder.dto.js +16 -3
- package/cjs/dtos/storage-config.dto.js +48 -1
- package/cjs/dtos/upload.dto.js +19 -8
- package/cjs/services/file-manager.service.js +3 -6
- package/cjs/services/folder.service.js +2 -5
- package/cjs/services/storage-datasource.provider.js +4 -71
- package/cjs/services/storage-provider-config.service.js +5 -8
- package/controllers/file-manager.controller.d.ts +9 -9
- package/controllers/folder.controller.d.ts +2 -2
- package/controllers/storage-config.controller.d.ts +2 -2
- package/fesm/controllers/upload.controller.js +1 -0
- package/fesm/dtos/file-manager.dto.js +79 -17
- package/fesm/dtos/folder.dto.js +16 -3
- package/fesm/dtos/storage-config.dto.js +48 -1
- package/fesm/dtos/upload.dto.js +19 -8
- package/fesm/services/file-manager.service.js +4 -7
- package/fesm/services/folder.service.js +3 -6
- package/fesm/services/storage-datasource.provider.js +5 -72
- package/fesm/services/storage-provider-config.service.js +6 -9
- package/package.json +20 -20
- package/services/file-manager.service.d.ts +2 -3
- package/services/folder.service.d.ts +2 -4
- package/services/storage-datasource.provider.d.ts +0 -2
- package/services/storage-provider-config.service.d.ts +2 -4
|
@@ -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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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: '
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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: '
|
|
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: '
|
|
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);
|
package/cjs/dtos/folder.dto.js
CHANGED
|
@@ -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,
|
|
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,
|
|
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,
|
|
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);
|
package/cjs/dtos/upload.dto.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
251
|
-
|
|
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
|
-
|
|
258
|
-
|
|
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.
|
|
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.
|
|
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',
|
|
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.
|
|
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',
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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',
|
|
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
|
|
7
|
+
readonly enabledEndpoints: import("@flusys/nestjs-shared").ApiEndpoint[] | "all";
|
|
8
8
|
service: FileManagerService;
|
|
9
|
-
isEnabled(endpoint: import("@flusys/nestjs-shared
|
|
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
|
|
12
|
-
getById(id: string, body: import("@flusys/nestjs-shared
|
|
13
|
-
getByIds(body: import("@flusys/nestjs-shared
|
|
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
|
|
16
|
-
bulkUpsert(dtos: (CreateFileManagerDto | UpdateFileManagerDto)[], user: ILoggedUserInfo | null): Promise<import("@flusys/nestjs-shared
|
|
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
|
|
19
|
-
delete(deleteDto: import("@flusys/nestjs-shared
|
|
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
|
|
4
|
+
readonly enabledEndpoints: import("@flusys/nestjs-shared").ApiEndpoint[] | "all";
|
|
5
5
|
service: FolderService;
|
|
6
|
-
isEnabled(endpoint: import("@flusys/nestjs-shared
|
|
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
|
|
4
|
+
readonly enabledEndpoints: import("@flusys/nestjs-shared").ApiEndpoint[] | "all";
|
|
5
5
|
service: StorageProviderConfigService;
|
|
6
|
-
isEnabled(endpoint: import("@flusys/nestjs-shared
|
|
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';
|