@flusys/nestjs-storage 1.1.0-beta → 2.0.0

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