@flusys/nestjs-storage 7.1.0 → 8.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. package/config/index.d.ts +3 -3
  2. package/controllers/file-manager.controller.d.ts +4 -4
  3. package/controllers/folder.controller.d.ts +2 -2
  4. package/controllers/index.d.ts +4 -4
  5. package/controllers/storage-config.controller.d.ts +2 -2
  6. package/controllers/upload.controller.d.ts +3 -3
  7. package/docs/index.d.ts +1 -1
  8. package/docs/storage-swagger.config.d.ts +2 -2
  9. package/dtos/index.d.ts +4 -4
  10. package/entities/file-manager-with-company.entity.d.ts +2 -2
  11. package/entities/file-manager.entity.d.ts +1 -1
  12. package/entities/folder-with-company.entity.d.ts +1 -1
  13. package/entities/index.d.ts +15 -15
  14. package/entities/storage-config-with-company.entity.d.ts +1 -1
  15. package/enums/index.d.ts +1 -1
  16. package/fesm/493.js +2768 -0
  17. package/fesm/537.js +1157 -0
  18. package/fesm/562.js +786 -0
  19. package/fesm/{providers/azure-provider.optional.js → chunks/190.js} +33 -30
  20. package/fesm/chunks/252.js +12 -0
  21. package/fesm/chunks/327.js +12 -0
  22. package/fesm/chunks/385.js +12 -0
  23. package/fesm/{providers/s3-provider.optional.js → chunks/591.js} +37 -34
  24. package/fesm/chunks/746.js +12 -0
  25. package/fesm/chunks/798.js +12 -0
  26. package/fesm/{providers/sftp-provider.optional.js → chunks/918.js} +35 -31
  27. package/fesm/config/index.js +119 -3
  28. package/fesm/controllers/index.js +16 -4
  29. package/fesm/docs/index.js +206 -1
  30. package/fesm/dtos/index.js +879 -4
  31. package/fesm/entities/index.js +463 -18
  32. package/fesm/enums/index.js +36 -1
  33. package/fesm/index.js +398 -12
  34. package/fesm/interfaces/index.js +19 -5
  35. package/fesm/modules/index.js +16 -1
  36. package/fesm/providers/index.js +364 -3
  37. package/fesm/runtime.js +252 -0
  38. package/fesm/services/index.js +16 -6
  39. package/fesm/utils/index.js +149 -1
  40. package/index.d.ts +11 -11
  41. package/interfaces/file-manager.interface.d.ts +1 -1
  42. package/interfaces/folder.interface.d.ts +1 -1
  43. package/interfaces/index.d.ts +5 -5
  44. package/interfaces/storage-config.interface.d.ts +1 -1
  45. package/interfaces/storage-module-options.interface.d.ts +3 -3
  46. package/interfaces/storage-provider.interface.d.ts +1 -1
  47. package/middlewares/file-serve.middleware.d.ts +4 -3
  48. package/middlewares/index.d.ts +1 -1
  49. package/modules/index.d.ts +1 -1
  50. package/modules/storage.module.d.ts +2 -2
  51. package/package.json +30 -41
  52. package/providers/azure-provider.optional.d.ts +2 -2
  53. package/providers/index.d.ts +3 -3
  54. package/providers/local-provider.d.ts +2 -2
  55. package/providers/s3-provider.optional.d.ts +2 -2
  56. package/providers/sftp-provider.optional.d.ts +2 -2
  57. package/providers/storage-factory.service.d.ts +3 -3
  58. package/providers/storage-provider.registry.d.ts +2 -2
  59. package/services/file-manager.service.d.ts +9 -8
  60. package/services/folder.service.d.ts +6 -6
  61. package/services/index.d.ts +6 -6
  62. package/services/storage-config.service.d.ts +3 -3
  63. package/services/storage-datasource.provider.d.ts +3 -3
  64. package/services/storage-provider-config.service.d.ts +7 -7
  65. package/services/upload.service.d.ts +6 -6
  66. package/utils/image-compressor.util.d.ts +1 -1
  67. package/utils/index.d.ts +1 -1
  68. package/cjs/config/event-actions.js +0 -34
  69. package/cjs/config/index.js +0 -20
  70. package/cjs/config/message-keys.js +0 -46
  71. package/cjs/config/storage.constants.js +0 -28
  72. package/cjs/controllers/file-manager.controller.js +0 -152
  73. package/cjs/controllers/file-manager.controller.spec.js +0 -135
  74. package/cjs/controllers/folder.controller.js +0 -102
  75. package/cjs/controllers/folder.controller.spec.js +0 -86
  76. package/cjs/controllers/index.js +0 -21
  77. package/cjs/controllers/storage-config.controller.js +0 -102
  78. package/cjs/controllers/storage-config.controller.spec.js +0 -85
  79. package/cjs/controllers/upload.controller.js +0 -234
  80. package/cjs/controllers/upload.controller.spec.js +0 -132
  81. package/cjs/docs/index.js +0 -11
  82. package/cjs/docs/storage-swagger.config.js +0 -188
  83. package/cjs/docs/storage-swagger.config.spec.js +0 -72
  84. package/cjs/dtos/file-manager.dto.js +0 -327
  85. package/cjs/dtos/folder.dto.js +0 -105
  86. package/cjs/dtos/index.js +0 -21
  87. package/cjs/dtos/storage-config.dto.js +0 -170
  88. package/cjs/dtos/upload.dto.js +0 -272
  89. package/cjs/entities/file-manager-with-company.entity.js +0 -61
  90. package/cjs/entities/file-manager.entity.js +0 -122
  91. package/cjs/entities/folder-with-company.entity.js +0 -55
  92. package/cjs/entities/folder.entity.js +0 -64
  93. package/cjs/entities/index.js +0 -63
  94. package/cjs/entities/index.spec.js +0 -18
  95. package/cjs/entities/storage-config-with-company.entity.js +0 -51
  96. package/cjs/entities/storage-config.entity.js +0 -96
  97. package/cjs/enums/file-location.enum.js +0 -17
  98. package/cjs/enums/index.js +0 -18
  99. package/cjs/index.js +0 -29
  100. package/cjs/interfaces/file-manager.interface.js +0 -4
  101. package/cjs/interfaces/folder.interface.js +0 -4
  102. package/cjs/interfaces/index.js +0 -22
  103. package/cjs/interfaces/storage-config.interface.js +0 -4
  104. package/cjs/interfaces/storage-module-options.interface.js +0 -4
  105. package/cjs/interfaces/storage-provider.interface.js +0 -4
  106. package/cjs/middlewares/file-serve.middleware.js +0 -241
  107. package/cjs/middlewares/file-serve.middleware.spec.js +0 -211
  108. package/cjs/middlewares/index.js +0 -18
  109. package/cjs/modules/index.js +0 -18
  110. package/cjs/modules/storage.module.js +0 -165
  111. package/cjs/modules/storage.module.spec.js +0 -184
  112. package/cjs/providers/azure-provider.optional.js +0 -155
  113. package/cjs/providers/azure-provider.optional.spec.js +0 -228
  114. package/cjs/providers/index.js +0 -26
  115. package/cjs/providers/local-provider.js +0 -230
  116. package/cjs/providers/local-provider.spec.js +0 -239
  117. package/cjs/providers/s3-provider.optional.js +0 -175
  118. package/cjs/providers/s3-provider.optional.spec.js +0 -243
  119. package/cjs/providers/sftp-provider.optional.js +0 -203
  120. package/cjs/providers/sftp-provider.optional.spec.js +0 -217
  121. package/cjs/providers/storage-factory.service.js +0 -175
  122. package/cjs/providers/storage-factory.service.spec.js +0 -253
  123. package/cjs/providers/storage-provider.registry.js +0 -41
  124. package/cjs/providers/storage-provider.registry.spec.js +0 -67
  125. package/cjs/services/file-manager.service.js +0 -387
  126. package/cjs/services/file-manager.service.spec.js +0 -580
  127. package/cjs/services/folder.service.js +0 -101
  128. package/cjs/services/folder.service.spec.js +0 -167
  129. package/cjs/services/index.js +0 -23
  130. package/cjs/services/storage-config.service.js +0 -129
  131. package/cjs/services/storage-config.service.spec.js +0 -257
  132. package/cjs/services/storage-datasource.provider.js +0 -137
  133. package/cjs/services/storage-datasource.provider.spec.js +0 -217
  134. package/cjs/services/storage-provider-config.service.js +0 -171
  135. package/cjs/services/storage-provider-config.service.spec.js +0 -265
  136. package/cjs/services/upload.service.js +0 -376
  137. package/cjs/services/upload.service.spec.js +0 -426
  138. package/cjs/utils/file-validator.util.js +0 -440
  139. package/cjs/utils/file-validator.util.spec.js +0 -259
  140. package/cjs/utils/image-compressor.util.js +0 -162
  141. package/cjs/utils/image-compressor.util.spec.js +0 -166
  142. package/cjs/utils/index.js +0 -18
  143. package/fesm/config/event-actions.js +0 -13
  144. package/fesm/config/message-keys.js +0 -22
  145. package/fesm/config/storage.constants.js +0 -7
  146. package/fesm/controllers/file-manager.controller.js +0 -142
  147. package/fesm/controllers/file-manager.controller.spec.js +0 -131
  148. package/fesm/controllers/folder.controller.js +0 -92
  149. package/fesm/controllers/folder.controller.spec.js +0 -82
  150. package/fesm/controllers/storage-config.controller.js +0 -92
  151. package/fesm/controllers/storage-config.controller.spec.js +0 -81
  152. package/fesm/controllers/upload.controller.js +0 -224
  153. package/fesm/controllers/upload.controller.spec.js +0 -128
  154. package/fesm/docs/storage-swagger.config.js +0 -181
  155. package/fesm/docs/storage-swagger.config.spec.js +0 -68
  156. package/fesm/dtos/file-manager.dto.js +0 -300
  157. package/fesm/dtos/folder.dto.js +0 -84
  158. package/fesm/dtos/storage-config.dto.js +0 -149
  159. package/fesm/dtos/upload.dto.js +0 -245
  160. package/fesm/entities/file-manager-with-company.entity.js +0 -51
  161. package/fesm/entities/file-manager.entity.js +0 -112
  162. package/fesm/entities/folder-with-company.entity.js +0 -45
  163. package/fesm/entities/folder.entity.js +0 -54
  164. package/fesm/entities/index.spec.js +0 -14
  165. package/fesm/entities/storage-config-with-company.entity.js +0 -41
  166. package/fesm/entities/storage-config.entity.js +0 -86
  167. package/fesm/enums/file-location.enum.js +0 -7
  168. package/fesm/interfaces/file-manager.interface.js +0 -1
  169. package/fesm/interfaces/folder.interface.js +0 -1
  170. package/fesm/interfaces/storage-config.interface.js +0 -1
  171. package/fesm/interfaces/storage-module-options.interface.js +0 -3
  172. package/fesm/interfaces/storage-provider.interface.js +0 -4
  173. package/fesm/middlewares/file-serve.middleware.js +0 -190
  174. package/fesm/middlewares/file-serve.middleware.spec.js +0 -207
  175. package/fesm/middlewares/index.js +0 -1
  176. package/fesm/modules/storage.module.js +0 -156
  177. package/fesm/modules/storage.module.spec.js +0 -180
  178. package/fesm/providers/azure-provider.optional.spec.js +0 -224
  179. package/fesm/providers/local-provider.js +0 -182
  180. package/fesm/providers/local-provider.spec.js +0 -194
  181. package/fesm/providers/s3-provider.optional.spec.js +0 -239
  182. package/fesm/providers/sftp-provider.optional.spec.js +0 -213
  183. package/fesm/providers/storage-factory.service.js +0 -124
  184. package/fesm/providers/storage-factory.service.spec.js +0 -249
  185. package/fesm/providers/storage-provider.registry.js +0 -34
  186. package/fesm/providers/storage-provider.registry.spec.js +0 -63
  187. package/fesm/services/file-manager.service.js +0 -336
  188. package/fesm/services/file-manager.service.spec.js +0 -576
  189. package/fesm/services/folder.service.js +0 -91
  190. package/fesm/services/folder.service.spec.js +0 -163
  191. package/fesm/services/storage-config.service.js +0 -119
  192. package/fesm/services/storage-config.service.spec.js +0 -253
  193. package/fesm/services/storage-datasource.provider.js +0 -86
  194. package/fesm/services/storage-datasource.provider.spec.js +0 -172
  195. package/fesm/services/storage-provider-config.service.js +0 -161
  196. package/fesm/services/storage-provider-config.service.spec.js +0 -261
  197. package/fesm/services/upload.service.js +0 -366
  198. package/fesm/services/upload.service.spec.js +0 -422
  199. package/fesm/utils/file-validator.util.js +0 -433
  200. package/fesm/utils/file-validator.util.spec.js +0 -255
  201. package/fesm/utils/image-compressor.util.js +0 -114
  202. 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
- });