@nest-omni/core 4.1.3-3 → 4.1.3-30
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/audit/audit.module.d.ts +1 -0
- package/audit/audit.module.js +51 -2
- package/audit/controllers/audit.controller.d.ts +57 -1
- package/audit/controllers/audit.controller.js +43 -0
- package/audit/decorators/audit-action.decorator.d.ts +74 -0
- package/audit/decorators/audit-action.decorator.js +42 -0
- package/audit/decorators/audit-controller.decorator.d.ts +1 -1
- package/audit/decorators/audit-controller.decorator.js +2 -2
- package/audit/decorators/audit-operation.decorator.d.ts +0 -7
- package/audit/decorators/audit-operation.decorator.js +0 -7
- package/audit/decorators/entity-audit.decorator.d.ts +78 -2
- package/audit/decorators/entity-audit.decorator.js +145 -4
- package/audit/decorators/index.d.ts +2 -0
- package/audit/decorators/index.js +2 -0
- package/audit/dto/audit-action-query.dto.d.ts +13 -0
- package/audit/dto/audit-action-query.dto.js +77 -0
- package/audit/dto/index.d.ts +1 -0
- package/audit/dto/index.js +1 -0
- package/audit/entities/audit-action-summary.entity.d.ts +23 -0
- package/audit/entities/audit-action-summary.entity.js +101 -0
- package/audit/entities/entity-audit-log.entity.d.ts +7 -2
- package/audit/entities/entity-audit-log.entity.js +45 -9
- package/audit/entities/entity-transaction.entity.d.ts +8 -2
- package/audit/entities/entity-transaction.entity.js +39 -3
- package/audit/entities/index.d.ts +3 -0
- package/audit/entities/index.js +3 -0
- package/audit/entities/manual-operation-log.entity.d.ts +0 -2
- package/audit/entities/manual-operation-log.entity.js +8 -9
- package/audit/enums/audit.enums.d.ts +14 -6
- package/audit/enums/audit.enums.js +18 -9
- package/audit/examples/decorator-value-mapping.example.d.ts +70 -0
- package/audit/examples/decorator-value-mapping.example.js +414 -0
- package/audit/index.d.ts +5 -1
- package/audit/index.js +29 -2
- package/audit/interceptors/audit-action.interceptor.d.ts +39 -0
- package/audit/interceptors/audit-action.interceptor.js +217 -0
- package/audit/interceptors/audit.interceptor.d.ts +1 -0
- package/audit/interceptors/audit.interceptor.js +19 -11
- package/audit/interceptors/index.d.ts +1 -0
- package/audit/interceptors/index.js +1 -0
- package/audit/interfaces/audit.interfaces.d.ts +132 -4
- package/audit/services/audit-action.service.d.ts +142 -0
- package/audit/services/audit-action.service.js +246 -0
- package/audit/services/audit-context.service.d.ts +91 -0
- package/audit/services/audit-context.service.js +170 -0
- package/audit/services/entity-audit.service.d.ts +220 -9
- package/audit/services/entity-audit.service.js +761 -72
- package/audit/services/index.d.ts +3 -0
- package/audit/services/index.js +3 -0
- package/audit/services/manual-audit-log.service.d.ts +23 -23
- package/audit/services/manual-audit-log.service.js +34 -57
- package/audit/services/multi-database.service.d.ts +0 -5
- package/audit/services/multi-database.service.js +0 -24
- package/audit/services/operation-description.service.d.ts +14 -3
- package/audit/services/operation-description.service.js +165 -26
- package/audit/services/transaction-audit.service.d.ts +1 -0
- package/audit/services/transaction-audit.service.js +12 -9
- package/audit/subscribers/entity-audit.subscriber.d.ts +5 -0
- package/audit/subscribers/entity-audit.subscriber.js +69 -5
- package/cache/cache.module.d.ts +7 -8
- package/cache/cache.module.js +15 -13
- package/cache/cache.service.d.ts +6 -4
- package/cache/cache.service.js +24 -12
- package/cache/decorators/cache-put.decorator.js +5 -4
- package/cache/dependencies/callback.dependency.js +9 -0
- package/cache/dependencies/db.dependency.d.ts +43 -12
- package/cache/dependencies/db.dependency.js +46 -18
- package/cache/dependencies/tag.dependency.d.ts +31 -4
- package/cache/dependencies/tag.dependency.js +100 -11
- package/cache/entities/index.d.ts +1 -0
- package/cache/entities/index.js +17 -0
- package/cache/entities/typeorm-cache.entity.d.ts +71 -0
- package/cache/entities/typeorm-cache.entity.js +110 -0
- package/cache/index.d.ts +2 -1
- package/cache/index.js +19 -2
- package/cache/interfaces/cache-options.interface.d.ts +8 -0
- package/cache/providers/index.d.ts +2 -1
- package/cache/providers/index.js +2 -1
- package/cache/providers/lrucache.provider.d.ts +77 -0
- package/cache/providers/lrucache.provider.js +228 -0
- package/cache/providers/redis-cache.provider.d.ts +1 -0
- package/cache/providers/redis-cache.provider.js +8 -6
- package/cache/providers/typeorm-cache.provider.d.ts +211 -0
- package/cache/providers/typeorm-cache.provider.js +483 -0
- package/common/boilerplate.polyfill.d.ts +1 -0
- package/common/boilerplate.polyfill.js +18 -1
- package/common/helpers/validation-metadata-helper.d.ts +112 -0
- package/common/helpers/validation-metadata-helper.js +164 -0
- package/common/index.d.ts +1 -0
- package/common/index.js +4 -0
- package/decorators/examples/field-i18n.example.d.ts +294 -0
- package/decorators/examples/field-i18n.example.js +478 -0
- package/decorators/field.decorators.d.ts +95 -3
- package/decorators/field.decorators.js +152 -18
- package/decorators/transform.decorators.d.ts +0 -2
- package/decorators/transform.decorators.js +0 -23
- package/decorators/translate.decorator.d.ts +26 -0
- package/decorators/translate.decorator.js +26 -1
- package/email-log/email-log.constants.d.ts +8 -0
- package/email-log/email-log.constants.js +11 -0
- package/email-log/email-log.module.d.ts +47 -0
- package/email-log/email-log.module.js +140 -0
- package/email-log/index.d.ts +11 -0
- package/email-log/index.js +48 -0
- package/email-log/interfaces/email-log-options.interface.d.ts +61 -0
- package/email-log/interfaces/email-log-options.interface.js +134 -0
- package/email-log/interfaces/email-log-transport.interface.d.ts +20 -0
- package/email-log/interfaces/email-log-transport.interface.js +2 -0
- package/email-log/interfaces/index.d.ts +2 -0
- package/email-log/interfaces/index.js +18 -0
- package/email-log/providers/email-provider.d.ts +42 -0
- package/email-log/providers/email-provider.js +127 -0
- package/email-log/providers/index.d.ts +1 -0
- package/email-log/providers/index.js +17 -0
- package/email-log/services/email-log-alert.service.d.ts +46 -0
- package/email-log/services/email-log-alert.service.js +162 -0
- package/email-log/services/email-log-formatter.service.d.ts +78 -0
- package/email-log/services/email-log-formatter.service.js +442 -0
- package/email-log/services/email-log-logger.service.d.ts +85 -0
- package/email-log/services/email-log-logger.service.js +168 -0
- package/email-log/services/email-log-rate-limiter.service.d.ts +42 -0
- package/email-log/services/email-log-rate-limiter.service.js +110 -0
- package/email-log/services/email-log-transport.service.d.ts +80 -0
- package/email-log/services/email-log-transport.service.js +271 -0
- package/email-log/services/index.d.ts +5 -0
- package/email-log/services/index.js +21 -0
- package/email-log/transports/index.d.ts +1 -0
- package/email-log/transports/index.js +17 -0
- package/email-log/transports/pino-email.transport.d.ts +56 -0
- package/email-log/transports/pino-email.transport.js +188 -0
- package/email-log/utils/index.d.ts +2 -0
- package/email-log/utils/index.js +18 -0
- package/email-log/utils/log-level.helper.d.ts +46 -0
- package/email-log/utils/log-level.helper.js +74 -0
- package/email-log/utils/pino-transport.utils.d.ts +135 -0
- package/email-log/utils/pino-transport.utils.js +238 -0
- package/file-upload/controllers/file-access.controller.d.ts +23 -0
- package/file-upload/controllers/file-access.controller.js +128 -0
- package/file-upload/decorators/column.decorator.d.ts +151 -0
- package/file-upload/decorators/column.decorator.js +273 -0
- package/file-upload/decorators/csv-data.decorator.d.ts +30 -0
- package/file-upload/decorators/csv-data.decorator.js +85 -0
- package/file-upload/decorators/csv-import.decorator.d.ts +34 -0
- package/file-upload/decorators/csv-import.decorator.js +24 -0
- package/file-upload/decorators/examples/column-mapping.example.d.ts +76 -0
- package/file-upload/decorators/examples/column-mapping.example.js +122 -0
- package/file-upload/decorators/excel-data.decorator.d.ts +30 -0
- package/file-upload/decorators/excel-data.decorator.js +85 -0
- package/file-upload/decorators/file-upload.decorator.d.ts +83 -0
- package/file-upload/decorators/file-upload.decorator.js +172 -0
- package/file-upload/decorators/index.d.ts +5 -0
- package/file-upload/decorators/index.js +38 -0
- package/file-upload/decorators/process.decorator.d.ts +40 -0
- package/file-upload/decorators/process.decorator.js +52 -0
- package/file-upload/decorators/validate-data.decorator.d.ts +91 -0
- package/file-upload/decorators/validate-data.decorator.js +39 -0
- package/file-upload/dto/create-file.dto.d.ts +24 -0
- package/file-upload/dto/create-file.dto.js +112 -0
- package/file-upload/dto/find-files.dto.d.ts +15 -0
- package/file-upload/dto/find-files.dto.js +76 -0
- package/file-upload/dto/index.d.ts +4 -0
- package/file-upload/dto/index.js +20 -0
- package/file-upload/dto/pagination.dto.d.ts +7 -0
- package/file-upload/dto/pagination.dto.js +39 -0
- package/file-upload/dto/update-file.dto.d.ts +15 -0
- package/file-upload/dto/update-file.dto.js +67 -0
- package/file-upload/entities/file-metadata.entity.d.ts +25 -0
- package/file-upload/entities/file-metadata.entity.js +76 -0
- package/file-upload/entities/file.entity.d.ts +114 -0
- package/file-upload/entities/file.entity.js +350 -0
- package/file-upload/entities/index.d.ts +2 -0
- package/file-upload/entities/index.js +18 -0
- package/file-upload/enums/file-type.enum.d.ts +72 -0
- package/file-upload/enums/file-type.enum.js +212 -0
- package/file-upload/exceptions/file-upload.exception.d.ts +57 -0
- package/file-upload/exceptions/file-upload.exception.js +120 -0
- package/file-upload/exceptions/index.d.ts +1 -0
- package/file-upload/exceptions/index.js +17 -0
- package/file-upload/file-upload.module.d.ts +89 -0
- package/file-upload/file-upload.module.js +292 -0
- package/file-upload/index.d.ts +37 -0
- package/file-upload/index.js +77 -0
- package/file-upload/interceptors/file-upload.interceptor.d.ts +101 -0
- package/file-upload/interceptors/file-upload.interceptor.js +594 -0
- package/file-upload/interceptors/index.d.ts +1 -0
- package/file-upload/interceptors/index.js +17 -0
- package/file-upload/interfaces/custom-file-type.interface.d.ts +72 -0
- package/file-upload/interfaces/custom-file-type.interface.js +2 -0
- package/file-upload/interfaces/file-buffer.interface.d.ts +72 -0
- package/file-upload/interfaces/file-buffer.interface.js +2 -0
- package/file-upload/interfaces/file-entity.interface.d.ts +142 -0
- package/file-upload/interfaces/file-entity.interface.js +28 -0
- package/file-upload/interfaces/file-metadata.interface.d.ts +21 -0
- package/file-upload/interfaces/file-metadata.interface.js +2 -0
- package/file-upload/interfaces/file-processor.interface.d.ts +93 -0
- package/file-upload/interfaces/file-processor.interface.js +2 -0
- package/file-upload/interfaces/file-upload-options.interface.d.ts +74 -0
- package/file-upload/interfaces/file-upload-options.interface.js +5 -0
- package/file-upload/interfaces/index.d.ts +7 -0
- package/file-upload/interfaces/index.js +24 -0
- package/file-upload/interfaces/processor-options.interface.d.ts +102 -0
- package/file-upload/interfaces/processor-options.interface.js +2 -0
- package/file-upload/interfaces/storage-provider.interface.d.ts +239 -0
- package/file-upload/interfaces/storage-provider.interface.js +2 -0
- package/file-upload/interfaces/upload-options.interface.d.ts +19 -0
- package/file-upload/interfaces/upload-options.interface.js +2 -0
- package/file-upload/processors/csv.processor.d.ts +98 -0
- package/file-upload/processors/csv.processor.js +391 -0
- package/file-upload/processors/excel.processor.d.ts +130 -0
- package/file-upload/processors/excel.processor.js +547 -0
- package/file-upload/processors/image.processor.d.ts +199 -0
- package/file-upload/processors/image.processor.js +377 -0
- package/file-upload/providers/index.d.ts +2 -0
- package/file-upload/providers/index.js +18 -0
- package/file-upload/providers/local-storage.provider.d.ts +98 -0
- package/file-upload/providers/local-storage.provider.js +484 -0
- package/file-upload/providers/s3-storage.provider.d.ts +87 -0
- package/file-upload/providers/s3-storage.provider.js +455 -0
- package/file-upload/services/file-signature-validator.service.d.ts +118 -0
- package/file-upload/services/file-signature-validator.service.js +376 -0
- package/file-upload/services/file.service.d.ts +193 -0
- package/file-upload/services/file.service.js +638 -0
- package/file-upload/services/index.d.ts +4 -0
- package/file-upload/services/index.js +20 -0
- package/file-upload/services/malicious-file-detector.service.d.ts +300 -0
- package/file-upload/services/malicious-file-detector.service.js +1234 -0
- package/file-upload/services/mime-registry.service.d.ts +47 -0
- package/file-upload/services/mime-registry.service.js +167 -0
- package/file-upload/utils/checksum.util.d.ts +28 -0
- package/file-upload/utils/checksum.util.js +65 -0
- package/file-upload/utils/dynamic-import.util.d.ts +54 -0
- package/file-upload/utils/dynamic-import.util.js +156 -0
- package/file-upload/utils/filename.util.d.ts +59 -0
- package/file-upload/utils/filename.util.js +184 -0
- package/file-upload/utils/filepath.util.d.ts +70 -0
- package/file-upload/utils/filepath.util.js +152 -0
- package/file-upload/utils/index.d.ts +4 -0
- package/file-upload/utils/index.js +20 -0
- package/filters/bad-request.filter.d.ts +9 -0
- package/filters/bad-request.filter.js +57 -16
- package/http-client/config/http-client.config.d.ts +5 -0
- package/http-client/config/http-client.config.js +27 -14
- package/http-client/decorators/http-client.decorators.d.ts +7 -28
- package/http-client/decorators/http-client.decorators.js +124 -99
- package/http-client/entities/http-log.entity.d.ts +0 -20
- package/http-client/entities/http-log.entity.js +1 -21
- package/http-client/examples/advanced-usage.example.d.ts +4 -5
- package/http-client/examples/advanced-usage.example.js +7 -59
- package/http-client/examples/axios-config-extended.example.d.ts +17 -0
- package/http-client/examples/axios-config-extended.example.js +311 -0
- package/http-client/examples/flexible-response-example.d.ts +28 -0
- package/http-client/examples/flexible-response-example.js +120 -0
- package/http-client/examples/index.d.ts +2 -0
- package/http-client/examples/index.js +2 -0
- package/http-client/examples/proxy-from-environment.example.d.ts +133 -0
- package/http-client/examples/proxy-from-environment.example.js +409 -0
- package/http-client/examples/ssl-certificate.example.d.ts +47 -0
- package/http-client/examples/ssl-certificate.example.js +432 -0
- package/http-client/http-client.module.d.ts +43 -2
- package/http-client/http-client.module.js +150 -90
- package/http-client/index.d.ts +1 -1
- package/http-client/interfaces/api-client-config.interface.d.ts +24 -103
- package/http-client/interfaces/http-client-config.interface.d.ts +137 -62
- package/http-client/services/api-client-registry.service.d.ts +8 -21
- package/http-client/services/api-client-registry.service.js +31 -282
- package/http-client/services/circuit-breaker.service.d.ts +69 -2
- package/http-client/services/circuit-breaker.service.js +185 -7
- package/http-client/services/http-client.service.d.ts +85 -23
- package/http-client/services/http-client.service.js +512 -168
- package/http-client/services/http-log-query.service.js +0 -13
- package/http-client/services/index.d.ts +0 -1
- package/http-client/services/index.js +0 -1
- package/http-client/services/logging.service.d.ts +69 -16
- package/http-client/services/logging.service.js +290 -170
- package/http-client/utils/call-stack-extractor.util.d.ts +26 -0
- package/http-client/utils/call-stack-extractor.util.js +35 -0
- package/http-client/utils/context-extractor.util.d.ts +2 -0
- package/http-client/utils/context-extractor.util.js +17 -3
- package/http-client/utils/curl-generator.util.js +2 -5
- package/http-client/utils/index.d.ts +2 -0
- package/http-client/utils/index.js +2 -0
- package/http-client/utils/proxy-environment.util.d.ts +42 -0
- package/http-client/utils/proxy-environment.util.js +154 -0
- package/http-client/utils/retry-recorder.util.d.ts +0 -4
- package/http-client/utils/retry-recorder.util.js +2 -27
- package/http-client/utils/sanitize.util.d.ts +58 -0
- package/http-client/utils/sanitize.util.js +188 -0
- package/http-client/utils/security-validator.util.d.ts +118 -0
- package/http-client/utils/security-validator.util.js +354 -0
- package/index.d.ts +4 -1
- package/index.js +6 -1
- package/interceptors/translation-interceptor.service.d.ts +7 -0
- package/interceptors/translation-interceptor.service.js +40 -8
- package/ip-filter/constants.d.ts +21 -0
- package/ip-filter/constants.js +24 -0
- package/ip-filter/decorators/index.d.ts +1 -0
- package/ip-filter/decorators/index.js +17 -0
- package/ip-filter/decorators/ip-filter.decorator.d.ts +58 -0
- package/ip-filter/decorators/ip-filter.decorator.js +79 -0
- package/ip-filter/guards/index.d.ts +1 -0
- package/ip-filter/guards/index.js +17 -0
- package/ip-filter/guards/ip-filter.guard.d.ts +62 -0
- package/ip-filter/guards/ip-filter.guard.js +174 -0
- package/ip-filter/index.d.ts +7 -0
- package/ip-filter/index.js +23 -0
- package/ip-filter/interfaces/index.d.ts +4 -0
- package/ip-filter/interfaces/index.js +20 -0
- package/ip-filter/interfaces/ip-filter-async-options.interface.d.ts +15 -0
- package/ip-filter/interfaces/ip-filter-async-options.interface.js +2 -0
- package/ip-filter/interfaces/ip-filter-metadata.interface.d.ts +26 -0
- package/ip-filter/interfaces/ip-filter-metadata.interface.js +2 -0
- package/ip-filter/interfaces/ip-filter-options.interface.d.ts +34 -0
- package/ip-filter/interfaces/ip-filter-options.interface.js +2 -0
- package/ip-filter/interfaces/ip-rule.interface.d.ts +36 -0
- package/ip-filter/interfaces/ip-rule.interface.js +2 -0
- package/ip-filter/ip-filter.module.d.ts +55 -0
- package/ip-filter/ip-filter.module.js +105 -0
- package/ip-filter/services/index.d.ts +1 -0
- package/ip-filter/services/index.js +17 -0
- package/ip-filter/services/ip-filter.service.d.ts +92 -0
- package/ip-filter/services/ip-filter.service.js +238 -0
- package/ip-filter/utils/index.d.ts +1 -0
- package/ip-filter/utils/index.js +17 -0
- package/ip-filter/utils/ip-utils.d.ts +61 -0
- package/ip-filter/utils/ip-utils.js +162 -0
- package/package.json +34 -29
- package/providers/context.provider.d.ts +9 -0
- package/providers/context.provider.js +13 -0
- package/redis-lock/comprehensive-lock-cleanup.service.d.ts +94 -0
- package/redis-lock/comprehensive-lock-cleanup.service.js +253 -0
- package/redis-lock/index.d.ts +2 -0
- package/redis-lock/index.js +5 -1
- package/redis-lock/lock-heartbeat.service.d.ts +80 -0
- package/redis-lock/lock-heartbeat.service.js +232 -0
- package/redis-lock/redis-lock.module.d.ts +6 -0
- package/redis-lock/redis-lock.module.js +136 -77
- package/redis-lock/redis-lock.service.d.ts +31 -0
- package/redis-lock/redis-lock.service.js +124 -17
- package/setup/bootstrap.setup.d.ts +2 -1
- package/setup/bootstrap.setup.js +3 -2
- package/setup/index.d.ts +1 -0
- package/setup/index.js +1 -0
- package/setup/run-in-mode.decorator.d.ts +56 -0
- package/setup/run-in-mode.decorator.js +92 -0
- package/setup/schedule.decorator.d.ts +1 -0
- package/setup/schedule.decorator.js +28 -13
- package/setup/worker.decorator.js +10 -1
- package/shared/index.d.ts +1 -1
- package/shared/index.js +1 -1
- package/shared/{serviceRegistryModule.js → service-registry.module.js} +28 -17
- package/shared/services/api-config.service.d.ts +41 -0
- package/shared/services/api-config.service.js +166 -8
- package/shared/services/index.d.ts +0 -1
- package/shared/services/index.js +0 -1
- package/validators/custom-validate.validator.d.ts +1 -0
- package/validators/custom-validate.validator.js +1 -0
- package/validators/file-mimetype.validator.d.ts +0 -2
- package/validators/file-mimetype.validator.js +4 -6
- package/validators/is-exists.validator.d.ts +15 -6
- package/validators/is-exists.validator.js +8 -7
- package/validators/is-unique.validator.d.ts +22 -7
- package/validators/is-unique.validator.js +41 -17
- package/vault/vault-config.service.js +1 -1
- package/cache/providers/memory-cache.provider.d.ts +0 -49
- package/cache/providers/memory-cache.provider.js +0 -197
- package/http-client/services/cache.service.d.ts +0 -76
- package/http-client/services/cache.service.js +0 -333
- package/shared/services/validator.service.d.ts +0 -3
- package/shared/services/validator.service.js +0 -20
- /package/shared/{serviceRegistryModule.d.ts → service-registry.module.d.ts} +0 -0
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.createEmailTransport = createEmailTransport;
|
|
13
|
+
exports.createPinoMultistream = createPinoMultistream;
|
|
14
|
+
exports.createPinoEmailLogger = createPinoEmailLogger;
|
|
15
|
+
exports.attachEmailTransportToLogger = attachEmailTransportToLogger;
|
|
16
|
+
exports.createPinoEmailChildLogger = createPinoEmailChildLogger;
|
|
17
|
+
exports.createEmailTransportFromEnv = createEmailTransportFromEnv;
|
|
18
|
+
const pino_1 = require("pino");
|
|
19
|
+
const pino_email_transport_1 = require("../transports/pino-email.transport");
|
|
20
|
+
/**
|
|
21
|
+
* Create a Pino transport stream for email logging
|
|
22
|
+
* This function creates a writable stream that can be used with Pino
|
|
23
|
+
*
|
|
24
|
+
* @param options Email log options
|
|
25
|
+
* @returns A Pino transport configuration
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```typescript
|
|
29
|
+
* import { createEmailTransport } from '@nest-omni/core';
|
|
30
|
+
* import pino from 'pino';
|
|
31
|
+
*
|
|
32
|
+
* const transport = createEmailTransport({
|
|
33
|
+
* enabled: true,
|
|
34
|
+
* to: ['admin@example.com'],
|
|
35
|
+
* from: 'noreply@example.com',
|
|
36
|
+
* smtpHost: 'smtp.example.com',
|
|
37
|
+
* });
|
|
38
|
+
*
|
|
39
|
+
* const logger = pino(transport);
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
function createEmailTransport(options) {
|
|
43
|
+
return new pino_email_transport_1.PinoEmailTransport(options);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Create a Pino multistream configuration that includes email transport
|
|
47
|
+
*
|
|
48
|
+
* @param options Email log options
|
|
49
|
+
* @param emailTransport The email transport service instance or PinoEmailTransport
|
|
50
|
+
* @returns Pino multistream targets array
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```typescript
|
|
54
|
+
* import { createPinoMultistream } from '@nest-omni/core';
|
|
55
|
+
* import pino from 'pino';
|
|
56
|
+
*
|
|
57
|
+
* const streams = createPinoMultistream(options, emailTransport);
|
|
58
|
+
* const logger = pino(pino.multistream(streams));
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
function createPinoMultistream(options, emailTransport) {
|
|
62
|
+
const streams = [
|
|
63
|
+
// Default stdout stream - log everything to console
|
|
64
|
+
{
|
|
65
|
+
level: 'trace',
|
|
66
|
+
stream: process.stdout,
|
|
67
|
+
},
|
|
68
|
+
];
|
|
69
|
+
// Add email transport if enabled
|
|
70
|
+
if (options.enabled) {
|
|
71
|
+
streams.push({
|
|
72
|
+
level: options.level,
|
|
73
|
+
stream: emailTransport, // Both EmailLogTransportService and PinoEmailTransport are writable streams
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
return streams;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Create a Pino logger with email transport already configured
|
|
80
|
+
* This is the simplest way to get started with email logging
|
|
81
|
+
*
|
|
82
|
+
* @param options Email log options
|
|
83
|
+
* @param baseLogger Optional base Pino logger to extend
|
|
84
|
+
* @returns Pino logger with email transport
|
|
85
|
+
*
|
|
86
|
+
* @example
|
|
87
|
+
* ```typescript
|
|
88
|
+
* import { createPinoEmailLogger } from '@nest-omni/core';
|
|
89
|
+
*
|
|
90
|
+
* const logger = createPinoEmailLogger({
|
|
91
|
+
* enabled: true,
|
|
92
|
+
* to: ['admin@example.com'],
|
|
93
|
+
* from: 'noreply@example.com',
|
|
94
|
+
* smtpHost: 'smtp.example.com',
|
|
95
|
+
* });
|
|
96
|
+
*
|
|
97
|
+
* logger.error('Something went wrong!', { userId: '123' });
|
|
98
|
+
* // This will log to console AND send an email
|
|
99
|
+
* ```
|
|
100
|
+
*/
|
|
101
|
+
function createPinoEmailLogger(options, baseLogger) {
|
|
102
|
+
const transport = createEmailTransport(options);
|
|
103
|
+
if (!options.enabled) {
|
|
104
|
+
// If disabled, return a basic logger
|
|
105
|
+
return baseLogger || (0, pino_1.default)({ level: options.level });
|
|
106
|
+
}
|
|
107
|
+
const streams = createPinoMultistream(options, transport);
|
|
108
|
+
if (baseLogger) {
|
|
109
|
+
// Extend existing logger with email transport
|
|
110
|
+
return (0, pino_1.default)(Object.assign({}, baseLogger.options), pino_1.default.multistream(streams));
|
|
111
|
+
}
|
|
112
|
+
// Create new logger with email transport
|
|
113
|
+
return (0, pino_1.default)({
|
|
114
|
+
level: 'trace', // Log everything to console
|
|
115
|
+
}, pino_1.default.multistream(streams));
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Manually attach email transport to an existing Pino logger
|
|
119
|
+
* Use this if you want to add email logging to a specific logger instance
|
|
120
|
+
*
|
|
121
|
+
* @param logger The Pino logger instance
|
|
122
|
+
* @param options Email log options
|
|
123
|
+
* @param emailTransport The email transport service instance
|
|
124
|
+
*
|
|
125
|
+
* @example
|
|
126
|
+
* ```typescript
|
|
127
|
+
* import { attachEmailTransportToLogger } from '@nest-omni/core';
|
|
128
|
+
*
|
|
129
|
+
* attachEmailTransportToLogger(myLogger, options, emailTransport);
|
|
130
|
+
* ```
|
|
131
|
+
*/
|
|
132
|
+
function attachEmailTransportToLogger(logger, options, emailTransport) {
|
|
133
|
+
var _a;
|
|
134
|
+
const minLevel = pino_1.default.levels.values[options.level] || pino_1.default.levels.values.error || 50;
|
|
135
|
+
// Store original write method
|
|
136
|
+
const loggerInstance = logger;
|
|
137
|
+
const originalFlush = (_a = loggerInstance.flush) === null || _a === void 0 ? void 0 : _a.bind(loggerInstance);
|
|
138
|
+
// Override flush to include email transport flush
|
|
139
|
+
if (originalFlush) {
|
|
140
|
+
loggerInstance.flush = (cb) => __awaiter(this, void 0, void 0, function* () {
|
|
141
|
+
yield originalFlush(cb);
|
|
142
|
+
if (typeof emailTransport.flush === 'function') {
|
|
143
|
+
yield emailTransport.flush();
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
// Add the email transport as a child stream
|
|
148
|
+
const transport = {
|
|
149
|
+
write: (data) => {
|
|
150
|
+
const level = typeof data.level === 'number'
|
|
151
|
+
? data.level
|
|
152
|
+
: pino_1.default.levels.values[data.level] || 30;
|
|
153
|
+
if (level >= minLevel) {
|
|
154
|
+
emailTransport.write(data);
|
|
155
|
+
}
|
|
156
|
+
},
|
|
157
|
+
};
|
|
158
|
+
// Try to use pino.multistream if available
|
|
159
|
+
try {
|
|
160
|
+
const streams = createPinoMultistream(options, emailTransport);
|
|
161
|
+
const newLogger = (0, pino_1.default)(pino_1.default.multistream(streams));
|
|
162
|
+
// Copy all properties from old logger to new one
|
|
163
|
+
Object.assign(loggerInstance, newLogger);
|
|
164
|
+
}
|
|
165
|
+
catch (_b) {
|
|
166
|
+
// pino.multistream not available, use manual approach
|
|
167
|
+
emailTransport._loggerTransport = transport;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Create a child logger with email context
|
|
172
|
+
* Useful for adding consistent metadata to all logs from a module
|
|
173
|
+
*
|
|
174
|
+
* @param parentLogger The parent Pino logger
|
|
175
|
+
* @param context Context object to include in all logs
|
|
176
|
+
* @returns Child Pino logger
|
|
177
|
+
*
|
|
178
|
+
* @example
|
|
179
|
+
* ```typescript
|
|
180
|
+
* import { createPinoEmailLogger, createPinoEmailChildLogger } from '@nest-omni/core';
|
|
181
|
+
*
|
|
182
|
+
* const baseLogger = createPinoEmailLogger(options);
|
|
183
|
+
* const userServiceLogger = createPinoEmailChildLogger(baseLogger, {
|
|
184
|
+
* module: 'UserService',
|
|
185
|
+
* version: '1.0.0',
|
|
186
|
+
* });
|
|
187
|
+
*
|
|
188
|
+
* userServiceLogger.error('User creation failed', { userId: '123' });
|
|
189
|
+
* // Email will include: module, version, userId in context
|
|
190
|
+
* ```
|
|
191
|
+
*/
|
|
192
|
+
function createPinoEmailChildLogger(parentLogger, context) {
|
|
193
|
+
return parentLogger.child(context);
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Configure Pino email transport from environment variables
|
|
197
|
+
* This is a convenience function that reads from process.env
|
|
198
|
+
*
|
|
199
|
+
* @returns PinoEmailTransport instance or null if not configured
|
|
200
|
+
*
|
|
201
|
+
* @example
|
|
202
|
+
* ```typescript
|
|
203
|
+
* import { createEmailTransportFromEnv } from '@nest-omni/core';
|
|
204
|
+
* import pino from 'pino';
|
|
205
|
+
*
|
|
206
|
+
* const emailTransport = createEmailTransportFromEnv();
|
|
207
|
+
* const logger = emailTransport
|
|
208
|
+
* ? pino(pino.multistream([
|
|
209
|
+
* { level: 'trace', stream: process.stdout },
|
|
210
|
+
* { level: 'error', stream: emailTransport },
|
|
211
|
+
* ]))
|
|
212
|
+
* : pino();
|
|
213
|
+
* ```
|
|
214
|
+
*/
|
|
215
|
+
function createEmailTransportFromEnv() {
|
|
216
|
+
const enabled = process.env.EMAIL_LOG_ENABLED === 'true';
|
|
217
|
+
if (!enabled) {
|
|
218
|
+
return null;
|
|
219
|
+
}
|
|
220
|
+
const options = {
|
|
221
|
+
enabled: true,
|
|
222
|
+
to: (process.env.EMAIL_LOG_TO || '').split(',').map(e => e.trim()).filter(Boolean),
|
|
223
|
+
from: process.env.EMAIL_LOG_FROM || 'noreply@example.com',
|
|
224
|
+
level: process.env.EMAIL_LOG_LEVEL || 'error',
|
|
225
|
+
subjectPrefix: process.env.EMAIL_LOG_SUBJECT_PREFIX || '[Log Alert]',
|
|
226
|
+
smtpHost: process.env.EMAIL_LOG_SMTP_HOST || 'localhost',
|
|
227
|
+
smtpPort: parseInt(process.env.EMAIL_LOG_SMTP_PORT || '587'),
|
|
228
|
+
smtpUsername: process.env.EMAIL_LOG_SMTP_USERNAME || '',
|
|
229
|
+
smtpPassword: process.env.EMAIL_LOG_SMTP_PASSWORD || '',
|
|
230
|
+
smtpSecure: process.env.EMAIL_LOG_SMTP_SECURE === 'true',
|
|
231
|
+
smtpIgnoreTLSError: process.env.EMAIL_LOG_SMTP_IGNORE_TLS_ERROR === 'true',
|
|
232
|
+
rateLimitMaxEmails: parseInt(process.env.EMAIL_LOG_RATE_LIMIT_MAX_EMAILS || '10'),
|
|
233
|
+
rateLimitWindowMs: parseInt(process.env.EMAIL_LOG_RATE_LIMIT_WINDOW_MS || '60000'),
|
|
234
|
+
rateLimitBurstSize: parseInt(process.env.EMAIL_LOG_RATE_LIMIT_BURST_SIZE || '3'),
|
|
235
|
+
useHtmlFormat: process.env.EMAIL_LOG_USE_HTML_FORMAT !== 'false',
|
|
236
|
+
};
|
|
237
|
+
return new pino_email_transport_1.PinoEmailTransport(options);
|
|
238
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { StreamableFile } from '@nestjs/common';
|
|
2
|
+
import { Response } from 'express';
|
|
3
|
+
import { FileService } from '../services/file.service';
|
|
4
|
+
/**
|
|
5
|
+
* 文件访问控制器
|
|
6
|
+
* 提供文件下载和预览功能
|
|
7
|
+
* 注意:Controller 仅负责 HTTP 层逻辑,业务逻辑在 FileService
|
|
8
|
+
*/
|
|
9
|
+
export declare class FileAccessController {
|
|
10
|
+
private readonly fileService;
|
|
11
|
+
private readonly logger;
|
|
12
|
+
constructor(fileService: FileService);
|
|
13
|
+
/**
|
|
14
|
+
* 通过文件 ID 下载/访问文件
|
|
15
|
+
* GET /files/:id
|
|
16
|
+
*/
|
|
17
|
+
getFile(id: string, res: Response): Promise<StreamableFile>;
|
|
18
|
+
/**
|
|
19
|
+
* 通过文件 ID 下载文件(强制下载)
|
|
20
|
+
* GET /files/:id/download
|
|
21
|
+
*/
|
|
22
|
+
downloadFile(id: string, res: Response): Promise<StreamableFile>;
|
|
23
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
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 __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
15
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
16
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
17
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
18
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
19
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
20
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
var FileAccessController_1;
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
exports.FileAccessController = void 0;
|
|
26
|
+
const common_1 = require("@nestjs/common");
|
|
27
|
+
const file_service_1 = require("../services/file.service");
|
|
28
|
+
/**
|
|
29
|
+
* 文件访问控制器
|
|
30
|
+
* 提供文件下载和预览功能
|
|
31
|
+
* 注意:Controller 仅负责 HTTP 层逻辑,业务逻辑在 FileService
|
|
32
|
+
*/
|
|
33
|
+
let FileAccessController = FileAccessController_1 = class FileAccessController {
|
|
34
|
+
constructor(fileService) {
|
|
35
|
+
this.fileService = fileService;
|
|
36
|
+
this.logger = new common_1.Logger(FileAccessController_1.name);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* 通过文件 ID 下载/访问文件
|
|
40
|
+
* GET /files/:id
|
|
41
|
+
*/
|
|
42
|
+
getFile(id, res) {
|
|
43
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
44
|
+
// 从数据库获取文件记录
|
|
45
|
+
const fileEntity = yield this.fileService.findById(id);
|
|
46
|
+
if (!fileEntity) {
|
|
47
|
+
throw new common_1.NotFoundException(`文件不存在: ${id}`);
|
|
48
|
+
}
|
|
49
|
+
// 检查文件是否可访问
|
|
50
|
+
if (fileEntity.status !== 'completed') {
|
|
51
|
+
throw new common_1.NotFoundException(`文件尚未准备就绪: ${id}`);
|
|
52
|
+
}
|
|
53
|
+
// 对象存储:重定向到预签名 URL
|
|
54
|
+
if (['s3', 'oss', 'minio', 'cdn'].includes(fileEntity.storageProvider)) {
|
|
55
|
+
try {
|
|
56
|
+
const signedUrl = yield this.fileService.getSignedUrl(id);
|
|
57
|
+
res.redirect(302, signedUrl);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
this.logger.error(`Failed to get signed URL for file ${id}: ${error.message}`);
|
|
62
|
+
throw new common_1.NotFoundException(`无法访问文件: ${id}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// 本地存储:流式返回
|
|
66
|
+
if (fileEntity.storageProvider === 'local') {
|
|
67
|
+
try {
|
|
68
|
+
const stream = yield this.fileService.getFileStream(id);
|
|
69
|
+
res.set({
|
|
70
|
+
'Content-Type': fileEntity.mimeType,
|
|
71
|
+
'Content-Length': fileEntity.size.toString(),
|
|
72
|
+
});
|
|
73
|
+
return new common_1.StreamableFile(stream);
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
this.logger.error(`Failed to stream file ${id}: ${error.message}`);
|
|
77
|
+
throw new common_1.NotFoundException(`无法访问文件: ${id}`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// 不支持的存储类型
|
|
81
|
+
throw new common_1.NotFoundException(`不支持的存储类型: ${fileEntity.storageProvider}`);
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* 通过文件 ID 下载文件(强制下载)
|
|
86
|
+
* GET /files/:id/download
|
|
87
|
+
*/
|
|
88
|
+
downloadFile(id, res) {
|
|
89
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
90
|
+
const fileEntity = yield this.fileService.findById(id);
|
|
91
|
+
if (!fileEntity) {
|
|
92
|
+
throw new common_1.NotFoundException(`文件不存在: ${id}`);
|
|
93
|
+
}
|
|
94
|
+
if (fileEntity.status !== 'completed') {
|
|
95
|
+
throw new common_1.NotFoundException(`文件尚未准备就绪: ${id}`);
|
|
96
|
+
}
|
|
97
|
+
// 设置下载响应头
|
|
98
|
+
res.set({
|
|
99
|
+
'Content-Disposition': `attachment; filename="${encodeURIComponent(fileEntity.originalName)}"`,
|
|
100
|
+
});
|
|
101
|
+
// 复用 getFile 逻辑
|
|
102
|
+
return this.getFile(id, res);
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
exports.FileAccessController = FileAccessController;
|
|
107
|
+
__decorate([
|
|
108
|
+
(0, common_1.Get)(':id'),
|
|
109
|
+
(0, common_1.Header)('Cache-Control', 'public, max-age=31536000') // 缓存1年
|
|
110
|
+
,
|
|
111
|
+
__param(0, (0, common_1.Param)('id')),
|
|
112
|
+
__param(1, (0, common_1.Res)({ passthrough: true })),
|
|
113
|
+
__metadata("design:type", Function),
|
|
114
|
+
__metadata("design:paramtypes", [String, Object]),
|
|
115
|
+
__metadata("design:returntype", Promise)
|
|
116
|
+
], FileAccessController.prototype, "getFile", null);
|
|
117
|
+
__decorate([
|
|
118
|
+
(0, common_1.Get)(':id/download'),
|
|
119
|
+
__param(0, (0, common_1.Param)('id')),
|
|
120
|
+
__param(1, (0, common_1.Res)({ passthrough: true })),
|
|
121
|
+
__metadata("design:type", Function),
|
|
122
|
+
__metadata("design:paramtypes", [String, Object]),
|
|
123
|
+
__metadata("design:returntype", Promise)
|
|
124
|
+
], FileAccessController.prototype, "downloadFile", null);
|
|
125
|
+
exports.FileAccessController = FileAccessController = FileAccessController_1 = __decorate([
|
|
126
|
+
(0, common_1.Controller)('files'),
|
|
127
|
+
__metadata("design:paramtypes", [file_service_1.FileService])
|
|
128
|
+
], FileAccessController);
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
/**
|
|
3
|
+
* CSV列名映射元数据键
|
|
4
|
+
*/
|
|
5
|
+
export declare const CSV_COLUMN_METADATA = "csv:column";
|
|
6
|
+
/**
|
|
7
|
+
* Excel列名映射元数据键
|
|
8
|
+
*/
|
|
9
|
+
export declare const EXCEL_COLUMN_METADATA = "excel:column";
|
|
10
|
+
/**
|
|
11
|
+
* 列标识类型
|
|
12
|
+
* 可以是列名(字符串)、列序号(数字)或Excel列名(A, B, C)
|
|
13
|
+
*/
|
|
14
|
+
export type ColumnIdentifier = string | number;
|
|
15
|
+
/**
|
|
16
|
+
* CSV列装饰器
|
|
17
|
+
* 用于指定CSV文件中列与DTO属性的映射关系
|
|
18
|
+
* 支持列名、列序号(从0开始)或Excel列名(A, B, C)
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* export class UserImportDto {
|
|
23
|
+
* @CSVColumn('姓名') // 使用列名
|
|
24
|
+
* @CSVColumn(0) // 使用列序号(第一列)
|
|
25
|
+
* @CSVColumn('A') // 使用Excel列名
|
|
26
|
+
* @IsString()
|
|
27
|
+
* @Length(2, 50)
|
|
28
|
+
* name: string;
|
|
29
|
+
*
|
|
30
|
+
* @CSVColumn('年龄') // 使用列名
|
|
31
|
+
* @CSVColumn(1) // 使用列序号(第二列)
|
|
32
|
+
* @CSVColumn('B') // 使用Excel列名
|
|
33
|
+
* @IsNumber()
|
|
34
|
+
* @Min(0)
|
|
35
|
+
* @Max(150)
|
|
36
|
+
* age: number;
|
|
37
|
+
* }
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
export declare function CSVColumn(columnIdentifier: ColumnIdentifier): PropertyDecorator;
|
|
41
|
+
/**
|
|
42
|
+
* Excel列装饰器
|
|
43
|
+
* 用于指定Excel文件中列与DTO属性的映射关系
|
|
44
|
+
* 支持列名、列序号(从0开始)或Excel列名(A, B, C)
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* ```typescript
|
|
48
|
+
* export class ProductImportDto {
|
|
49
|
+
* @ExcelColumn('产品名称') // 使用列名
|
|
50
|
+
* @ExcelColumn(0) // 使用列序号(第一列)
|
|
51
|
+
* @ExcelColumn('A') // 使用Excel列名
|
|
52
|
+
* @IsString()
|
|
53
|
+
* @Length(2, 200)
|
|
54
|
+
* name: string;
|
|
55
|
+
*
|
|
56
|
+
* @ExcelColumn('价格') // 使用列名
|
|
57
|
+
* @ExcelColumn(1) // 使用列序号(第二列)
|
|
58
|
+
* @ExcelColumn('B') // 使用Excel列名
|
|
59
|
+
* @IsNumber()
|
|
60
|
+
* @Min(0)
|
|
61
|
+
* price: number;
|
|
62
|
+
* }
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
export declare function ExcelColumn(columnIdentifier: ColumnIdentifier): PropertyDecorator;
|
|
66
|
+
/**
|
|
67
|
+
* 获取CSV列映射信息
|
|
68
|
+
* 返回列标识到属性名的映射Map
|
|
69
|
+
*
|
|
70
|
+
* @param dtoClass DTO类
|
|
71
|
+
* @returns Map<列标识, 属性名>
|
|
72
|
+
*/
|
|
73
|
+
export declare function getCsvColumnMapping(dtoClass: any): Map<ColumnIdentifier, string>;
|
|
74
|
+
/**
|
|
75
|
+
* 获取Excel列映射信息
|
|
76
|
+
* 返回列标识到属性名的映射Map
|
|
77
|
+
*
|
|
78
|
+
* @param dtoClass DTO类
|
|
79
|
+
* @returns Map<列标识, 属性名>
|
|
80
|
+
*/
|
|
81
|
+
export declare function getExcelColumnMapping(dtoClass: any): Map<ColumnIdentifier, string>;
|
|
82
|
+
/**
|
|
83
|
+
* Excel列名转数字(A=0, B=1, ..., AA=26, AB=27)
|
|
84
|
+
*/
|
|
85
|
+
export declare function excelColumnToNumber(columnLetter: string): number;
|
|
86
|
+
/**
|
|
87
|
+
* 处理行数据
|
|
88
|
+
* 将原始数据行转换为DTO实例,支持多语言错误信息
|
|
89
|
+
* 支持列名、列序号和Excel列名(A, B, C)
|
|
90
|
+
*
|
|
91
|
+
* @param rowData 原始行数据
|
|
92
|
+
* @param dtoClass DTO类
|
|
93
|
+
* @param columnMapping 列映射
|
|
94
|
+
* @param type 数据类型(csv/excel)
|
|
95
|
+
* @returns 转换结果
|
|
96
|
+
*/
|
|
97
|
+
export declare function processRowWithMapping<T>(rowData: any, dtoClass: new () => T, columnMapping: Map<ColumnIdentifier, string>, type: 'csv' | 'excel'): {
|
|
98
|
+
instance: T;
|
|
99
|
+
errors: ValidationError[];
|
|
100
|
+
};
|
|
101
|
+
/**
|
|
102
|
+
* 数字转Excel列名(0=A, 1=B, ..., 26=AA, 27=AB)
|
|
103
|
+
*/
|
|
104
|
+
export declare function numberToExcelColumn(num: number): string;
|
|
105
|
+
/**
|
|
106
|
+
* 验证错误接口
|
|
107
|
+
*/
|
|
108
|
+
interface ValidationError {
|
|
109
|
+
property: string;
|
|
110
|
+
value: any;
|
|
111
|
+
constraints: {
|
|
112
|
+
[key: string]: {
|
|
113
|
+
message: string;
|
|
114
|
+
values?: any[];
|
|
115
|
+
};
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* 格式化验证错误为多语言
|
|
120
|
+
* 支持中英文错误信息
|
|
121
|
+
*
|
|
122
|
+
* @param errors class-validator错误数组
|
|
123
|
+
* @returns 格式化后的错误信息
|
|
124
|
+
*/
|
|
125
|
+
export declare function formatValidationErrors(errors: ValidationError[]): string[];
|
|
126
|
+
/**
|
|
127
|
+
* 创建CSV数据导入结果
|
|
128
|
+
* @param data 成功导入的数据
|
|
129
|
+
* @param errors 错误信息
|
|
130
|
+
* @param totalRows 总行数
|
|
131
|
+
* @param headers 表头信息
|
|
132
|
+
* @returns 导入结果对象
|
|
133
|
+
*/
|
|
134
|
+
export declare function createImportResult<T>(data: T[], errors: {
|
|
135
|
+
row: number;
|
|
136
|
+
errors: string[];
|
|
137
|
+
data: any;
|
|
138
|
+
}[], totalRows: number, headers?: string[]): {
|
|
139
|
+
success: boolean;
|
|
140
|
+
data: T[];
|
|
141
|
+
errors: {
|
|
142
|
+
row: number;
|
|
143
|
+
errors: string[];
|
|
144
|
+
data: any;
|
|
145
|
+
}[];
|
|
146
|
+
totalCount: number;
|
|
147
|
+
successCount: number;
|
|
148
|
+
errorCount: number;
|
|
149
|
+
headers?: string[];
|
|
150
|
+
};
|
|
151
|
+
export {};
|