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