@nest-omni/core 4.1.3-11 → 4.1.3-12

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 (175) hide show
  1. package/audit/audit.module.js +17 -0
  2. package/audit/controllers/audit.controller.d.ts +64 -0
  3. package/audit/controllers/audit.controller.js +50 -0
  4. package/audit/decorators/audit-action.decorator.d.ts +74 -0
  5. package/audit/decorators/audit-action.decorator.js +42 -0
  6. package/audit/decorators/entity-audit.decorator.d.ts +10 -1
  7. package/audit/decorators/entity-audit.decorator.js +34 -16
  8. package/audit/decorators/index.d.ts +1 -0
  9. package/audit/decorators/index.js +1 -0
  10. package/audit/entities/audit-action-summary.entity.d.ts +23 -0
  11. package/audit/entities/audit-action-summary.entity.js +101 -0
  12. package/audit/entities/entity-audit-log.entity.d.ts +3 -0
  13. package/audit/entities/entity-audit-log.entity.js +25 -2
  14. package/audit/entities/entity-transaction.entity.d.ts +3 -4
  15. package/audit/entities/entity-transaction.entity.js +10 -3
  16. package/audit/entities/index.d.ts +1 -0
  17. package/audit/entities/index.js +1 -0
  18. package/audit/entities/manual-operation-log.entity.js +8 -1
  19. package/audit/enums/audit.enums.d.ts +1 -10
  20. package/audit/enums/audit.enums.js +7 -17
  21. package/audit/index.d.ts +2 -1
  22. package/audit/index.js +5 -1
  23. package/audit/interceptors/audit-action.interceptor.d.ts +38 -0
  24. package/audit/interceptors/audit-action.interceptor.js +215 -0
  25. package/audit/interceptors/index.d.ts +1 -0
  26. package/audit/interceptors/index.js +1 -0
  27. package/audit/interfaces/audit.interfaces.d.ts +10 -5
  28. package/audit/services/audit-action.service.d.ts +141 -0
  29. package/audit/services/audit-action.service.js +244 -0
  30. package/audit/services/audit-context.service.d.ts +82 -0
  31. package/audit/services/audit-context.service.js +170 -0
  32. package/audit/services/entity-audit.service.d.ts +104 -3
  33. package/audit/services/entity-audit.service.js +306 -9
  34. package/audit/services/index.d.ts +1 -0
  35. package/audit/services/index.js +1 -0
  36. package/audit/services/manual-audit-log.service.d.ts +24 -23
  37. package/audit/services/manual-audit-log.service.js +32 -53
  38. package/audit/services/operation-description.service.d.ts +13 -3
  39. package/audit/services/operation-description.service.js +161 -24
  40. package/audit/services/transaction-audit.service.js +3 -3
  41. package/audit/subscribers/entity-audit.subscriber.d.ts +4 -0
  42. package/audit/subscribers/entity-audit.subscriber.js +47 -0
  43. package/file-upload/controllers/file-access.controller.d.ts +23 -0
  44. package/file-upload/controllers/file-access.controller.js +128 -0
  45. package/file-upload/decorators/csv-data.decorator.d.ts +44 -0
  46. package/file-upload/decorators/csv-data.decorator.js +131 -0
  47. package/file-upload/decorators/excel-data.decorator.d.ts +44 -0
  48. package/file-upload/decorators/excel-data.decorator.js +125 -0
  49. package/file-upload/decorators/file-upload.decorator.d.ts +83 -0
  50. package/file-upload/decorators/file-upload.decorator.js +172 -0
  51. package/file-upload/decorators/index.d.ts +4 -0
  52. package/file-upload/decorators/index.js +20 -0
  53. package/file-upload/decorators/process.decorator.d.ts +40 -0
  54. package/file-upload/decorators/process.decorator.js +52 -0
  55. package/file-upload/dto/create-file.dto.d.ts +24 -0
  56. package/file-upload/dto/create-file.dto.js +112 -0
  57. package/file-upload/dto/find-files.dto.d.ts +15 -0
  58. package/file-upload/dto/find-files.dto.js +76 -0
  59. package/file-upload/dto/index.d.ts +4 -0
  60. package/file-upload/dto/index.js +20 -0
  61. package/file-upload/dto/pagination.dto.d.ts +7 -0
  62. package/file-upload/dto/pagination.dto.js +39 -0
  63. package/file-upload/dto/update-file.dto.d.ts +16 -0
  64. package/file-upload/dto/update-file.dto.js +71 -0
  65. package/file-upload/entities/file-metadata.entity.d.ts +22 -0
  66. package/file-upload/entities/file-metadata.entity.js +84 -0
  67. package/file-upload/entities/file.entity.d.ts +129 -0
  68. package/file-upload/entities/file.entity.js +384 -0
  69. package/file-upload/entities/index.d.ts +2 -0
  70. package/file-upload/entities/index.js +18 -0
  71. package/file-upload/enums/file-type.enum.d.ts +72 -0
  72. package/file-upload/enums/file-type.enum.js +212 -0
  73. package/file-upload/exceptions/file-upload.exception.d.ts +57 -0
  74. package/file-upload/exceptions/file-upload.exception.js +120 -0
  75. package/file-upload/exceptions/index.d.ts +1 -0
  76. package/file-upload/exceptions/index.js +17 -0
  77. package/file-upload/file-upload.module.d.ts +89 -0
  78. package/file-upload/file-upload.module.js +264 -0
  79. package/file-upload/index.d.ts +26 -0
  80. package/file-upload/index.js +59 -0
  81. package/file-upload/interceptors/file-upload.interceptor.d.ts +48 -0
  82. package/file-upload/interceptors/file-upload.interceptor.js +434 -0
  83. package/file-upload/interceptors/index.d.ts +1 -0
  84. package/file-upload/interceptors/index.js +17 -0
  85. package/file-upload/interfaces/custom-file-type.interface.d.ts +72 -0
  86. package/file-upload/interfaces/custom-file-type.interface.js +2 -0
  87. package/file-upload/interfaces/file-buffer.interface.d.ts +72 -0
  88. package/file-upload/interfaces/file-buffer.interface.js +2 -0
  89. package/file-upload/interfaces/file-entity.interface.d.ts +142 -0
  90. package/file-upload/interfaces/file-entity.interface.js +28 -0
  91. package/file-upload/interfaces/file-metadata.interface.d.ts +21 -0
  92. package/file-upload/interfaces/file-metadata.interface.js +2 -0
  93. package/file-upload/interfaces/file-upload-options.interface.d.ts +117 -0
  94. package/file-upload/interfaces/file-upload-options.interface.js +2 -0
  95. package/file-upload/interfaces/index.d.ts +7 -0
  96. package/file-upload/interfaces/index.js +24 -0
  97. package/file-upload/interfaces/storage-provider.interface.d.ts +239 -0
  98. package/file-upload/interfaces/storage-provider.interface.js +2 -0
  99. package/file-upload/interfaces/upload-options.interface.d.ts +19 -0
  100. package/file-upload/interfaces/upload-options.interface.js +2 -0
  101. package/file-upload/providers/index.d.ts +2 -0
  102. package/file-upload/providers/index.js +18 -0
  103. package/file-upload/providers/local-storage.provider.d.ts +98 -0
  104. package/file-upload/providers/local-storage.provider.js +484 -0
  105. package/file-upload/providers/s3-storage.provider.d.ts +87 -0
  106. package/file-upload/providers/s3-storage.provider.js +455 -0
  107. package/file-upload/services/file-signature-validator.service.d.ts +118 -0
  108. package/file-upload/services/file-signature-validator.service.js +376 -0
  109. package/file-upload/services/file.service.d.ts +190 -0
  110. package/file-upload/services/file.service.js +609 -0
  111. package/file-upload/services/index.d.ts +4 -0
  112. package/file-upload/services/index.js +20 -0
  113. package/file-upload/services/malicious-file-detector.service.d.ts +274 -0
  114. package/file-upload/services/malicious-file-detector.service.js +1035 -0
  115. package/file-upload/services/mime-registry.service.d.ts +47 -0
  116. package/file-upload/services/mime-registry.service.js +167 -0
  117. package/file-upload/utils/checksum.util.d.ts +28 -0
  118. package/file-upload/utils/checksum.util.js +65 -0
  119. package/file-upload/utils/dynamic-import.util.d.ts +50 -0
  120. package/file-upload/utils/dynamic-import.util.js +144 -0
  121. package/file-upload/utils/filename.util.d.ts +59 -0
  122. package/file-upload/utils/filename.util.js +184 -0
  123. package/file-upload/utils/filepath.util.d.ts +70 -0
  124. package/file-upload/utils/filepath.util.js +152 -0
  125. package/file-upload/utils/index.d.ts +4 -0
  126. package/file-upload/utils/index.js +20 -0
  127. package/index.d.ts +3 -1
  128. package/index.js +4 -1
  129. package/package.json +4 -5
  130. package/setup/bootstrap.setup.d.ts +1 -0
  131. package/setup/bootstrap.setup.js +1 -0
  132. package/shared/index.d.ts +1 -1
  133. package/shared/index.js +1 -1
  134. package/shared/{serviceRegistryModule.js → service-registry.module.js} +0 -12
  135. package/shared/services/index.d.ts +0 -1
  136. package/shared/services/index.js +0 -1
  137. package/transaction/__tests__/mocks.d.ts +9 -0
  138. package/transaction/__tests__/mocks.js +33 -0
  139. package/transaction/base-service-transaction.d.ts +99 -0
  140. package/transaction/base-service-transaction.js +286 -0
  141. package/transaction/cls-compatibility.service.d.ts +55 -0
  142. package/transaction/cls-compatibility.service.js +127 -0
  143. package/transaction/data-source-registry.d.ts +91 -0
  144. package/transaction/data-source-registry.js +349 -0
  145. package/transaction/database-adapter.d.ts +44 -0
  146. package/transaction/database-adapter.js +240 -0
  147. package/transaction/decorators/entity-datasource.decorator.d.ts +62 -0
  148. package/transaction/decorators/entity-datasource.decorator.js +105 -0
  149. package/transaction/index.d.ts +14 -0
  150. package/transaction/index.js +57 -0
  151. package/transaction/logging-transactional.interceptor.d.ts +18 -0
  152. package/transaction/logging-transactional.interceptor.js +163 -0
  153. package/transaction/transaction-context.service.d.ts +137 -0
  154. package/transaction/transaction-context.service.js +411 -0
  155. package/transaction/transaction-manager.d.ts +230 -0
  156. package/transaction/transaction-manager.js +1001 -0
  157. package/transaction/transaction-synchronization.d.ts +171 -0
  158. package/transaction/transaction-synchronization.js +380 -0
  159. package/transaction/transaction.errors.d.ts +91 -0
  160. package/transaction/transaction.errors.js +206 -0
  161. package/transaction/transaction.module.d.ts +30 -0
  162. package/transaction/transaction.module.js +98 -0
  163. package/transaction/transactional.decorator.d.ts +82 -0
  164. package/transaction/transactional.decorator.js +319 -0
  165. package/transaction/typeorm-module-wrapper.d.ts +96 -0
  166. package/transaction/typeorm-module-wrapper.js +197 -0
  167. package/validators/file-mimetype.validator.d.ts +0 -2
  168. package/validators/file-mimetype.validator.js +4 -6
  169. package/validators/is-exists.validator.d.ts +2 -5
  170. package/validators/is-exists.validator.js +4 -6
  171. package/validators/is-unique.validator.d.ts +2 -5
  172. package/validators/is-unique.validator.js +6 -11
  173. package/shared/services/validator.service.d.ts +0 -3
  174. package/shared/services/validator.service.js +0 -20
  175. /package/shared/{serviceRegistryModule.d.ts → service-registry.module.d.ts} +0 -0
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ 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;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.UpdateFileDto = void 0;
13
+ const class_validator_1 = require("class-validator");
14
+ /**
15
+ * 更新文件DTO
16
+ */
17
+ class UpdateFileDto {
18
+ }
19
+ exports.UpdateFileDto = UpdateFileDto;
20
+ __decorate([
21
+ (0, class_validator_1.IsOptional)(),
22
+ (0, class_validator_1.IsString)(),
23
+ __metadata("design:type", String)
24
+ ], UpdateFileDto.prototype, "originalName", void 0);
25
+ __decorate([
26
+ (0, class_validator_1.IsOptional)(),
27
+ (0, class_validator_1.IsString)(),
28
+ __metadata("design:type", String)
29
+ ], UpdateFileDto.prototype, "filename", void 0);
30
+ __decorate([
31
+ (0, class_validator_1.IsOptional)(),
32
+ __metadata("design:type", Object)
33
+ ], UpdateFileDto.prototype, "metadata", void 0);
34
+ __decorate([
35
+ (0, class_validator_1.IsOptional)(),
36
+ (0, class_validator_1.IsString)(),
37
+ __metadata("design:type", String)
38
+ ], UpdateFileDto.prototype, "path", void 0);
39
+ __decorate([
40
+ (0, class_validator_1.IsOptional)(),
41
+ (0, class_validator_1.IsString)(),
42
+ __metadata("design:type", String)
43
+ ], UpdateFileDto.prototype, "checksum", void 0);
44
+ __decorate([
45
+ (0, class_validator_1.IsOptional)(),
46
+ (0, class_validator_1.IsString)(),
47
+ __metadata("design:type", String)
48
+ ], UpdateFileDto.prototype, "status", void 0);
49
+ __decorate([
50
+ (0, class_validator_1.IsOptional)(),
51
+ (0, class_validator_1.IsString)(),
52
+ __metadata("design:type", String)
53
+ ], UpdateFileDto.prototype, "errorMessage", void 0);
54
+ __decorate([
55
+ (0, class_validator_1.IsOptional)(),
56
+ (0, class_validator_1.IsString)(),
57
+ __metadata("design:type", String)
58
+ ], UpdateFileDto.prototype, "fileType", void 0);
59
+ __decorate([
60
+ (0, class_validator_1.IsOptional)(),
61
+ (0, class_validator_1.IsString)(),
62
+ __metadata("design:type", String)
63
+ ], UpdateFileDto.prototype, "extension", void 0);
64
+ __decorate([
65
+ (0, class_validator_1.IsOptional)(),
66
+ __metadata("design:type", Object)
67
+ ], UpdateFileDto.prototype, "validationData", void 0);
68
+ __decorate([
69
+ (0, class_validator_1.IsOptional)(),
70
+ __metadata("design:type", Object)
71
+ ], UpdateFileDto.prototype, "processingData", void 0);
@@ -0,0 +1,22 @@
1
+ import { FileEntity } from './file.entity';
2
+ /**
3
+ * 文件元数据实体
4
+ */
5
+ export declare class FileMetadataEntity {
6
+ id: string;
7
+ fileId: string;
8
+ key: string;
9
+ value: string;
10
+ jsonData: any;
11
+ isPublic: boolean;
12
+ createdAt: Date;
13
+ file: FileEntity;
14
+ /**
15
+ * 获取值(优先返回JSON数据)
16
+ */
17
+ getValue<T = any>(): T;
18
+ /**
19
+ * 设置值(同时保存到JSON和文本字段)
20
+ */
21
+ setValue(value: any): void;
22
+ }
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ 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;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.FileMetadataEntity = void 0;
13
+ const typeorm_1 = require("typeorm");
14
+ const file_entity_1 = require("./file.entity");
15
+ /**
16
+ * 文件元数据实体
17
+ */
18
+ let FileMetadataEntity = class FileMetadataEntity {
19
+ // ========== 便捷方法 ==========
20
+ /**
21
+ * 获取值(优先返回JSON数据)
22
+ */
23
+ getValue() {
24
+ if (this.jsonData !== null && this.jsonData !== undefined) {
25
+ return this.jsonData;
26
+ }
27
+ if (this.value) {
28
+ try {
29
+ return JSON.parse(this.value);
30
+ }
31
+ catch (_a) {
32
+ return this.value;
33
+ }
34
+ }
35
+ return null;
36
+ }
37
+ /**
38
+ * 设置值(同时保存到JSON和文本字段)
39
+ */
40
+ setValue(value) {
41
+ this.jsonData = value;
42
+ this.value = typeof value === 'string' ? value : JSON.stringify(value);
43
+ }
44
+ };
45
+ exports.FileMetadataEntity = FileMetadataEntity;
46
+ __decorate([
47
+ (0, typeorm_1.PrimaryGeneratedColumn)('uuid'),
48
+ __metadata("design:type", String)
49
+ ], FileMetadataEntity.prototype, "id", void 0);
50
+ __decorate([
51
+ (0, typeorm_1.Column)({ length: 36 }),
52
+ __metadata("design:type", String)
53
+ ], FileMetadataEntity.prototype, "fileId", void 0);
54
+ __decorate([
55
+ (0, typeorm_1.Column)({ length: 100 }),
56
+ __metadata("design:type", String)
57
+ ], FileMetadataEntity.prototype, "key", void 0);
58
+ __decorate([
59
+ (0, typeorm_1.Column)({ type: 'text', nullable: true }),
60
+ __metadata("design:type", String)
61
+ ], FileMetadataEntity.prototype, "value", void 0);
62
+ __decorate([
63
+ (0, typeorm_1.Column)({ type: 'json', nullable: true }),
64
+ __metadata("design:type", Object)
65
+ ], FileMetadataEntity.prototype, "jsonData", void 0);
66
+ __decorate([
67
+ (0, typeorm_1.Column)({ default: false }),
68
+ __metadata("design:type", Boolean)
69
+ ], FileMetadataEntity.prototype, "isPublic", void 0);
70
+ __decorate([
71
+ (0, typeorm_1.CreateDateColumn)(),
72
+ __metadata("design:type", Date)
73
+ ], FileMetadataEntity.prototype, "createdAt", void 0);
74
+ __decorate([
75
+ (0, typeorm_1.ManyToOne)(() => file_entity_1.FileEntity, { onDelete: 'CASCADE' }),
76
+ (0, typeorm_1.JoinColumn)({ name: 'fileId' }),
77
+ __metadata("design:type", file_entity_1.FileEntity)
78
+ ], FileMetadataEntity.prototype, "file", void 0);
79
+ exports.FileMetadataEntity = FileMetadataEntity = __decorate([
80
+ (0, typeorm_1.Entity)('file_metadata'),
81
+ (0, typeorm_1.Index)(['fileId']),
82
+ (0, typeorm_1.Index)(['key']),
83
+ (0, typeorm_1.Index)(['fileId', 'key'], { unique: true })
84
+ ], FileMetadataEntity);
@@ -0,0 +1,129 @@
1
+ /**
2
+ * 文件实体
3
+ */
4
+ export declare class FileEntity {
5
+ id: string;
6
+ originalName: string;
7
+ filename: string;
8
+ mimeType: string;
9
+ fileType: string;
10
+ extension: string;
11
+ size: number;
12
+ checksum: string;
13
+ path: string;
14
+ storageProvider: string;
15
+ metadata: Record<string, any>;
16
+ bucket: string;
17
+ key: string;
18
+ etag: string;
19
+ userId: string;
20
+ uploadId: string;
21
+ tempPath: string;
22
+ status: 'processing' | 'completed' | 'failed' | 'deleted';
23
+ errorMessage: string;
24
+ validationData: {
25
+ detectedTypes: Array<{
26
+ type: string;
27
+ confidence: number;
28
+ isCustom: boolean;
29
+ }>;
30
+ signatures: Array<{
31
+ type: string;
32
+ bytes: number[];
33
+ offset: number;
34
+ }>;
35
+ integrityChecks: string[];
36
+ };
37
+ processingData: {
38
+ processors: Array<{
39
+ name: string;
40
+ startTime: Date;
41
+ endTime?: Date;
42
+ status: 'pending' | 'completed' | 'failed';
43
+ result?: any;
44
+ error?: string;
45
+ }>;
46
+ };
47
+ createdAt: Date;
48
+ updatedAt: Date;
49
+ deletedAt: Date;
50
+ /**
51
+ * 是否为图片
52
+ */
53
+ get isImage(): boolean;
54
+ /**
55
+ * 是否为文档
56
+ */
57
+ get isDocument(): boolean;
58
+ /**
59
+ * 是否为视频
60
+ */
61
+ get isVideo(): boolean;
62
+ /**
63
+ * 是否为音频
64
+ */
65
+ get isAudio(): boolean;
66
+ /**
67
+ * 是否为CAD文件
68
+ */
69
+ get isCAD(): boolean;
70
+ /**
71
+ * 是否为压缩文件
72
+ */
73
+ get isArchive(): boolean;
74
+ /**
75
+ * 获取人类可读的文件大小
76
+ */
77
+ get humanSize(): string;
78
+ /**
79
+ * 静态方法: 从文件名提取扩展名(使用统一工具类)
80
+ */
81
+ static extractExtension(filename: string): string;
82
+ /**
83
+ * 静态方法: 根据 MIME 类型和扩展名识别文件类型
84
+ */
85
+ static detectFileType(mimeType: string, extension: string): string;
86
+ /**
87
+ * 生成访问 URL
88
+ * 注意:不再使用 getter,改为方法以接收 baseUrl 参数
89
+ * 建议使用 FileService.getFileUrl() 代替
90
+ *
91
+ * @param baseUrl 基础 URL(可选)
92
+ * @returns 文件访问 URL
93
+ * @deprecated 请使用 FileService.getFileUrl()
94
+ */
95
+ generateUrl(baseUrl?: string): string;
96
+ /**
97
+ * 获取完整的物理路径(服务器端使用)
98
+ * 仅用于服务器端访问文件系统
99
+ */
100
+ getPhysicalPath(): string;
101
+ /**
102
+ * 自动识别并设置文件类型和扩展名
103
+ */
104
+ detectAndSetFileType(): void;
105
+ /**
106
+ * 标记为已完成
107
+ */
108
+ markAsCompleted(metadata?: any): void;
109
+ /**
110
+ * 标记为失败
111
+ */
112
+ markAsFailed(error: string): void;
113
+ /**
114
+ * 标记为已删除
115
+ */
116
+ markAsDeleted(): void;
117
+ /**
118
+ * 添加验证数据
119
+ */
120
+ addValidationData(data: Partial<FileEntity['validationData']>): void;
121
+ /**
122
+ * 添加处理步骤
123
+ */
124
+ addProcessingStep(processor: string): void;
125
+ /**
126
+ * 更新处理步骤
127
+ */
128
+ updateProcessingStep(processor: string, status: 'completed' | 'failed', result?: any, error?: string): void;
129
+ }
@@ -0,0 +1,384 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ 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;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var FileEntity_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.FileEntity = void 0;
14
+ const typeorm_1 = require("typeorm");
15
+ const class_transformer_1 = require("class-transformer");
16
+ const filepath_util_1 = require("../utils/filepath.util");
17
+ const filename_util_1 = require("../utils/filename.util");
18
+ /**
19
+ * 文件实体
20
+ */
21
+ let FileEntity = FileEntity_1 = class FileEntity {
22
+ // ========== 便捷方法 ==========
23
+ /**
24
+ * 是否为图片
25
+ */
26
+ get isImage() {
27
+ return this.mimeType.startsWith('image/');
28
+ }
29
+ /**
30
+ * 是否为文档
31
+ */
32
+ get isDocument() {
33
+ return (this.mimeType.includes('pdf') ||
34
+ this.mimeType.includes('word') ||
35
+ this.mimeType.includes('excel') ||
36
+ this.mimeType.includes('powerpoint') ||
37
+ this.mimeType.includes('document') ||
38
+ this.mimeType.includes('spreadsheet') ||
39
+ this.mimeType.includes('presentation'));
40
+ }
41
+ /**
42
+ * 是否为视频
43
+ */
44
+ get isVideo() {
45
+ return this.mimeType.startsWith('video/');
46
+ }
47
+ /**
48
+ * 是否为音频
49
+ */
50
+ get isAudio() {
51
+ return this.mimeType.startsWith('audio/');
52
+ }
53
+ /**
54
+ * 是否为CAD文件
55
+ */
56
+ get isCAD() {
57
+ return (this.fileType === 'cad' ||
58
+ this.mimeType.includes('acad') ||
59
+ this.mimeType.includes('dwg') ||
60
+ this.mimeType.includes('dxf') ||
61
+ this.mimeType.includes('dwf') ||
62
+ this.mimeType.includes('step') ||
63
+ this.mimeType.includes('iges'));
64
+ }
65
+ /**
66
+ * 是否为压缩文件
67
+ */
68
+ get isArchive() {
69
+ return (this.fileType === 'archive' ||
70
+ this.mimeType.includes('zip') ||
71
+ this.mimeType.includes('rar') ||
72
+ this.mimeType.includes('gzip') ||
73
+ this.mimeType.includes('tar') ||
74
+ this.mimeType.includes('7z'));
75
+ }
76
+ /**
77
+ * 获取人类可读的文件大小
78
+ */
79
+ get humanSize() {
80
+ const bytes = Number(this.size);
81
+ const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
82
+ if (bytes === 0)
83
+ return '0 Bytes';
84
+ const i = Math.floor(Math.log(bytes) / Math.log(1024));
85
+ return Math.round((bytes / Math.pow(1024, i)) * 100) / 100 + ' ' + sizes[i];
86
+ }
87
+ /**
88
+ * 静态方法: 从文件名提取扩展名(使用统一工具类)
89
+ */
90
+ static extractExtension(filename) {
91
+ return filename_util_1.FileNameUtil.extractExtension(filename);
92
+ }
93
+ /**
94
+ * 静态方法: 根据 MIME 类型和扩展名识别文件类型
95
+ */
96
+ static detectFileType(mimeType, extension) {
97
+ // 图片
98
+ if (mimeType.startsWith('image/')) {
99
+ return 'image';
100
+ }
101
+ // 视频
102
+ if (mimeType.startsWith('video/')) {
103
+ return 'video';
104
+ }
105
+ // 音频
106
+ if (mimeType.startsWith('audio/')) {
107
+ return 'audio';
108
+ }
109
+ // CAD 文件
110
+ if (mimeType.includes('acad') ||
111
+ mimeType.includes('dwg') ||
112
+ mimeType.includes('dxf') ||
113
+ mimeType.includes('dwf') ||
114
+ mimeType.includes('step') ||
115
+ mimeType.includes('iges') ||
116
+ ['.dwg', '.dxf', '.dwf', '.step', '.stp', '.iges', '.igs'].includes(extension.toLowerCase())) {
117
+ return 'cad';
118
+ }
119
+ // 压缩文件
120
+ if (mimeType.includes('zip') ||
121
+ mimeType.includes('rar') ||
122
+ mimeType.includes('gzip') ||
123
+ mimeType.includes('tar') ||
124
+ mimeType.includes('7z') ||
125
+ ['.zip', '.rar', '.gz', '.tar', '.7z'].includes(extension.toLowerCase())) {
126
+ return 'archive';
127
+ }
128
+ // 文档
129
+ if (mimeType.includes('pdf') ||
130
+ mimeType.includes('word') ||
131
+ mimeType.includes('excel') ||
132
+ mimeType.includes('powerpoint') ||
133
+ mimeType.includes('document') ||
134
+ mimeType.includes('spreadsheet') ||
135
+ mimeType.includes('presentation') ||
136
+ mimeType.includes('msword') ||
137
+ mimeType.includes('ms-excel') ||
138
+ mimeType === 'text/plain' ||
139
+ mimeType === 'text/csv') {
140
+ return 'document';
141
+ }
142
+ // 默认为 other
143
+ return 'other';
144
+ }
145
+ // ========== 业务方法 ==========
146
+ /**
147
+ * 生成访问 URL
148
+ * 注意:不再使用 getter,改为方法以接收 baseUrl 参数
149
+ * 建议使用 FileService.getFileUrl() 代替
150
+ *
151
+ * @param baseUrl 基础 URL(可选)
152
+ * @returns 文件访问 URL
153
+ * @deprecated 请使用 FileService.getFileUrl()
154
+ */
155
+ generateUrl(baseUrl) {
156
+ if (!this.path)
157
+ return null;
158
+ switch (this.storageProvider) {
159
+ case 's3':
160
+ case 'oss':
161
+ case 'minio':
162
+ case 'cdn':
163
+ // 对象存储返回相对路径,由调用方拼接完整 URL
164
+ return this.path;
165
+ case 'local':
166
+ default:
167
+ // 本地文件通过 API 访问
168
+ const apiBase = baseUrl || '';
169
+ return apiBase ? `${apiBase}/files/${this.id}` : `/files/${this.id}`;
170
+ }
171
+ }
172
+ /**
173
+ * 获取完整的物理路径(服务器端使用)
174
+ * 仅用于服务器端访问文件系统
175
+ */
176
+ getPhysicalPath() {
177
+ return filepath_util_1.FilePathUtil.getPhysicalPath(this.path, this.storageProvider);
178
+ }
179
+ /**
180
+ * 自动识别并设置文件类型和扩展名
181
+ */
182
+ detectAndSetFileType() {
183
+ // 如果 extension没有设置,从 originalName 提取
184
+ if (!this.extension && this.originalName) {
185
+ this.extension = FileEntity_1.extractExtension(this.originalName);
186
+ }
187
+ this.fileType = FileEntity_1.detectFileType(this.mimeType, this.extension || '');
188
+ }
189
+ /**
190
+ * 标记为已完成
191
+ */
192
+ markAsCompleted(metadata) {
193
+ this.status = 'completed';
194
+ this.tempPath = null;
195
+ this.errorMessage = null;
196
+ if (metadata) {
197
+ this.metadata = Object.assign(Object.assign({}, this.metadata), metadata);
198
+ }
199
+ }
200
+ /**
201
+ * 标记为失败
202
+ */
203
+ markAsFailed(error) {
204
+ this.status = 'failed';
205
+ this.errorMessage = error;
206
+ }
207
+ /**
208
+ * 标记为已删除
209
+ */
210
+ markAsDeleted() {
211
+ this.status = 'deleted';
212
+ }
213
+ /**
214
+ * 添加验证数据
215
+ */
216
+ addValidationData(data) {
217
+ if (!this.validationData) {
218
+ this.validationData = {
219
+ detectedTypes: [],
220
+ signatures: [],
221
+ integrityChecks: [],
222
+ };
223
+ }
224
+ this.validationData = Object.assign(Object.assign({}, this.validationData), data);
225
+ }
226
+ /**
227
+ * 添加处理步骤
228
+ */
229
+ addProcessingStep(processor) {
230
+ if (!this.processingData) {
231
+ this.processingData = { processors: [] };
232
+ }
233
+ this.processingData.processors.push({
234
+ name: processor,
235
+ startTime: new Date(),
236
+ status: 'pending',
237
+ });
238
+ }
239
+ /**
240
+ * 更新处理步骤
241
+ */
242
+ updateProcessingStep(processor, status, result, error) {
243
+ var _a;
244
+ if (!((_a = this.processingData) === null || _a === void 0 ? void 0 : _a.processors))
245
+ return;
246
+ const step = this.processingData.processors.find((p) => p.name === processor);
247
+ if (step) {
248
+ step.status = status;
249
+ step.endTime = new Date();
250
+ if (result !== undefined)
251
+ step.result = result;
252
+ if (error)
253
+ step.error = error;
254
+ }
255
+ }
256
+ };
257
+ exports.FileEntity = FileEntity;
258
+ __decorate([
259
+ (0, typeorm_1.PrimaryGeneratedColumn)('uuid'),
260
+ __metadata("design:type", String)
261
+ ], FileEntity.prototype, "id", void 0);
262
+ __decorate([
263
+ (0, typeorm_1.Column)({ length: 500 }),
264
+ __metadata("design:type", String)
265
+ ], FileEntity.prototype, "originalName", void 0);
266
+ __decorate([
267
+ (0, typeorm_1.Column)({ length: 255, nullable: true }),
268
+ __metadata("design:type", String)
269
+ ], FileEntity.prototype, "filename", void 0);
270
+ __decorate([
271
+ (0, typeorm_1.Column)({ length: 100 }),
272
+ __metadata("design:type", String)
273
+ ], FileEntity.prototype, "mimeType", void 0);
274
+ __decorate([
275
+ (0, typeorm_1.Column)({
276
+ length: 50,
277
+ nullable: true,
278
+ comment: '文件类型: image, video, audio, document, cad, archive 等',
279
+ }),
280
+ __metadata("design:type", String)
281
+ ], FileEntity.prototype, "fileType", void 0);
282
+ __decorate([
283
+ (0, typeorm_1.Column)({
284
+ length: 20,
285
+ nullable: true,
286
+ comment: '文件后缀名: .jpg, .pdf, .dwg 等',
287
+ }),
288
+ __metadata("design:type", String)
289
+ ], FileEntity.prototype, "extension", void 0);
290
+ __decorate([
291
+ (0, typeorm_1.Column)({ type: 'bigint', default: 0 }),
292
+ __metadata("design:type", Number)
293
+ ], FileEntity.prototype, "size", void 0);
294
+ __decorate([
295
+ (0, typeorm_1.Column)({ length: 64, nullable: true }),
296
+ __metadata("design:type", String)
297
+ ], FileEntity.prototype, "checksum", void 0);
298
+ __decorate([
299
+ (0, typeorm_1.Column)({
300
+ nullable: true,
301
+ type: 'text',
302
+ comment: '相对路径(相对于存储根目录)',
303
+ }),
304
+ __metadata("design:type", String)
305
+ ], FileEntity.prototype, "path", void 0);
306
+ __decorate([
307
+ (0, typeorm_1.Column)({
308
+ length: 50,
309
+ default: 'local',
310
+ comment: '存储提供商: local, s3, cdn, oss 等',
311
+ }),
312
+ __metadata("design:type", String)
313
+ ], FileEntity.prototype, "storageProvider", void 0);
314
+ __decorate([
315
+ (0, typeorm_1.Column)({ type: 'json', nullable: true }),
316
+ __metadata("design:type", Object)
317
+ ], FileEntity.prototype, "metadata", void 0);
318
+ __decorate([
319
+ (0, typeorm_1.Column)({ length: 255, nullable: true }),
320
+ __metadata("design:type", String)
321
+ ], FileEntity.prototype, "bucket", void 0);
322
+ __decorate([
323
+ (0, typeorm_1.Column)({ length: 500, nullable: true }),
324
+ __metadata("design:type", String)
325
+ ], FileEntity.prototype, "key", void 0);
326
+ __decorate([
327
+ (0, typeorm_1.Column)({ length: 64, nullable: true }),
328
+ __metadata("design:type", String)
329
+ ], FileEntity.prototype, "etag", void 0);
330
+ __decorate([
331
+ (0, typeorm_1.Column)({ nullable: true }),
332
+ __metadata("design:type", String)
333
+ ], FileEntity.prototype, "userId", void 0);
334
+ __decorate([
335
+ (0, typeorm_1.Column)({ nullable: true }),
336
+ __metadata("design:type", String)
337
+ ], FileEntity.prototype, "uploadId", void 0);
338
+ __decorate([
339
+ (0, typeorm_1.Column)({ nullable: true, type: 'text' }),
340
+ (0, class_transformer_1.Exclude)(),
341
+ __metadata("design:type", String)
342
+ ], FileEntity.prototype, "tempPath", void 0);
343
+ __decorate([
344
+ (0, typeorm_1.Column)({
345
+ type: 'varchar',
346
+ length: 50,
347
+ default: 'processing',
348
+ }),
349
+ __metadata("design:type", String)
350
+ ], FileEntity.prototype, "status", void 0);
351
+ __decorate([
352
+ (0, typeorm_1.Column)({ type: 'text', nullable: true }),
353
+ __metadata("design:type", String)
354
+ ], FileEntity.prototype, "errorMessage", void 0);
355
+ __decorate([
356
+ (0, typeorm_1.Column)({ type: 'json', nullable: true }),
357
+ __metadata("design:type", Object)
358
+ ], FileEntity.prototype, "validationData", void 0);
359
+ __decorate([
360
+ (0, typeorm_1.Column)({ type: 'json', nullable: true }),
361
+ __metadata("design:type", Object)
362
+ ], FileEntity.prototype, "processingData", void 0);
363
+ __decorate([
364
+ (0, typeorm_1.CreateDateColumn)(),
365
+ __metadata("design:type", Date)
366
+ ], FileEntity.prototype, "createdAt", void 0);
367
+ __decorate([
368
+ (0, typeorm_1.UpdateDateColumn)(),
369
+ __metadata("design:type", Date)
370
+ ], FileEntity.prototype, "updatedAt", void 0);
371
+ __decorate([
372
+ (0, typeorm_1.DeleteDateColumn)(),
373
+ __metadata("design:type", Date)
374
+ ], FileEntity.prototype, "deletedAt", void 0);
375
+ exports.FileEntity = FileEntity = FileEntity_1 = __decorate([
376
+ (0, typeorm_1.Entity)('files'),
377
+ (0, typeorm_1.Index)(['userId']),
378
+ (0, typeorm_1.Index)(['uploadId']),
379
+ (0, typeorm_1.Index)(['status']),
380
+ (0, typeorm_1.Index)(['fileType']),
381
+ (0, typeorm_1.Index)(['extension']),
382
+ (0, typeorm_1.Index)(['storageProvider']),
383
+ (0, typeorm_1.Index)(['createdAt'])
384
+ ], FileEntity);
@@ -0,0 +1,2 @@
1
+ export * from './file.entity';
2
+ export * from './file-metadata.entity';