@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,387 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
Object.defineProperty(exports, "FileManagerService", {
|
|
6
|
-
enumerable: true,
|
|
7
|
-
get: function() {
|
|
8
|
-
return FileManagerService;
|
|
9
|
-
}
|
|
10
|
-
});
|
|
11
|
-
const _classes = require("@flusys/nestjs-shared/classes");
|
|
12
|
-
const _modules = require("@flusys/nestjs-shared/modules");
|
|
13
|
-
const _utils = require("@flusys/nestjs-shared/utils");
|
|
14
|
-
const _common = require("@nestjs/common");
|
|
15
|
-
const _typeorm = require("typeorm");
|
|
16
|
-
const _config = require("../config");
|
|
17
|
-
const _entities = require("../entities");
|
|
18
|
-
const _filelocationenum = require("../enums/file-location.enum");
|
|
19
|
-
const _storageconfigservice = require("./storage-config.service");
|
|
20
|
-
const _storagedatasourceprovider = require("./storage-datasource.provider");
|
|
21
|
-
const _uploadservice = require("./upload.service");
|
|
22
|
-
function _define_property(obj, key, value) {
|
|
23
|
-
if (key in obj) {
|
|
24
|
-
Object.defineProperty(obj, key, {
|
|
25
|
-
value: value,
|
|
26
|
-
enumerable: true,
|
|
27
|
-
configurable: true,
|
|
28
|
-
writable: true
|
|
29
|
-
});
|
|
30
|
-
} else {
|
|
31
|
-
obj[key] = value;
|
|
32
|
-
}
|
|
33
|
-
return obj;
|
|
34
|
-
}
|
|
35
|
-
function _getRequireWildcardCache(nodeInterop) {
|
|
36
|
-
if (typeof WeakMap !== "function") return null;
|
|
37
|
-
var cacheBabelInterop = new WeakMap();
|
|
38
|
-
var cacheNodeInterop = new WeakMap();
|
|
39
|
-
return (_getRequireWildcardCache = function(nodeInterop) {
|
|
40
|
-
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
|
41
|
-
})(nodeInterop);
|
|
42
|
-
}
|
|
43
|
-
function _interop_require_wildcard(obj, nodeInterop) {
|
|
44
|
-
if (!nodeInterop && obj && obj.__esModule) {
|
|
45
|
-
return obj;
|
|
46
|
-
}
|
|
47
|
-
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
|
|
48
|
-
return {
|
|
49
|
-
default: obj
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
var cache = _getRequireWildcardCache(nodeInterop);
|
|
53
|
-
if (cache && cache.has(obj)) {
|
|
54
|
-
return cache.get(obj);
|
|
55
|
-
}
|
|
56
|
-
var newObj = {
|
|
57
|
-
__proto__: null
|
|
58
|
-
};
|
|
59
|
-
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
60
|
-
for(var key in obj){
|
|
61
|
-
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
62
|
-
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
|
|
63
|
-
if (desc && (desc.get || desc.set)) {
|
|
64
|
-
Object.defineProperty(newObj, key, desc);
|
|
65
|
-
} else {
|
|
66
|
-
newObj[key] = obj[key];
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
newObj.default = obj;
|
|
71
|
-
if (cache) {
|
|
72
|
-
cache.set(obj, newObj);
|
|
73
|
-
}
|
|
74
|
-
return newObj;
|
|
75
|
-
}
|
|
76
|
-
function _ts_decorate(decorators, target, key, desc) {
|
|
77
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
78
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
79
|
-
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;
|
|
80
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
81
|
-
}
|
|
82
|
-
function _ts_metadata(k, v) {
|
|
83
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
84
|
-
}
|
|
85
|
-
function _ts_param(paramIndex, decorator) {
|
|
86
|
-
return function(target, key) {
|
|
87
|
-
decorator(target, key, paramIndex);
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
const URL_EXPIRY_SECONDS = 3600;
|
|
91
|
-
const DEFAULT_SELECT_FIELDS = [
|
|
92
|
-
'id',
|
|
93
|
-
'name',
|
|
94
|
-
'contentType',
|
|
95
|
-
'size',
|
|
96
|
-
'key',
|
|
97
|
-
'url',
|
|
98
|
-
'location',
|
|
99
|
-
'storageConfigId',
|
|
100
|
-
'isPrivate',
|
|
101
|
-
'createdAt',
|
|
102
|
-
'deletedAt'
|
|
103
|
-
];
|
|
104
|
-
let FileManagerService = class FileManagerService extends _classes.ApiService {
|
|
105
|
-
// ─── Override Methods ───────────────────────────────────────────────────────
|
|
106
|
-
async convertSingleDtoToEntity(dto, user) {
|
|
107
|
-
let entity = {};
|
|
108
|
-
if ('id' in dto && dto.id && typeof dto.id === 'string') {
|
|
109
|
-
const existing = await this.repository.findOne({
|
|
110
|
-
where: {
|
|
111
|
-
id: dto.id
|
|
112
|
-
}
|
|
113
|
-
});
|
|
114
|
-
if (!existing) throw new _common.NotFoundException({
|
|
115
|
-
message: 'Entity not found for update',
|
|
116
|
-
messageKey: _config.FILE_MESSAGES.NOT_FOUND
|
|
117
|
-
});
|
|
118
|
-
entity = existing;
|
|
119
|
-
}
|
|
120
|
-
const validatedFolder = dto.folderId ? await this.validateFolder(dto.folderId, user) : null;
|
|
121
|
-
const storageLocation = await this.resolveStorageLocation(dto, user);
|
|
122
|
-
const merged = {
|
|
123
|
-
...entity,
|
|
124
|
-
...dto,
|
|
125
|
-
location: storageLocation,
|
|
126
|
-
folder: validatedFolder
|
|
127
|
-
};
|
|
128
|
-
if (this.storageConfig.isCompanyFeatureEnabled()) {
|
|
129
|
-
merged.companyId = user?.companyId ?? null;
|
|
130
|
-
}
|
|
131
|
-
return merged;
|
|
132
|
-
}
|
|
133
|
-
async getSelectQuery(query, _user, select) {
|
|
134
|
-
const fields = (select?.length ? select : DEFAULT_SELECT_FIELDS).map((f)=>`${this.entityName}.${f}`);
|
|
135
|
-
if (this.storageConfig.isCompanyFeatureEnabled()) {
|
|
136
|
-
fields.push('file_manager.companyId');
|
|
137
|
-
}
|
|
138
|
-
fields.push('folder.id', 'folder.name');
|
|
139
|
-
query.leftJoinAndSelect('file_manager.folder', 'folder').select(fields);
|
|
140
|
-
return {
|
|
141
|
-
query,
|
|
142
|
-
isRaw: false
|
|
143
|
-
};
|
|
144
|
-
}
|
|
145
|
-
async getFilterQuery(query, filter, _user) {
|
|
146
|
-
for (const [key, value] of Object.entries(filter)){
|
|
147
|
-
if (key === 'contentType' && typeof value === 'string') {
|
|
148
|
-
this.applyContentTypeFilter(query, value);
|
|
149
|
-
} else {
|
|
150
|
-
query.andWhere(`${this.entityName}.${key} = :value`, {
|
|
151
|
-
value
|
|
152
|
-
});
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
return {
|
|
156
|
-
query,
|
|
157
|
-
isRaw: false
|
|
158
|
-
};
|
|
159
|
-
}
|
|
160
|
-
async getExtraManipulateQuery(query, filterDto, user) {
|
|
161
|
-
const result = await super.getExtraManipulateQuery(query, filterDto, user);
|
|
162
|
-
(0, _utils.applyCompanyFilter)(query, {
|
|
163
|
-
isCompanyFeatureEnabled: this.storageConfig.isCompanyFeatureEnabled(),
|
|
164
|
-
entityAlias: 'file_manager'
|
|
165
|
-
}, user);
|
|
166
|
-
await this.applyPrivateFileFilter(query, user);
|
|
167
|
-
return result;
|
|
168
|
-
}
|
|
169
|
-
async beforeDeleteOperation(dto, user, _qr) {
|
|
170
|
-
if (dto.type !== 'permanent') return;
|
|
171
|
-
const ids = Array.isArray(dto.id) ? dto.id : [
|
|
172
|
-
dto.id
|
|
173
|
-
];
|
|
174
|
-
const files = await this.repository.findBy({
|
|
175
|
-
id: (0, _typeorm.In)(ids)
|
|
176
|
-
});
|
|
177
|
-
const grouped = this.groupFilesByConfig(files);
|
|
178
|
-
for (const [configId, { keys, location }] of grouped){
|
|
179
|
-
let deleteKeys = keys;
|
|
180
|
-
if (location === _filelocationenum.FileLocationEnum.LOCAL && configId !== 'default') {
|
|
181
|
-
const basePath = await this.getStorageConfigBasePath(configId);
|
|
182
|
-
if (basePath) {
|
|
183
|
-
deleteKeys = keys.map((k)=>k.includes('/') ? k : `${basePath}/${k}`);
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
await this.uploadService.deleteMultipleFile(deleteKeys, configId === 'default' ? undefined : configId, user ?? undefined, location);
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
// ─── Public Methods ─────────────────────────────────────────────────────────
|
|
190
|
-
async getFiles(dtos, protocol, host, user) {
|
|
191
|
-
await this.ensureDataSourceRepository();
|
|
192
|
-
const ids = dtos.map((d)=>d.id).filter(Boolean);
|
|
193
|
-
if (!ids.length) throw new _common.BadRequestException({
|
|
194
|
-
message: 'No valid file IDs provided',
|
|
195
|
-
messageKey: _config.UPLOAD_MESSAGES.NO_FILES_PROVIDED
|
|
196
|
-
});
|
|
197
|
-
const files = await this.repository.findBy({
|
|
198
|
-
id: (0, _typeorm.In)(ids)
|
|
199
|
-
});
|
|
200
|
-
const now = Date.now();
|
|
201
|
-
const updatedFiles = [];
|
|
202
|
-
const responses = await Promise.all(files.map(async (file)=>{
|
|
203
|
-
const updated = await this.refreshFileUrl(file, protocol, host, now, user);
|
|
204
|
-
if (updated) updatedFiles.push(file);
|
|
205
|
-
return this.toFileResponse(file);
|
|
206
|
-
}));
|
|
207
|
-
if (updatedFiles.length) {
|
|
208
|
-
try {
|
|
209
|
-
await this.repository.save(updatedFiles);
|
|
210
|
-
await Promise.all([
|
|
211
|
-
this.clearCacheForAll(),
|
|
212
|
-
this.clearCacheForId(updatedFiles)
|
|
213
|
-
]);
|
|
214
|
-
} catch {
|
|
215
|
-
// Silent failure - URL update is non-critical
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
return responses;
|
|
219
|
-
}
|
|
220
|
-
// ─── Private Helpers ────────────────────────────────────────────────────────
|
|
221
|
-
buildWhereWithCompany(id, user) {
|
|
222
|
-
const where = {
|
|
223
|
-
id
|
|
224
|
-
};
|
|
225
|
-
if (this.storageConfig.isCompanyFeatureEnabled() && user?.companyId) {
|
|
226
|
-
where.companyId = user.companyId;
|
|
227
|
-
}
|
|
228
|
-
return where;
|
|
229
|
-
}
|
|
230
|
-
async getStorageConfigRepository() {
|
|
231
|
-
const entity = this.storageConfig.isCompanyFeatureEnabled() ? (await Promise.resolve().then(()=>/*#__PURE__*/ _interop_require_wildcard(require("../entities")))).StorageConfigWithCompany : (await Promise.resolve().then(()=>/*#__PURE__*/ _interop_require_wildcard(require("../entities")))).StorageConfig;
|
|
232
|
-
return this.dataSourceProvider.getRepository(entity);
|
|
233
|
-
}
|
|
234
|
-
async getStorageConfigBasePath(configId) {
|
|
235
|
-
try {
|
|
236
|
-
const repo = await this.getStorageConfigRepository();
|
|
237
|
-
const config = await repo.findOne({
|
|
238
|
-
where: {
|
|
239
|
-
id: configId
|
|
240
|
-
},
|
|
241
|
-
select: [
|
|
242
|
-
'id',
|
|
243
|
-
'config'
|
|
244
|
-
]
|
|
245
|
-
});
|
|
246
|
-
return config?.config?.basePath?.replace(/^\.\//, '') ?? null;
|
|
247
|
-
} catch {
|
|
248
|
-
return null;
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
async validateFolder(folderId, user) {
|
|
252
|
-
const entity = this.storageConfig.isCompanyFeatureEnabled() ? _entities.FolderWithCompany : _entities.Folder;
|
|
253
|
-
const repo = await this.dataSourceProvider.getRepository(entity);
|
|
254
|
-
const folder = await repo.findOne({
|
|
255
|
-
where: this.buildWhereWithCompany(folderId, user)
|
|
256
|
-
});
|
|
257
|
-
if (!folder) {
|
|
258
|
-
throw new _common.BadRequestException({
|
|
259
|
-
message: `Folder "${folderId}" not found or access denied`,
|
|
260
|
-
messageKey: _config.FOLDER_MESSAGES.NOT_FOUND,
|
|
261
|
-
messageVariables: {
|
|
262
|
-
folderId
|
|
263
|
-
}
|
|
264
|
-
});
|
|
265
|
-
}
|
|
266
|
-
return folder;
|
|
267
|
-
}
|
|
268
|
-
async resolveStorageLocation(dto, user) {
|
|
269
|
-
const configId = dto.storageConfigId;
|
|
270
|
-
if (!configId) return dto.location || _filelocationenum.FileLocationEnum.LOCAL;
|
|
271
|
-
try {
|
|
272
|
-
const repo = await this.getStorageConfigRepository();
|
|
273
|
-
const config = await repo.findOne({
|
|
274
|
-
where: this.buildWhereWithCompany(configId, user)
|
|
275
|
-
});
|
|
276
|
-
return config?.storage || dto.location || _filelocationenum.FileLocationEnum.LOCAL;
|
|
277
|
-
} catch {
|
|
278
|
-
return dto.location || _filelocationenum.FileLocationEnum.LOCAL;
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
applyContentTypeFilter(query, value) {
|
|
282
|
-
const patterns = value.split(',').map((t)=>t.trim().replace('*', '%'));
|
|
283
|
-
query.where(new _typeorm.Brackets((qb)=>{
|
|
284
|
-
patterns.forEach((p, i)=>{
|
|
285
|
-
const method = i === 0 ? 'where' : 'orWhere';
|
|
286
|
-
qb[method](`${this.entityName}.contentType LIKE :p${i}`, {
|
|
287
|
-
[`p${i}`]: p
|
|
288
|
-
});
|
|
289
|
-
});
|
|
290
|
-
}));
|
|
291
|
-
}
|
|
292
|
-
async applyPrivateFileFilter(query, user) {
|
|
293
|
-
if (!user) {
|
|
294
|
-
query.andWhere('file_manager.isPrivate = :isPrivate', {
|
|
295
|
-
isPrivate: false
|
|
296
|
-
});
|
|
297
|
-
return;
|
|
298
|
-
}
|
|
299
|
-
const canViewPrivate = await this.permissionCacheService.hasPermission({
|
|
300
|
-
userId: user.id,
|
|
301
|
-
companyId: user.companyId,
|
|
302
|
-
branchId: user.branchId
|
|
303
|
-
}, _classes.FILE_PERMISSIONS.VIEW_PRIVATE_ACTION);
|
|
304
|
-
if (!canViewPrivate) {
|
|
305
|
-
query.andWhere('file_manager.isPrivate = :isPrivate', {
|
|
306
|
-
isPrivate: false
|
|
307
|
-
});
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
groupFilesByConfig(files) {
|
|
311
|
-
const grouped = new Map();
|
|
312
|
-
for (const file of files){
|
|
313
|
-
const configId = file.storageConfigId || 'default';
|
|
314
|
-
if (!grouped.has(configId)) {
|
|
315
|
-
grouped.set(configId, {
|
|
316
|
-
keys: [],
|
|
317
|
-
location: file.location
|
|
318
|
-
});
|
|
319
|
-
}
|
|
320
|
-
grouped.get(configId).keys.push(file.key);
|
|
321
|
-
}
|
|
322
|
-
return grouped;
|
|
323
|
-
}
|
|
324
|
-
getFileBaseUrl(protocol, host) {
|
|
325
|
-
const appUrl = this.storageConfig.getAppUrl()?.replace(/\/$/, '');
|
|
326
|
-
return appUrl || `${protocol}://${host}`;
|
|
327
|
-
}
|
|
328
|
-
async refreshFileUrl(file, protocol, host, now, user) {
|
|
329
|
-
const isCloudProvider = file.location === _filelocationenum.FileLocationEnum.AWS || file.location === _filelocationenum.FileLocationEnum.AZURE;
|
|
330
|
-
const needsNewUrl = !file.url || isCloudProvider && (typeof file.expiresAt !== 'number' || now >= file.expiresAt);
|
|
331
|
-
if (needsNewUrl && file.storageConfigId) {
|
|
332
|
-
try {
|
|
333
|
-
file.url = await this.uploadService.makeFileUrl(file.key, file.storageConfigId, URL_EXPIRY_SECONDS, user);
|
|
334
|
-
file.expiresAt = now + URL_EXPIRY_SECONDS * 1000;
|
|
335
|
-
return true;
|
|
336
|
-
} catch {
|
|
337
|
-
file.url = `${this.getFileBaseUrl(protocol, host)}/storage/upload/file/${file.key}`;
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
if (file.location === _filelocationenum.FileLocationEnum.SFTP || file.location === _filelocationenum.FileLocationEnum.LOCAL) {
|
|
341
|
-
let fileKey = file.key;
|
|
342
|
-
if (!fileKey.includes('/') && file.storageConfigId) {
|
|
343
|
-
const basePath = await this.getStorageConfigBasePath(file.storageConfigId);
|
|
344
|
-
if (basePath) fileKey = `${basePath}/${file.key}`;
|
|
345
|
-
}
|
|
346
|
-
const expectedUrl = `${this.getFileBaseUrl(protocol, host)}/storage/upload/file/${fileKey}`;
|
|
347
|
-
if (file.url !== expectedUrl) {
|
|
348
|
-
file.url = expectedUrl;
|
|
349
|
-
return true;
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
return false;
|
|
353
|
-
}
|
|
354
|
-
toFileResponse(file) {
|
|
355
|
-
return {
|
|
356
|
-
id: file.id,
|
|
357
|
-
name: file.name,
|
|
358
|
-
contentType: file.contentType,
|
|
359
|
-
url: file.url || '',
|
|
360
|
-
location: file.location,
|
|
361
|
-
storageConfigId: file.storageConfigId || undefined
|
|
362
|
-
};
|
|
363
|
-
}
|
|
364
|
-
constructor(cacheManager, utilsService, uploadService, storageConfig, dataSourceProvider, permissionCacheService){
|
|
365
|
-
super(_config.STORAGE_EVENT_ENTITIES.FILE, cacheManager, utilsService, FileManagerService.name, true, _config.STORAGE_EVENT_MODULE, dataSourceProvider, storageConfig.isCompanyFeatureEnabled() ? _entities.FileManagerWithCompany : _entities.FileManager), _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), _define_property(this, "permissionCacheService", void 0), this.cacheManager = cacheManager, this.utilsService = utilsService, this.uploadService = uploadService, this.storageConfig = storageConfig, this.dataSourceProvider = dataSourceProvider, this.permissionCacheService = permissionCacheService;
|
|
366
|
-
}
|
|
367
|
-
};
|
|
368
|
-
FileManagerService = _ts_decorate([
|
|
369
|
-
(0, _common.Injectable)({
|
|
370
|
-
scope: _common.Scope.REQUEST
|
|
371
|
-
}),
|
|
372
|
-
_ts_param(0, (0, _common.Inject)('CACHE_INSTANCE')),
|
|
373
|
-
_ts_param(1, (0, _common.Inject)(_modules.UtilsService)),
|
|
374
|
-
_ts_param(2, (0, _common.Inject)(_uploadservice.UploadService)),
|
|
375
|
-
_ts_param(3, (0, _common.Inject)(_storageconfigservice.StorageConfigService)),
|
|
376
|
-
_ts_param(4, (0, _common.Inject)(_storagedatasourceprovider.StorageDataSourceProvider)),
|
|
377
|
-
_ts_param(5, (0, _common.Inject)(_modules.SharedPermissionCacheService)),
|
|
378
|
-
_ts_metadata("design:type", Function),
|
|
379
|
-
_ts_metadata("design:paramtypes", [
|
|
380
|
-
typeof _classes.HybridCache === "undefined" ? Object : _classes.HybridCache,
|
|
381
|
-
typeof _modules.UtilsService === "undefined" ? Object : _modules.UtilsService,
|
|
382
|
-
typeof _uploadservice.UploadService === "undefined" ? Object : _uploadservice.UploadService,
|
|
383
|
-
typeof _storageconfigservice.StorageConfigService === "undefined" ? Object : _storageconfigservice.StorageConfigService,
|
|
384
|
-
typeof _storagedatasourceprovider.StorageDataSourceProvider === "undefined" ? Object : _storagedatasourceprovider.StorageDataSourceProvider,
|
|
385
|
-
typeof _modules.SharedPermissionCacheService === "undefined" ? Object : _modules.SharedPermissionCacheService
|
|
386
|
-
])
|
|
387
|
-
], FileManagerService);
|