@flusys/nestjs-storage 7.1.0 → 8.0.0-beta.1
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/config/index.d.ts +3 -3
- package/controllers/file-manager.controller.d.ts +4 -4
- package/controllers/folder.controller.d.ts +2 -2
- package/controllers/index.d.ts +4 -4
- package/controllers/storage-config.controller.d.ts +2 -2
- package/controllers/upload.controller.d.ts +3 -3
- package/docs/index.d.ts +1 -1
- package/docs/storage-swagger.config.d.ts +2 -2
- package/dtos/index.d.ts +4 -4
- package/entities/file-manager-with-company.entity.d.ts +2 -2
- package/entities/file-manager.entity.d.ts +1 -1
- package/entities/folder-with-company.entity.d.ts +1 -1
- package/entities/index.d.ts +15 -15
- package/entities/storage-config-with-company.entity.d.ts +1 -1
- package/enums/index.d.ts +1 -1
- package/fesm/493.js +2768 -0
- package/fesm/537.js +1157 -0
- package/fesm/562.js +786 -0
- package/fesm/{providers/azure-provider.optional.js → chunks/190.js} +33 -30
- package/fesm/chunks/252.js +12 -0
- package/fesm/chunks/327.js +12 -0
- package/fesm/chunks/385.js +12 -0
- package/fesm/{providers/s3-provider.optional.js → chunks/591.js} +37 -34
- package/fesm/chunks/746.js +12 -0
- package/fesm/chunks/798.js +12 -0
- package/fesm/{providers/sftp-provider.optional.js → chunks/918.js} +35 -31
- package/fesm/config/index.js +119 -3
- package/fesm/controllers/index.js +16 -4
- package/fesm/docs/index.js +206 -1
- package/fesm/dtos/index.js +879 -4
- package/fesm/entities/index.js +463 -18
- package/fesm/enums/index.js +36 -1
- package/fesm/index.js +398 -12
- package/fesm/interfaces/index.js +19 -5
- package/fesm/modules/index.js +16 -1
- package/fesm/providers/index.js +364 -3
- package/fesm/runtime.js +252 -0
- package/fesm/services/index.js +16 -6
- package/fesm/utils/index.js +149 -1
- package/index.d.ts +11 -11
- package/interfaces/file-manager.interface.d.ts +1 -1
- package/interfaces/folder.interface.d.ts +1 -1
- package/interfaces/index.d.ts +5 -5
- package/interfaces/storage-config.interface.d.ts +1 -1
- package/interfaces/storage-module-options.interface.d.ts +3 -3
- package/interfaces/storage-provider.interface.d.ts +1 -1
- package/middlewares/file-serve.middleware.d.ts +4 -3
- package/middlewares/index.d.ts +1 -1
- package/modules/index.d.ts +1 -1
- package/modules/storage.module.d.ts +2 -2
- package/package.json +30 -41
- package/providers/azure-provider.optional.d.ts +2 -2
- package/providers/index.d.ts +3 -3
- package/providers/local-provider.d.ts +2 -2
- package/providers/s3-provider.optional.d.ts +2 -2
- package/providers/sftp-provider.optional.d.ts +2 -2
- package/providers/storage-factory.service.d.ts +3 -3
- package/providers/storage-provider.registry.d.ts +2 -2
- package/services/file-manager.service.d.ts +9 -8
- package/services/folder.service.d.ts +6 -6
- package/services/index.d.ts +6 -6
- package/services/storage-config.service.d.ts +3 -3
- package/services/storage-datasource.provider.d.ts +3 -3
- package/services/storage-provider-config.service.d.ts +7 -7
- package/services/upload.service.d.ts +6 -6
- package/utils/image-compressor.util.d.ts +1 -1
- package/utils/index.d.ts +1 -1
- package/cjs/config/event-actions.js +0 -34
- package/cjs/config/index.js +0 -20
- package/cjs/config/message-keys.js +0 -46
- package/cjs/config/storage.constants.js +0 -28
- package/cjs/controllers/file-manager.controller.js +0 -152
- package/cjs/controllers/file-manager.controller.spec.js +0 -135
- package/cjs/controllers/folder.controller.js +0 -102
- package/cjs/controllers/folder.controller.spec.js +0 -86
- package/cjs/controllers/index.js +0 -21
- package/cjs/controllers/storage-config.controller.js +0 -102
- package/cjs/controllers/storage-config.controller.spec.js +0 -85
- package/cjs/controllers/upload.controller.js +0 -234
- package/cjs/controllers/upload.controller.spec.js +0 -132
- package/cjs/docs/index.js +0 -11
- package/cjs/docs/storage-swagger.config.js +0 -188
- package/cjs/docs/storage-swagger.config.spec.js +0 -72
- package/cjs/dtos/file-manager.dto.js +0 -327
- package/cjs/dtos/folder.dto.js +0 -105
- package/cjs/dtos/index.js +0 -21
- package/cjs/dtos/storage-config.dto.js +0 -170
- package/cjs/dtos/upload.dto.js +0 -272
- package/cjs/entities/file-manager-with-company.entity.js +0 -61
- package/cjs/entities/file-manager.entity.js +0 -122
- package/cjs/entities/folder-with-company.entity.js +0 -55
- package/cjs/entities/folder.entity.js +0 -64
- package/cjs/entities/index.js +0 -63
- package/cjs/entities/index.spec.js +0 -18
- package/cjs/entities/storage-config-with-company.entity.js +0 -51
- package/cjs/entities/storage-config.entity.js +0 -96
- package/cjs/enums/file-location.enum.js +0 -17
- package/cjs/enums/index.js +0 -18
- package/cjs/index.js +0 -29
- package/cjs/interfaces/file-manager.interface.js +0 -4
- package/cjs/interfaces/folder.interface.js +0 -4
- package/cjs/interfaces/index.js +0 -22
- package/cjs/interfaces/storage-config.interface.js +0 -4
- package/cjs/interfaces/storage-module-options.interface.js +0 -4
- package/cjs/interfaces/storage-provider.interface.js +0 -4
- package/cjs/middlewares/file-serve.middleware.js +0 -241
- package/cjs/middlewares/file-serve.middleware.spec.js +0 -211
- package/cjs/middlewares/index.js +0 -18
- package/cjs/modules/index.js +0 -18
- package/cjs/modules/storage.module.js +0 -165
- package/cjs/modules/storage.module.spec.js +0 -184
- package/cjs/providers/azure-provider.optional.js +0 -155
- package/cjs/providers/azure-provider.optional.spec.js +0 -228
- package/cjs/providers/index.js +0 -26
- package/cjs/providers/local-provider.js +0 -230
- package/cjs/providers/local-provider.spec.js +0 -239
- package/cjs/providers/s3-provider.optional.js +0 -175
- package/cjs/providers/s3-provider.optional.spec.js +0 -243
- package/cjs/providers/sftp-provider.optional.js +0 -203
- package/cjs/providers/sftp-provider.optional.spec.js +0 -217
- package/cjs/providers/storage-factory.service.js +0 -175
- package/cjs/providers/storage-factory.service.spec.js +0 -253
- package/cjs/providers/storage-provider.registry.js +0 -41
- package/cjs/providers/storage-provider.registry.spec.js +0 -67
- package/cjs/services/file-manager.service.js +0 -387
- package/cjs/services/file-manager.service.spec.js +0 -580
- package/cjs/services/folder.service.js +0 -101
- package/cjs/services/folder.service.spec.js +0 -167
- package/cjs/services/index.js +0 -23
- package/cjs/services/storage-config.service.js +0 -129
- package/cjs/services/storage-config.service.spec.js +0 -257
- package/cjs/services/storage-datasource.provider.js +0 -137
- package/cjs/services/storage-datasource.provider.spec.js +0 -217
- package/cjs/services/storage-provider-config.service.js +0 -171
- package/cjs/services/storage-provider-config.service.spec.js +0 -265
- package/cjs/services/upload.service.js +0 -376
- package/cjs/services/upload.service.spec.js +0 -426
- package/cjs/utils/file-validator.util.js +0 -440
- package/cjs/utils/file-validator.util.spec.js +0 -259
- package/cjs/utils/image-compressor.util.js +0 -162
- package/cjs/utils/image-compressor.util.spec.js +0 -166
- package/cjs/utils/index.js +0 -18
- package/fesm/config/event-actions.js +0 -13
- package/fesm/config/message-keys.js +0 -22
- package/fesm/config/storage.constants.js +0 -7
- package/fesm/controllers/file-manager.controller.js +0 -142
- package/fesm/controllers/file-manager.controller.spec.js +0 -131
- package/fesm/controllers/folder.controller.js +0 -92
- package/fesm/controllers/folder.controller.spec.js +0 -82
- package/fesm/controllers/storage-config.controller.js +0 -92
- package/fesm/controllers/storage-config.controller.spec.js +0 -81
- package/fesm/controllers/upload.controller.js +0 -224
- package/fesm/controllers/upload.controller.spec.js +0 -128
- package/fesm/docs/storage-swagger.config.js +0 -181
- package/fesm/docs/storage-swagger.config.spec.js +0 -68
- package/fesm/dtos/file-manager.dto.js +0 -300
- package/fesm/dtos/folder.dto.js +0 -84
- package/fesm/dtos/storage-config.dto.js +0 -149
- package/fesm/dtos/upload.dto.js +0 -245
- package/fesm/entities/file-manager-with-company.entity.js +0 -51
- package/fesm/entities/file-manager.entity.js +0 -112
- package/fesm/entities/folder-with-company.entity.js +0 -45
- package/fesm/entities/folder.entity.js +0 -54
- package/fesm/entities/index.spec.js +0 -14
- package/fesm/entities/storage-config-with-company.entity.js +0 -41
- package/fesm/entities/storage-config.entity.js +0 -86
- package/fesm/enums/file-location.enum.js +0 -7
- package/fesm/interfaces/file-manager.interface.js +0 -1
- package/fesm/interfaces/folder.interface.js +0 -1
- package/fesm/interfaces/storage-config.interface.js +0 -1
- package/fesm/interfaces/storage-module-options.interface.js +0 -3
- package/fesm/interfaces/storage-provider.interface.js +0 -4
- package/fesm/middlewares/file-serve.middleware.js +0 -190
- package/fesm/middlewares/file-serve.middleware.spec.js +0 -207
- package/fesm/middlewares/index.js +0 -1
- package/fesm/modules/storage.module.js +0 -156
- package/fesm/modules/storage.module.spec.js +0 -180
- package/fesm/providers/azure-provider.optional.spec.js +0 -224
- package/fesm/providers/local-provider.js +0 -182
- package/fesm/providers/local-provider.spec.js +0 -194
- package/fesm/providers/s3-provider.optional.spec.js +0 -239
- package/fesm/providers/sftp-provider.optional.spec.js +0 -213
- package/fesm/providers/storage-factory.service.js +0 -124
- package/fesm/providers/storage-factory.service.spec.js +0 -249
- package/fesm/providers/storage-provider.registry.js +0 -34
- package/fesm/providers/storage-provider.registry.spec.js +0 -63
- package/fesm/services/file-manager.service.js +0 -336
- package/fesm/services/file-manager.service.spec.js +0 -576
- package/fesm/services/folder.service.js +0 -91
- package/fesm/services/folder.service.spec.js +0 -163
- package/fesm/services/storage-config.service.js +0 -119
- package/fesm/services/storage-config.service.spec.js +0 -253
- package/fesm/services/storage-datasource.provider.js +0 -86
- package/fesm/services/storage-datasource.provider.spec.js +0 -172
- package/fesm/services/storage-provider-config.service.js +0 -161
- package/fesm/services/storage-provider-config.service.spec.js +0 -261
- package/fesm/services/upload.service.js +0 -366
- package/fesm/services/upload.service.spec.js +0 -422
- package/fesm/utils/file-validator.util.js +0 -433
- package/fesm/utils/file-validator.util.spec.js +0 -255
- package/fesm/utils/image-compressor.util.js +0 -114
- package/fesm/utils/image-compressor.util.spec.js +0 -162
|
@@ -1,175 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
Object.defineProperty(exports, "StorageFactoryService", {
|
|
6
|
-
enumerable: true,
|
|
7
|
-
get: function() {
|
|
8
|
-
return StorageFactoryService;
|
|
9
|
-
}
|
|
10
|
-
});
|
|
11
|
-
const _constants = require("@flusys/nestjs-shared/constants");
|
|
12
|
-
const _common = require("@nestjs/common");
|
|
13
|
-
const _crypto = /*#__PURE__*/ _interop_require_wildcard(require("crypto"));
|
|
14
|
-
const _services = require("../services");
|
|
15
|
-
const _storageproviderregistry = require("./storage-provider.registry");
|
|
16
|
-
function _define_property(obj, key, value) {
|
|
17
|
-
if (key in obj) {
|
|
18
|
-
Object.defineProperty(obj, key, {
|
|
19
|
-
value: value,
|
|
20
|
-
enumerable: true,
|
|
21
|
-
configurable: true,
|
|
22
|
-
writable: true
|
|
23
|
-
});
|
|
24
|
-
} else {
|
|
25
|
-
obj[key] = value;
|
|
26
|
-
}
|
|
27
|
-
return obj;
|
|
28
|
-
}
|
|
29
|
-
function _getRequireWildcardCache(nodeInterop) {
|
|
30
|
-
if (typeof WeakMap !== "function") return null;
|
|
31
|
-
var cacheBabelInterop = new WeakMap();
|
|
32
|
-
var cacheNodeInterop = new WeakMap();
|
|
33
|
-
return (_getRequireWildcardCache = function(nodeInterop) {
|
|
34
|
-
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
|
35
|
-
})(nodeInterop);
|
|
36
|
-
}
|
|
37
|
-
function _interop_require_wildcard(obj, nodeInterop) {
|
|
38
|
-
if (!nodeInterop && obj && obj.__esModule) {
|
|
39
|
-
return obj;
|
|
40
|
-
}
|
|
41
|
-
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
|
|
42
|
-
return {
|
|
43
|
-
default: obj
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
var cache = _getRequireWildcardCache(nodeInterop);
|
|
47
|
-
if (cache && cache.has(obj)) {
|
|
48
|
-
return cache.get(obj);
|
|
49
|
-
}
|
|
50
|
-
var newObj = {
|
|
51
|
-
__proto__: null
|
|
52
|
-
};
|
|
53
|
-
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
54
|
-
for(var key in obj){
|
|
55
|
-
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
56
|
-
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
|
|
57
|
-
if (desc && (desc.get || desc.set)) {
|
|
58
|
-
Object.defineProperty(newObj, key, desc);
|
|
59
|
-
} else {
|
|
60
|
-
newObj[key] = obj[key];
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
newObj.default = obj;
|
|
65
|
-
if (cache) {
|
|
66
|
-
cache.set(obj, newObj);
|
|
67
|
-
}
|
|
68
|
-
return newObj;
|
|
69
|
-
}
|
|
70
|
-
function _ts_decorate(decorators, target, key, desc) {
|
|
71
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
72
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
73
|
-
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
74
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
75
|
-
}
|
|
76
|
-
function _ts_metadata(k, v) {
|
|
77
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
78
|
-
}
|
|
79
|
-
function _ts_param(paramIndex, decorator) {
|
|
80
|
-
return function(target, key) {
|
|
81
|
-
decorator(target, key, paramIndex);
|
|
82
|
-
};
|
|
83
|
-
}
|
|
84
|
-
let StorageFactoryService = class StorageFactoryService {
|
|
85
|
-
async createProvider(config) {
|
|
86
|
-
const cacheKey = this.generateCacheKey(config);
|
|
87
|
-
const cached = this.cache.get(cacheKey);
|
|
88
|
-
if (cached) return cached;
|
|
89
|
-
const ProviderClass = _storageproviderregistry.StorageProviderRegistry.get(config.provider);
|
|
90
|
-
if (!ProviderClass) {
|
|
91
|
-
throw new _common.NotFoundException({
|
|
92
|
-
message: `Storage provider '${config.provider}' not available. Available: ${_storageproviderregistry.StorageProviderRegistry.getAll().join(', ')}`,
|
|
93
|
-
messageKey: _constants.SYSTEM_MESSAGES.SERVICE_NOT_AVAILABLE,
|
|
94
|
-
messageVariables: {
|
|
95
|
-
provider: config.provider,
|
|
96
|
-
available: _storageproviderregistry.StorageProviderRegistry.getAll().join(', ')
|
|
97
|
-
}
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
try {
|
|
101
|
-
const instance = new ProviderClass();
|
|
102
|
-
await this.initializeProvider(instance, config);
|
|
103
|
-
this.cache.set(cacheKey, instance);
|
|
104
|
-
return instance;
|
|
105
|
-
} catch (error) {
|
|
106
|
-
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
107
|
-
throw new _common.InternalServerErrorException({
|
|
108
|
-
message: `Failed to initialize '${config.provider}': ${errorMessage}`,
|
|
109
|
-
messageKey: _constants.SYSTEM_MESSAGES.INTERNAL_ERROR,
|
|
110
|
-
messageVariables: {
|
|
111
|
-
provider: config.provider,
|
|
112
|
-
error: errorMessage
|
|
113
|
-
}
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
async getProvider(providerName) {
|
|
118
|
-
const cachedKey = Array.from(this.cache.keys()).find((k)=>k.startsWith(providerName));
|
|
119
|
-
if (cachedKey) return this.cache.get(cachedKey);
|
|
120
|
-
return this.createProvider({
|
|
121
|
-
provider: providerName,
|
|
122
|
-
config: {}
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
getLocalProviderBasePath() {
|
|
126
|
-
const localKey = Array.from(this.cache.keys()).find((k)=>k.startsWith('local'));
|
|
127
|
-
const provider = localKey ? this.cache.get(localKey) : null;
|
|
128
|
-
return provider && 'basePath' in provider ? provider.basePath : null;
|
|
129
|
-
}
|
|
130
|
-
clearCache() {
|
|
131
|
-
this.cache.clear();
|
|
132
|
-
}
|
|
133
|
-
async onModuleDestroy() {
|
|
134
|
-
const closePromises = Array.from(this.cache.entries()).filter(([, p])=>'close' in p && typeof p.close === 'function').map(([, p])=>p.close().catch(()=>{}));
|
|
135
|
-
await Promise.allSettled(closePromises);
|
|
136
|
-
this.cache.clear();
|
|
137
|
-
}
|
|
138
|
-
// ─── Private Helpers ──────────────────────────────────────────────────────────
|
|
139
|
-
generateCacheKey(config) {
|
|
140
|
-
const sortedKeys = Object.keys(config.config || {}).sort();
|
|
141
|
-
const hash = _crypto.createHash('sha256').update(JSON.stringify(config.config, sortedKeys)).digest('hex').substring(0, 16);
|
|
142
|
-
return `${config.provider}-${hash}`;
|
|
143
|
-
}
|
|
144
|
-
async initializeProvider(instance, config) {
|
|
145
|
-
if (!('initialize' in instance) || typeof instance.initialize !== 'function') {
|
|
146
|
-
return;
|
|
147
|
-
}
|
|
148
|
-
let initConfig = config.config;
|
|
149
|
-
// Inject appUrl as baseUrl fallback for local provider
|
|
150
|
-
if (config.provider === 'local' && !config.config?.baseUrl) {
|
|
151
|
-
const appUrl = this.configService.getAppUrl();
|
|
152
|
-
if (appUrl) {
|
|
153
|
-
initConfig = {
|
|
154
|
-
...config.config,
|
|
155
|
-
baseUrl: appUrl
|
|
156
|
-
};
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
await instance.initialize(initConfig);
|
|
160
|
-
}
|
|
161
|
-
constructor(configService){
|
|
162
|
-
_define_property(this, "configService", void 0);
|
|
163
|
-
_define_property(this, "cache", void 0);
|
|
164
|
-
this.configService = configService;
|
|
165
|
-
this.cache = new Map();
|
|
166
|
-
}
|
|
167
|
-
};
|
|
168
|
-
StorageFactoryService = _ts_decorate([
|
|
169
|
-
(0, _common.Injectable)(),
|
|
170
|
-
_ts_param(0, (0, _common.Inject)(_services.StorageConfigService)),
|
|
171
|
-
_ts_metadata("design:type", Function),
|
|
172
|
-
_ts_metadata("design:paramtypes", [
|
|
173
|
-
typeof _services.StorageConfigService === "undefined" ? Object : _services.StorageConfigService
|
|
174
|
-
])
|
|
175
|
-
], StorageFactoryService);
|
|
@@ -1,253 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
const _common = require("@nestjs/common");
|
|
6
|
-
const _storagefactoryservice = require("./storage-factory.service");
|
|
7
|
-
const _storageproviderregistry = require("./storage-provider.registry");
|
|
8
|
-
function _define_property(obj, key, value) {
|
|
9
|
-
if (key in obj) {
|
|
10
|
-
Object.defineProperty(obj, key, {
|
|
11
|
-
value: value,
|
|
12
|
-
enumerable: true,
|
|
13
|
-
configurable: true,
|
|
14
|
-
writable: true
|
|
15
|
-
});
|
|
16
|
-
} else {
|
|
17
|
-
obj[key] = value;
|
|
18
|
-
}
|
|
19
|
-
return obj;
|
|
20
|
-
}
|
|
21
|
-
let FakeProvider = class FakeProvider {
|
|
22
|
-
async initialize(config) {
|
|
23
|
-
this.initializeCalledWith = config;
|
|
24
|
-
this.basePath = config?.basePath;
|
|
25
|
-
}
|
|
26
|
-
async uploadFile() {
|
|
27
|
-
return {};
|
|
28
|
-
}
|
|
29
|
-
async uploadMultipleFiles() {
|
|
30
|
-
return [];
|
|
31
|
-
}
|
|
32
|
-
async deleteFile() {}
|
|
33
|
-
async deleteMultipleFiles() {}
|
|
34
|
-
async generatePresignedUrl() {
|
|
35
|
-
return '';
|
|
36
|
-
}
|
|
37
|
-
async healthCheck() {
|
|
38
|
-
return true;
|
|
39
|
-
}
|
|
40
|
-
constructor(){
|
|
41
|
-
_define_property(this, "initializeCalledWith", undefined);
|
|
42
|
-
_define_property(this, "basePath", void 0);
|
|
43
|
-
_define_property(this, "close", jest.fn().mockResolvedValue(undefined));
|
|
44
|
-
}
|
|
45
|
-
};
|
|
46
|
-
let NoInitProvider = class NoInitProvider {
|
|
47
|
-
async uploadFile() {
|
|
48
|
-
return {};
|
|
49
|
-
}
|
|
50
|
-
async uploadMultipleFiles() {
|
|
51
|
-
return [];
|
|
52
|
-
}
|
|
53
|
-
async deleteFile() {}
|
|
54
|
-
async deleteMultipleFiles() {}
|
|
55
|
-
async generatePresignedUrl() {
|
|
56
|
-
return '';
|
|
57
|
-
}
|
|
58
|
-
async healthCheck() {
|
|
59
|
-
return true;
|
|
60
|
-
}
|
|
61
|
-
};
|
|
62
|
-
describe('StorageFactoryService', ()=>{
|
|
63
|
-
let service;
|
|
64
|
-
let mockConfigService;
|
|
65
|
-
beforeEach(()=>{
|
|
66
|
-
_storageproviderregistry.StorageProviderRegistry.clear();
|
|
67
|
-
_storageproviderregistry.StorageProviderRegistry.register('fake', FakeProvider);
|
|
68
|
-
_storageproviderregistry.StorageProviderRegistry.register('local', FakeProvider);
|
|
69
|
-
_storageproviderregistry.StorageProviderRegistry.register('noinit', NoInitProvider);
|
|
70
|
-
mockConfigService = {
|
|
71
|
-
getAppUrl: jest.fn().mockReturnValue('http://localhost:2002')
|
|
72
|
-
};
|
|
73
|
-
service = new _storagefactoryservice.StorageFactoryService(mockConfigService);
|
|
74
|
-
});
|
|
75
|
-
afterEach(()=>{
|
|
76
|
-
_storageproviderregistry.StorageProviderRegistry.clear();
|
|
77
|
-
});
|
|
78
|
-
describe('createProvider', ()=>{
|
|
79
|
-
it('creates and initializes a provider instance from the registry', async ()=>{
|
|
80
|
-
const provider = await service.createProvider({
|
|
81
|
-
provider: 'fake',
|
|
82
|
-
config: {
|
|
83
|
-
bucket: 'x'
|
|
84
|
-
}
|
|
85
|
-
});
|
|
86
|
-
expect(provider).toBeInstanceOf(FakeProvider);
|
|
87
|
-
expect(provider.initializeCalledWith).toEqual({
|
|
88
|
-
bucket: 'x'
|
|
89
|
-
});
|
|
90
|
-
});
|
|
91
|
-
it('caches providers by a hash of their config and reuses the cached instance', async ()=>{
|
|
92
|
-
const config = {
|
|
93
|
-
provider: 'fake',
|
|
94
|
-
config: {
|
|
95
|
-
bucket: 'x'
|
|
96
|
-
}
|
|
97
|
-
};
|
|
98
|
-
const first = await service.createProvider(config);
|
|
99
|
-
const second = await service.createProvider(config);
|
|
100
|
-
expect(first).toBe(second);
|
|
101
|
-
});
|
|
102
|
-
it('creates distinct instances for different configs of the same provider', async ()=>{
|
|
103
|
-
const first = await service.createProvider({
|
|
104
|
-
provider: 'fake',
|
|
105
|
-
config: {
|
|
106
|
-
bucket: 'a'
|
|
107
|
-
}
|
|
108
|
-
});
|
|
109
|
-
const second = await service.createProvider({
|
|
110
|
-
provider: 'fake',
|
|
111
|
-
config: {
|
|
112
|
-
bucket: 'b'
|
|
113
|
-
}
|
|
114
|
-
});
|
|
115
|
-
expect(first).not.toBe(second);
|
|
116
|
-
});
|
|
117
|
-
it('throws NotFoundException when the requested provider is not registered', async ()=>{
|
|
118
|
-
await expect(service.createProvider({
|
|
119
|
-
provider: 'unregistered',
|
|
120
|
-
config: {}
|
|
121
|
-
})).rejects.toThrow(_common.NotFoundException);
|
|
122
|
-
});
|
|
123
|
-
it('skips calling initialize() when the provider does not implement it', async ()=>{
|
|
124
|
-
const provider = await service.createProvider({
|
|
125
|
-
provider: 'noinit',
|
|
126
|
-
config: {}
|
|
127
|
-
});
|
|
128
|
-
expect(provider).toBeInstanceOf(NoInitProvider);
|
|
129
|
-
});
|
|
130
|
-
it('wraps unexpected initialization errors in InternalServerErrorException', async ()=>{
|
|
131
|
-
let ThrowingProvider = class ThrowingProvider {
|
|
132
|
-
async initialize() {
|
|
133
|
-
throw new Error('connection refused');
|
|
134
|
-
}
|
|
135
|
-
async uploadFile() {
|
|
136
|
-
return {};
|
|
137
|
-
}
|
|
138
|
-
async uploadMultipleFiles() {
|
|
139
|
-
return [];
|
|
140
|
-
}
|
|
141
|
-
async deleteFile() {}
|
|
142
|
-
async deleteMultipleFiles() {}
|
|
143
|
-
async generatePresignedUrl() {
|
|
144
|
-
return '';
|
|
145
|
-
}
|
|
146
|
-
async healthCheck() {
|
|
147
|
-
return true;
|
|
148
|
-
}
|
|
149
|
-
};
|
|
150
|
-
_storageproviderregistry.StorageProviderRegistry.register('throwing', ThrowingProvider);
|
|
151
|
-
await expect(service.createProvider({
|
|
152
|
-
provider: 'throwing',
|
|
153
|
-
config: {}
|
|
154
|
-
})).rejects.toThrow(_common.InternalServerErrorException);
|
|
155
|
-
});
|
|
156
|
-
it('injects appUrl as baseUrl fallback for the local provider when not explicitly configured', async ()=>{
|
|
157
|
-
const provider = await service.createProvider({
|
|
158
|
-
provider: 'local',
|
|
159
|
-
config: {
|
|
160
|
-
basePath: './uploads'
|
|
161
|
-
}
|
|
162
|
-
});
|
|
163
|
-
expect(provider.initializeCalledWith).toEqual({
|
|
164
|
-
basePath: './uploads',
|
|
165
|
-
baseUrl: 'http://localhost:2002'
|
|
166
|
-
});
|
|
167
|
-
});
|
|
168
|
-
it('does not override an explicitly configured baseUrl for the local provider', async ()=>{
|
|
169
|
-
const provider = await service.createProvider({
|
|
170
|
-
provider: 'local',
|
|
171
|
-
config: {
|
|
172
|
-
basePath: './uploads',
|
|
173
|
-
baseUrl: 'https://cdn.example.com'
|
|
174
|
-
}
|
|
175
|
-
});
|
|
176
|
-
expect(provider.initializeCalledWith.baseUrl).toBe('https://cdn.example.com');
|
|
177
|
-
});
|
|
178
|
-
});
|
|
179
|
-
describe('getProvider', ()=>{
|
|
180
|
-
it('returns a cached provider whose cache key starts with the given name', async ()=>{
|
|
181
|
-
const created = await service.createProvider({
|
|
182
|
-
provider: 'fake',
|
|
183
|
-
config: {
|
|
184
|
-
bucket: 'x'
|
|
185
|
-
}
|
|
186
|
-
});
|
|
187
|
-
const result = await service.getProvider('fake');
|
|
188
|
-
expect(result).toBe(created);
|
|
189
|
-
});
|
|
190
|
-
it('creates a new provider with empty config if none is cached yet', async ()=>{
|
|
191
|
-
const result = await service.getProvider('fake');
|
|
192
|
-
expect(result).toBeInstanceOf(FakeProvider);
|
|
193
|
-
});
|
|
194
|
-
});
|
|
195
|
-
describe('getLocalProviderBasePath', ()=>{
|
|
196
|
-
it('returns null when no local provider has been created yet', ()=>{
|
|
197
|
-
expect(service.getLocalProviderBasePath()).toBeNull();
|
|
198
|
-
});
|
|
199
|
-
it("returns the cached local provider's basePath", async ()=>{
|
|
200
|
-
await service.createProvider({
|
|
201
|
-
provider: 'local',
|
|
202
|
-
config: {
|
|
203
|
-
basePath: './my-uploads'
|
|
204
|
-
}
|
|
205
|
-
});
|
|
206
|
-
expect(service.getLocalProviderBasePath()).toBe('./my-uploads');
|
|
207
|
-
});
|
|
208
|
-
});
|
|
209
|
-
describe('clearCache', ()=>{
|
|
210
|
-
it('empties the provider cache', async ()=>{
|
|
211
|
-
await service.createProvider({
|
|
212
|
-
provider: 'fake',
|
|
213
|
-
config: {
|
|
214
|
-
bucket: 'x'
|
|
215
|
-
}
|
|
216
|
-
});
|
|
217
|
-
service.clearCache();
|
|
218
|
-
expect(service.getLocalProviderBasePath()).toBeNull();
|
|
219
|
-
});
|
|
220
|
-
});
|
|
221
|
-
describe('onModuleDestroy', ()=>{
|
|
222
|
-
it('calls close() on cached providers that implement it', async ()=>{
|
|
223
|
-
const provider = await service.createProvider({
|
|
224
|
-
provider: 'fake',
|
|
225
|
-
config: {
|
|
226
|
-
bucket: 'x'
|
|
227
|
-
}
|
|
228
|
-
});
|
|
229
|
-
await service.onModuleDestroy();
|
|
230
|
-
expect(provider.close).toHaveBeenCalled();
|
|
231
|
-
});
|
|
232
|
-
it('does not throw when a provider close() call rejects', async ()=>{
|
|
233
|
-
const provider = await service.createProvider({
|
|
234
|
-
provider: 'fake',
|
|
235
|
-
config: {
|
|
236
|
-
bucket: 'y'
|
|
237
|
-
}
|
|
238
|
-
});
|
|
239
|
-
provider.close.mockRejectedValue(new Error('close failed'));
|
|
240
|
-
await expect(service.onModuleDestroy()).resolves.toBeUndefined();
|
|
241
|
-
});
|
|
242
|
-
it('clears the cache after destroy', async ()=>{
|
|
243
|
-
await service.createProvider({
|
|
244
|
-
provider: 'fake',
|
|
245
|
-
config: {
|
|
246
|
-
bucket: 'x'
|
|
247
|
-
}
|
|
248
|
-
});
|
|
249
|
-
await service.onModuleDestroy();
|
|
250
|
-
expect(service.getLocalProviderBasePath()).toBeNull();
|
|
251
|
-
});
|
|
252
|
-
});
|
|
253
|
-
});
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
Object.defineProperty(exports, "StorageProviderRegistry", {
|
|
6
|
-
enumerable: true,
|
|
7
|
-
get: function() {
|
|
8
|
-
return StorageProviderRegistry;
|
|
9
|
-
}
|
|
10
|
-
});
|
|
11
|
-
function _define_property(obj, key, value) {
|
|
12
|
-
if (key in obj) {
|
|
13
|
-
Object.defineProperty(obj, key, {
|
|
14
|
-
value: value,
|
|
15
|
-
enumerable: true,
|
|
16
|
-
configurable: true,
|
|
17
|
-
writable: true
|
|
18
|
-
});
|
|
19
|
-
} else {
|
|
20
|
-
obj[key] = value;
|
|
21
|
-
}
|
|
22
|
-
return obj;
|
|
23
|
-
}
|
|
24
|
-
let StorageProviderRegistry = class StorageProviderRegistry {
|
|
25
|
-
static register(name, providerClass) {
|
|
26
|
-
this.providers.set(name.toLowerCase(), providerClass);
|
|
27
|
-
}
|
|
28
|
-
static get(name) {
|
|
29
|
-
return this.providers.get(name.toLowerCase());
|
|
30
|
-
}
|
|
31
|
-
static has(name) {
|
|
32
|
-
return this.providers.has(name.toLowerCase());
|
|
33
|
-
}
|
|
34
|
-
static getAll() {
|
|
35
|
-
return Array.from(this.providers.keys());
|
|
36
|
-
}
|
|
37
|
-
static clear() {
|
|
38
|
-
this.providers.clear();
|
|
39
|
-
}
|
|
40
|
-
};
|
|
41
|
-
_define_property(StorageProviderRegistry, "providers", new Map());
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
const _storageproviderregistry = require("./storage-provider.registry");
|
|
6
|
-
let FakeProvider = class FakeProvider {
|
|
7
|
-
async uploadFile() {
|
|
8
|
-
return {};
|
|
9
|
-
}
|
|
10
|
-
async uploadMultipleFiles() {
|
|
11
|
-
return [];
|
|
12
|
-
}
|
|
13
|
-
async deleteFile() {}
|
|
14
|
-
async deleteMultipleFiles() {}
|
|
15
|
-
async generatePresignedUrl() {
|
|
16
|
-
return '';
|
|
17
|
-
}
|
|
18
|
-
async healthCheck() {
|
|
19
|
-
return true;
|
|
20
|
-
}
|
|
21
|
-
};
|
|
22
|
-
let AnotherFakeProvider = class AnotherFakeProvider extends FakeProvider {
|
|
23
|
-
};
|
|
24
|
-
describe('StorageProviderRegistry', ()=>{
|
|
25
|
-
afterEach(()=>{
|
|
26
|
-
_storageproviderregistry.StorageProviderRegistry.clear();
|
|
27
|
-
});
|
|
28
|
-
it('registers and retrieves a provider by name', ()=>{
|
|
29
|
-
_storageproviderregistry.StorageProviderRegistry.register('local', FakeProvider);
|
|
30
|
-
expect(_storageproviderregistry.StorageProviderRegistry.get('local')).toBe(FakeProvider);
|
|
31
|
-
});
|
|
32
|
-
it('normalizes provider names to lowercase on register and lookup', ()=>{
|
|
33
|
-
_storageproviderregistry.StorageProviderRegistry.register('LOCAL', FakeProvider);
|
|
34
|
-
expect(_storageproviderregistry.StorageProviderRegistry.get('local')).toBe(FakeProvider);
|
|
35
|
-
expect(_storageproviderregistry.StorageProviderRegistry.has('Local')).toBe(true);
|
|
36
|
-
});
|
|
37
|
-
it('returns undefined for a provider that was never registered', ()=>{
|
|
38
|
-
expect(_storageproviderregistry.StorageProviderRegistry.get('nonexistent')).toBeUndefined();
|
|
39
|
-
});
|
|
40
|
-
it('has() reports false for an unregistered provider', ()=>{
|
|
41
|
-
expect(_storageproviderregistry.StorageProviderRegistry.has('s3')).toBe(false);
|
|
42
|
-
});
|
|
43
|
-
it('has() reports true once a provider is registered', ()=>{
|
|
44
|
-
_storageproviderregistry.StorageProviderRegistry.register('s3', FakeProvider);
|
|
45
|
-
expect(_storageproviderregistry.StorageProviderRegistry.has('s3')).toBe(true);
|
|
46
|
-
});
|
|
47
|
-
it('getAll() lists every registered provider name', ()=>{
|
|
48
|
-
_storageproviderregistry.StorageProviderRegistry.register('local', FakeProvider);
|
|
49
|
-
_storageproviderregistry.StorageProviderRegistry.register('s3', AnotherFakeProvider);
|
|
50
|
-
expect(_storageproviderregistry.StorageProviderRegistry.getAll().sort()).toEqual([
|
|
51
|
-
'local',
|
|
52
|
-
's3'
|
|
53
|
-
]);
|
|
54
|
-
});
|
|
55
|
-
it('overwrites an existing registration when registering the same name again', ()=>{
|
|
56
|
-
_storageproviderregistry.StorageProviderRegistry.register('local', FakeProvider);
|
|
57
|
-
_storageproviderregistry.StorageProviderRegistry.register('local', AnotherFakeProvider);
|
|
58
|
-
expect(_storageproviderregistry.StorageProviderRegistry.get('local')).toBe(AnotherFakeProvider);
|
|
59
|
-
});
|
|
60
|
-
it('clear() removes all registered providers', ()=>{
|
|
61
|
-
_storageproviderregistry.StorageProviderRegistry.register('local', FakeProvider);
|
|
62
|
-
_storageproviderregistry.StorageProviderRegistry.register('s3', AnotherFakeProvider);
|
|
63
|
-
_storageproviderregistry.StorageProviderRegistry.clear();
|
|
64
|
-
expect(_storageproviderregistry.StorageProviderRegistry.getAll()).toEqual([]);
|
|
65
|
-
expect(_storageproviderregistry.StorageProviderRegistry.has('local')).toBe(false);
|
|
66
|
-
});
|
|
67
|
-
});
|