@nest-omni/core 4.1.3-2 → 4.1.3-22
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 +11 -0
- package/audit/audit.module.js +65 -1
- package/audit/controllers/audit.controller.d.ts +81 -1
- package/audit/controllers/audit.controller.js +67 -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 +9 -1
- package/audit/decorators/audit-controller.decorator.js +11 -2
- package/audit/decorators/audit-operation.decorator.d.ts +38 -0
- package/audit/decorators/audit-operation.decorator.js +42 -0
- package/audit/decorators/entity-audit.decorator.d.ts +85 -1
- package/audit/decorators/entity-audit.decorator.js +153 -3
- 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/audit-log-query.dto.d.ts +3 -0
- package/audit/dto/audit-log-query.dto.js +3 -0
- package/audit/dto/begin-transaction.dto.d.ts +3 -0
- package/audit/dto/begin-transaction.dto.js +3 -0
- package/audit/dto/compare-entities.dto.d.ts +3 -0
- package/audit/dto/compare-entities.dto.js +3 -0
- package/audit/dto/index.d.ts +1 -0
- package/audit/dto/index.js +1 -0
- package/audit/dto/pre-check-restore.dto.d.ts +3 -0
- package/audit/dto/pre-check-restore.dto.js +3 -0
- package/audit/dto/restore-entity.dto.d.ts +3 -0
- package/audit/dto/restore-entity.dto.js +3 -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 +10 -2
- package/audit/entities/entity-audit-log.entity.js +48 -9
- package/audit/entities/entity-transaction.entity.d.ts +11 -2
- package/audit/entities/entity-transaction.entity.js +42 -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 +4 -2
- package/audit/entities/manual-operation-log.entity.js +12 -9
- package/audit/entities/operation-template.entity.d.ts +4 -0
- package/audit/entities/operation-template.entity.js +4 -0
- package/audit/enums/audit.enums.d.ts +29 -6
- package/audit/enums/audit.enums.js +31 -7
- 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 +38 -1
- package/audit/interceptors/audit-action.interceptor.d.ts +38 -0
- package/audit/interceptors/audit-action.interceptor.js +215 -0
- package/audit/interceptors/audit.interceptor.d.ts +16 -0
- package/audit/interceptors/audit.interceptor.js +41 -11
- package/audit/interceptors/index.d.ts +1 -0
- package/audit/interceptors/index.js +1 -0
- package/audit/interfaces/audit.interfaces.d.ts +174 -4
- package/audit/services/audit-action.service.d.ts +141 -0
- package/audit/services/audit-action.service.js +244 -0
- package/audit/services/audit-context.service.d.ts +106 -0
- package/audit/services/audit-context.service.js +185 -0
- package/audit/services/audit-strategy.service.d.ts +6 -0
- package/audit/services/audit-strategy.service.js +13 -0
- package/audit/services/entity-audit.service.d.ts +273 -5
- package/audit/services/entity-audit.service.js +840 -60
- package/audit/services/index.d.ts +3 -0
- package/audit/services/index.js +3 -0
- package/audit/services/manual-audit-log.service.d.ts +133 -9
- package/audit/services/manual-audit-log.service.js +157 -42
- package/audit/services/multi-database.service.d.ts +9 -2
- package/audit/services/multi-database.service.js +9 -21
- package/audit/services/operation-description.service.d.ts +71 -2
- package/audit/services/operation-description.service.js +231 -20
- package/audit/services/transaction-audit.service.d.ts +30 -0
- package/audit/services/transaction-audit.service.js +53 -5
- package/audit/subscribers/entity-audit.subscriber.d.ts +20 -0
- package/audit/subscribers/entity-audit.subscriber.js +98 -6
- package/cache/cache-metrics.service.d.ts +67 -0
- package/cache/cache-metrics.service.js +68 -4
- package/cache/cache-serialization.service.d.ts +31 -0
- package/cache/cache-serialization.service.js +25 -0
- package/cache/cache.constants.d.ts +9 -0
- package/cache/cache.constants.js +9 -0
- package/cache/cache.health.d.ts +26 -0
- package/cache/cache.health.js +30 -0
- package/cache/cache.module.d.ts +87 -2
- package/cache/cache.module.js +84 -11
- package/cache/cache.service.d.ts +143 -3
- package/cache/cache.service.js +173 -4
- package/cache/cache.warmup.service.d.ts +39 -0
- package/cache/cache.warmup.service.js +32 -0
- package/cache/decorators/cache-evict.decorator.d.ts +47 -0
- package/cache/decorators/cache-evict.decorator.js +56 -0
- package/cache/decorators/cache-put.decorator.d.ts +34 -0
- package/cache/decorators/cache-put.decorator.js +39 -0
- package/cache/decorators/cacheable.decorator.d.ts +40 -0
- package/cache/decorators/cacheable.decorator.js +55 -0
- package/cache/dependencies/callback.dependency.d.ts +33 -0
- package/cache/dependencies/callback.dependency.js +39 -1
- package/cache/dependencies/chain.dependency.d.ts +28 -0
- package/cache/dependencies/chain.dependency.js +34 -0
- package/cache/dependencies/db.dependency.d.ts +83 -7
- package/cache/dependencies/db.dependency.js +89 -14
- package/cache/dependencies/file.dependency.d.ts +32 -0
- package/cache/dependencies/file.dependency.js +34 -0
- package/cache/dependencies/tag.dependency.d.ts +75 -4
- package/cache/dependencies/tag.dependency.js +145 -11
- package/cache/dependencies/time.dependency.d.ts +43 -0
- package/cache/dependencies/time.dependency.js +43 -0
- 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/examples/basic-usage.d.ts +15 -0
- package/cache/examples/basic-usage.js +62 -8
- package/cache/index.d.ts +2 -1
- package/cache/index.js +28 -2
- package/cache/interfaces/cache-dependency.interface.d.ts +53 -0
- package/cache/interfaces/cache-options.interface.d.ts +89 -0
- package/cache/interfaces/cache-options.interface.js +6 -0
- package/cache/interfaces/cache-provider.interface.d.ts +78 -0
- package/cache/providers/base-cache.provider.d.ts +14 -0
- package/cache/providers/base-cache.provider.js +16 -0
- package/cache/providers/cls-cache.provider.d.ts +20 -0
- package/cache/providers/cls-cache.provider.js +28 -0
- package/cache/providers/index.d.ts +2 -1
- package/cache/providers/index.js +2 -1
- package/cache/providers/lrucache.provider.d.ts +76 -0
- package/cache/providers/lrucache.provider.js +226 -0
- package/cache/providers/redis-cache.provider.d.ts +26 -0
- package/cache/providers/redis-cache.provider.js +29 -0
- package/cache/providers/typeorm-cache.provider.d.ts +211 -0
- package/cache/providers/typeorm-cache.provider.js +483 -0
- package/cache/utils/dependency-manager.util.d.ts +52 -0
- package/cache/utils/dependency-manager.util.js +59 -0
- package/cache/utils/key-generator.util.d.ts +42 -0
- package/cache/utils/key-generator.util.js +53 -1
- package/common/abstract.entity.d.ts +14 -0
- package/common/abstract.entity.js +14 -0
- package/common/boilerplate.polyfill.d.ts +143 -0
- package/common/boilerplate.polyfill.js +35 -1
- package/common/dto/dto-container.d.ts +16 -0
- package/common/dto/dto-container.js +20 -0
- package/common/dto/dto-decorators.d.ts +18 -0
- package/common/dto/dto-decorators.js +14 -0
- package/common/dto/dto-extensions.d.ts +11 -0
- package/common/dto/dto-extensions.js +9 -0
- package/common/dto/dto-service-accessor.d.ts +17 -0
- package/common/dto/dto-service-accessor.js +18 -0
- package/common/dto/dto-transformer.d.ts +12 -0
- package/common/dto/dto-transformer.js +9 -0
- package/common/dto/index.js +2 -0
- package/common/examples/paginate-and-map.example.d.ts +6 -0
- package/common/examples/paginate-and-map.example.js +26 -0
- package/common/helpers/validation-metadata-helper.d.ts +55 -0
- package/common/helpers/validation-metadata-helper.js +60 -0
- package/common/index.d.ts +1 -0
- package/common/index.js +4 -0
- package/common/utils.d.ts +15 -0
- package/common/utils.js +15 -0
- package/constants/language-code.js +1 -0
- package/decorators/field.decorators.d.ts +72 -3
- package/decorators/field.decorators.js +155 -19
- package/decorators/property.decorators.js +1 -0
- package/decorators/public-route.decorator.js +1 -0
- package/decorators/transform.decorators.d.ts +27 -2
- package/decorators/transform.decorators.js +29 -23
- package/decorators/translate.decorator.js +1 -0
- package/decorators/user.decorator.js +1 -0
- package/decorators/validator.decorators.d.ts +8 -18
- package/decorators/validator.decorators.js +22 -190
- 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.js +19 -4
- package/filters/constraint-errors.js +1 -0
- package/helpers/common.helper.d.ts +13 -0
- package/helpers/common.helper.js +13 -0
- package/http-client/config/http-client.config.d.ts +20 -0
- package/http-client/config/http-client.config.js +48 -21
- package/http-client/decorators/http-client.decorators.d.ts +55 -14
- package/http-client/decorators/http-client.decorators.js +154 -78
- package/http-client/entities/http-log.entity.d.ts +217 -8
- package/http-client/entities/http-log.entity.js +7 -22
- package/http-client/errors/http-client.errors.d.ts +57 -0
- package/http-client/errors/http-client.errors.js +58 -0
- package/http-client/examples/advanced-usage.example.d.ts +40 -0
- package/http-client/examples/advanced-usage.example.js +53 -61
- package/http-client/examples/auth-with-waiting-lock.example.d.ts +31 -0
- package/http-client/examples/auth-with-waiting-lock.example.js +52 -5
- package/http-client/examples/basic-usage.example.d.ts +60 -0
- package/http-client/examples/basic-usage.example.js +60 -0
- package/http-client/examples/multi-api-configuration.example.d.ts +60 -0
- package/http-client/examples/multi-api-configuration.example.js +76 -5
- 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/http-client.module.d.ts +48 -2
- package/http-client/http-client.module.js +147 -68
- package/http-client/index.d.ts +1 -1
- package/http-client/index.js +8 -0
- package/http-client/interfaces/api-client-config.interface.d.ts +80 -45
- package/http-client/interfaces/api-client-config.interface.js +3 -0
- package/http-client/interfaces/http-client-config.interface.d.ts +109 -52
- package/http-client/services/api-client-registry.service.d.ts +50 -11
- package/http-client/services/api-client-registry.service.js +90 -250
- package/http-client/services/circuit-breaker.service.d.ts +115 -2
- package/http-client/services/circuit-breaker.service.js +237 -7
- package/http-client/services/http-client.service.d.ts +124 -14
- package/http-client/services/http-client.service.js +437 -148
- package/http-client/services/http-log-query.service.d.ts +83 -0
- package/http-client/services/http-log-query.service.js +121 -13
- package/http-client/services/http-replay.service.d.ts +101 -0
- package/http-client/services/http-replay.service.js +86 -0
- package/http-client/services/index.d.ts +0 -1
- package/http-client/services/index.js +0 -1
- package/http-client/services/log-cleanup.service.d.ts +63 -0
- package/http-client/services/log-cleanup.service.js +54 -2
- package/http-client/services/logging.service.d.ts +116 -7
- package/http-client/services/logging.service.js +349 -86
- package/http-client/utils/call-stack-extractor.util.d.ts +63 -0
- package/http-client/utils/call-stack-extractor.util.js +83 -0
- package/http-client/utils/context-extractor.util.d.ts +49 -0
- package/http-client/utils/context-extractor.util.js +54 -0
- package/http-client/utils/curl-generator.util.d.ts +21 -0
- package/http-client/utils/curl-generator.util.js +44 -3
- package/http-client/utils/index.d.ts +1 -0
- package/http-client/utils/index.js +1 -0
- package/http-client/utils/proxy-environment.util.d.ts +42 -0
- package/http-client/utils/proxy-environment.util.js +148 -0
- package/http-client/utils/request-id.util.d.ts +18 -0
- package/http-client/utils/request-id.util.js +20 -0
- package/http-client/utils/retry-recorder.util.d.ts +42 -0
- package/http-client/utils/retry-recorder.util.js +44 -0
- package/http-client/utils/security-validator.util.d.ts +118 -0
- package/http-client/utils/security-validator.util.js +352 -0
- package/index.d.ts +3 -1
- package/index.js +12 -1
- package/interceptors/translation-interceptor.service.js +5 -0
- 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 +32 -29
- package/providers/context.provider.d.ts +9 -0
- package/providers/context.provider.js +15 -0
- package/providers/generator.provider.d.ts +4 -0
- package/providers/generator.provider.js +4 -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/examples/lock-strategy.examples.d.ts +89 -0
- package/redis-lock/examples/lock-strategy.examples.js +130 -15
- package/redis-lock/index.d.ts +2 -0
- package/redis-lock/index.js +8 -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.decorator.d.ts +101 -0
- package/redis-lock/redis-lock.decorator.js +120 -0
- package/redis-lock/redis-lock.module.d.ts +66 -0
- package/redis-lock/redis-lock.module.js +175 -70
- package/redis-lock/redis-lock.service.d.ts +282 -0
- package/redis-lock/redis-lock.service.js +343 -20
- package/setup/bootstrap.setup.d.ts +2 -1
- package/setup/bootstrap.setup.js +22 -1
- package/setup/index.d.ts +1 -0
- package/setup/index.js +1 -0
- package/setup/mode.setup.d.ts +44 -0
- package/setup/mode.setup.js +44 -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 +227 -0
- package/setup/schedule.decorator.js +240 -12
- package/setup/worker.decorator.d.ts +86 -0
- package/setup/worker.decorator.js +97 -0
- package/shared/index.d.ts +1 -1
- package/shared/index.js +1 -1
- package/shared/{serviceRegistryModule.js → service-registry.module.js} +19 -18
- package/shared/services/api-config.service.d.ts +3 -0
- package/shared/services/api-config.service.js +21 -9
- package/shared/services/index.d.ts +0 -1
- package/shared/services/index.js +0 -1
- package/validator-json/decorators.d.ts +17 -0
- package/validator-json/decorators.js +17 -2
- package/validator-json/default.d.ts +6 -0
- package/validator-json/default.js +30 -2
- package/validator-json/defaultConverters.js +1 -0
- package/validator-json/options.d.ts +23 -0
- package/validators/common-validators.d.ts +143 -0
- package/validators/common-validators.js +249 -0
- package/validators/custom-validate.examples.d.ts +23 -0
- package/validators/custom-validate.examples.js +78 -6
- package/validators/custom-validate.validator.d.ts +108 -0
- package/validators/custom-validate.validator.js +85 -0
- package/validators/file-mimetype.validator.d.ts +0 -2
- package/validators/file-mimetype.validator.js +4 -6
- package/validators/index.d.ts +1 -0
- package/validators/index.js +1 -0
- package/validators/is-exists.validator.d.ts +26 -6
- package/validators/is-exists.validator.js +30 -7
- package/validators/is-unique.validator.d.ts +33 -7
- package/validators/is-unique.validator.js +59 -17
- package/validators/skip-empty.validator.d.ts +5 -0
- package/validators/skip-empty.validator.js +5 -0
- package/vault/interfaces/vault-options.interface.d.ts +9 -0
- package/vault/vault-config.loader.d.ts +30 -0
- package/vault/vault-config.loader.js +48 -1
- package/vault/vault-config.service.d.ts +53 -0
- package/vault/vault-config.service.js +57 -0
- package/vault/vault.module.d.ts +4 -0
- package/vault/vault.module.js +4 -0
- package/cache/providers/memory-cache.provider.d.ts +0 -26
- package/cache/providers/memory-cache.provider.js +0 -171
- package/decorators/examples/validation-decorators.example.d.ts +0 -69
- package/decorators/examples/validation-decorators.example.js +0 -331
- package/http-client/services/cache.service.d.ts +0 -24
- package/http-client/services/cache.service.js +0 -264
- 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,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 {};
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EXCEL_COLUMN_METADATA = exports.CSV_COLUMN_METADATA = void 0;
|
|
4
|
+
exports.CSVColumn = CSVColumn;
|
|
5
|
+
exports.ExcelColumn = ExcelColumn;
|
|
6
|
+
exports.getCsvColumnMapping = getCsvColumnMapping;
|
|
7
|
+
exports.getExcelColumnMapping = getExcelColumnMapping;
|
|
8
|
+
exports.excelColumnToNumber = excelColumnToNumber;
|
|
9
|
+
exports.processRowWithMapping = processRowWithMapping;
|
|
10
|
+
exports.numberToExcelColumn = numberToExcelColumn;
|
|
11
|
+
exports.formatValidationErrors = formatValidationErrors;
|
|
12
|
+
exports.createImportResult = createImportResult;
|
|
13
|
+
require("reflect-metadata");
|
|
14
|
+
/**
|
|
15
|
+
* CSV列名映射元数据键
|
|
16
|
+
*/
|
|
17
|
+
exports.CSV_COLUMN_METADATA = 'csv:column';
|
|
18
|
+
/**
|
|
19
|
+
* Excel列名映射元数据键
|
|
20
|
+
*/
|
|
21
|
+
exports.EXCEL_COLUMN_METADATA = 'excel:column';
|
|
22
|
+
/**
|
|
23
|
+
* CSV列装饰器
|
|
24
|
+
* 用于指定CSV文件中列与DTO属性的映射关系
|
|
25
|
+
* 支持列名、列序号(从0开始)或Excel列名(A, B, C)
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```typescript
|
|
29
|
+
* export class UserImportDto {
|
|
30
|
+
* @CSVColumn('姓名') // 使用列名
|
|
31
|
+
* @CSVColumn(0) // 使用列序号(第一列)
|
|
32
|
+
* @CSVColumn('A') // 使用Excel列名
|
|
33
|
+
* @IsString()
|
|
34
|
+
* @Length(2, 50)
|
|
35
|
+
* name: string;
|
|
36
|
+
*
|
|
37
|
+
* @CSVColumn('年龄') // 使用列名
|
|
38
|
+
* @CSVColumn(1) // 使用列序号(第二列)
|
|
39
|
+
* @CSVColumn('B') // 使用Excel列名
|
|
40
|
+
* @IsNumber()
|
|
41
|
+
* @Min(0)
|
|
42
|
+
* @Max(150)
|
|
43
|
+
* age: number;
|
|
44
|
+
* }
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
function CSVColumn(columnIdentifier) {
|
|
48
|
+
return (target, propertyKey) => {
|
|
49
|
+
// target 是类的原型,我们需要将元数据存储在构造函数上
|
|
50
|
+
const constructor = target.constructor;
|
|
51
|
+
const columns = Reflect.getMetadata(exports.CSV_COLUMN_METADATA, constructor) || {};
|
|
52
|
+
columns[propertyKey] = columnIdentifier;
|
|
53
|
+
Reflect.defineMetadata(exports.CSV_COLUMN_METADATA, columns, constructor);
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Excel列装饰器
|
|
58
|
+
* 用于指定Excel文件中列与DTO属性的映射关系
|
|
59
|
+
* 支持列名、列序号(从0开始)或Excel列名(A, B, C)
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* ```typescript
|
|
63
|
+
* export class ProductImportDto {
|
|
64
|
+
* @ExcelColumn('产品名称') // 使用列名
|
|
65
|
+
* @ExcelColumn(0) // 使用列序号(第一列)
|
|
66
|
+
* @ExcelColumn('A') // 使用Excel列名
|
|
67
|
+
* @IsString()
|
|
68
|
+
* @Length(2, 200)
|
|
69
|
+
* name: string;
|
|
70
|
+
*
|
|
71
|
+
* @ExcelColumn('价格') // 使用列名
|
|
72
|
+
* @ExcelColumn(1) // 使用列序号(第二列)
|
|
73
|
+
* @ExcelColumn('B') // 使用Excel列名
|
|
74
|
+
* @IsNumber()
|
|
75
|
+
* @Min(0)
|
|
76
|
+
* price: number;
|
|
77
|
+
* }
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
80
|
+
function ExcelColumn(columnIdentifier) {
|
|
81
|
+
return (target, propertyKey) => {
|
|
82
|
+
// target 是类的原型,我们需要将元数据存储在构造函数上
|
|
83
|
+
const constructor = target.constructor;
|
|
84
|
+
const columns = Reflect.getMetadata(exports.EXCEL_COLUMN_METADATA, constructor) || {};
|
|
85
|
+
columns[propertyKey] = columnIdentifier;
|
|
86
|
+
Reflect.defineMetadata(exports.EXCEL_COLUMN_METADATA, columns, constructor);
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* 获取CSV列映射信息
|
|
91
|
+
* 返回列标识到属性名的映射Map
|
|
92
|
+
*
|
|
93
|
+
* @param dtoClass DTO类
|
|
94
|
+
* @returns Map<列标识, 属性名>
|
|
95
|
+
*/
|
|
96
|
+
function getCsvColumnMapping(dtoClass) {
|
|
97
|
+
const constructor = dtoClass;
|
|
98
|
+
const mapping = new Map();
|
|
99
|
+
if (!constructor) {
|
|
100
|
+
return mapping;
|
|
101
|
+
}
|
|
102
|
+
// 从构造函数获取列映射元数据
|
|
103
|
+
const columns = Reflect.getMetadata(exports.CSV_COLUMN_METADATA, constructor) || {};
|
|
104
|
+
for (const [propertyKey, columnIdentifier] of Object.entries(columns)) {
|
|
105
|
+
mapping.set(columnIdentifier, propertyKey);
|
|
106
|
+
}
|
|
107
|
+
return mapping;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* 获取Excel列映射信息
|
|
111
|
+
* 返回列标识到属性名的映射Map
|
|
112
|
+
*
|
|
113
|
+
* @param dtoClass DTO类
|
|
114
|
+
* @returns Map<列标识, 属性名>
|
|
115
|
+
*/
|
|
116
|
+
function getExcelColumnMapping(dtoClass) {
|
|
117
|
+
const constructor = dtoClass;
|
|
118
|
+
const mapping = new Map();
|
|
119
|
+
if (!constructor) {
|
|
120
|
+
return mapping;
|
|
121
|
+
}
|
|
122
|
+
// 从构造函数获取列映射元数据
|
|
123
|
+
const columns = Reflect.getMetadata(exports.EXCEL_COLUMN_METADATA, constructor) || {};
|
|
124
|
+
for (const [propertyKey, columnIdentifier] of Object.entries(columns)) {
|
|
125
|
+
mapping.set(columnIdentifier, propertyKey);
|
|
126
|
+
}
|
|
127
|
+
return mapping;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Excel列名转数字(A=0, B=1, ..., AA=26, AB=27)
|
|
131
|
+
*/
|
|
132
|
+
function excelColumnToNumber(columnLetter) {
|
|
133
|
+
let result = 0;
|
|
134
|
+
for (let i = 0; i < columnLetter.length; i++) {
|
|
135
|
+
const char = columnLetter.toUpperCase().charCodeAt(i) - 64; // A=65, so A-64=1
|
|
136
|
+
result = result * 26 + char;
|
|
137
|
+
}
|
|
138
|
+
return result - 1; // 转换为0基索引
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* 处理行数据
|
|
142
|
+
* 将原始数据行转换为DTO实例,支持多语言错误信息
|
|
143
|
+
* 支持列名、列序号和Excel列名(A, B, C)
|
|
144
|
+
*
|
|
145
|
+
* @param rowData 原始行数据
|
|
146
|
+
* @param dtoClass DTO类
|
|
147
|
+
* @param columnMapping 列映射
|
|
148
|
+
* @param type 数据类型(csv/excel)
|
|
149
|
+
* @returns 转换结果
|
|
150
|
+
*/
|
|
151
|
+
function processRowWithMapping(rowData, dtoClass, columnMapping, type) {
|
|
152
|
+
const instance = new dtoClass();
|
|
153
|
+
const errors = [];
|
|
154
|
+
// 遍历所有映射的列
|
|
155
|
+
for (const [columnIdentifier, propertyKey] of columnMapping.entries()) {
|
|
156
|
+
let value;
|
|
157
|
+
if (typeof columnIdentifier === 'number') {
|
|
158
|
+
// 列序号(0基索引)
|
|
159
|
+
if (Array.isArray(rowData)) {
|
|
160
|
+
// 如果rowData是数组,直接使用索引
|
|
161
|
+
value = rowData[columnIdentifier];
|
|
162
|
+
}
|
|
163
|
+
else if (type === 'excel') {
|
|
164
|
+
// Excel数据:尝试将列序号转换为Excel列名
|
|
165
|
+
const columnLetter = numberToExcelColumn(columnIdentifier);
|
|
166
|
+
value = rowData[columnLetter];
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
// CSV数据:如果无法通过索引获取,则跳过
|
|
170
|
+
value = undefined;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
else if (typeof columnIdentifier === 'string') {
|
|
174
|
+
// 列名或Excel列名
|
|
175
|
+
// 优先通过列名获取值
|
|
176
|
+
if (rowData.hasOwnProperty(columnIdentifier)) {
|
|
177
|
+
value = rowData[columnIdentifier];
|
|
178
|
+
}
|
|
179
|
+
else if (type === 'excel' && /^[A-Za-z]+$/.test(columnIdentifier)) {
|
|
180
|
+
// 如果是Excel列名格式(如A, B, C),但数据中没有,尝试其他方式
|
|
181
|
+
value = undefined;
|
|
182
|
+
}
|
|
183
|
+
// 如果是数组且列标识是特殊的索引格式
|
|
184
|
+
else if (Array.isArray(rowData) && columnIdentifier.startsWith('__index_')) {
|
|
185
|
+
const index = parseInt(columnIdentifier.replace('__index_', ''), 10);
|
|
186
|
+
if (!isNaN(index) && index < rowData.length) {
|
|
187
|
+
value = rowData[index];
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// 设置值到实例
|
|
192
|
+
instance[propertyKey] = value;
|
|
193
|
+
}
|
|
194
|
+
return { instance, errors };
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* 数字转Excel列名(0=A, 1=B, ..., 26=AA, 27=AB)
|
|
198
|
+
*/
|
|
199
|
+
function numberToExcelColumn(num) {
|
|
200
|
+
let result = '';
|
|
201
|
+
let n = num + 1; // 转换为1基索引
|
|
202
|
+
while (n > 0) {
|
|
203
|
+
n--;
|
|
204
|
+
result = String.fromCharCode(65 + (n % 26)) + result;
|
|
205
|
+
n = Math.floor(n / 26);
|
|
206
|
+
}
|
|
207
|
+
return result;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* 格式化验证错误为多语言
|
|
211
|
+
* 支持中英文错误信息
|
|
212
|
+
*
|
|
213
|
+
* @param errors class-validator错误数组
|
|
214
|
+
* @returns 格式化后的错误信息
|
|
215
|
+
*/
|
|
216
|
+
function formatValidationErrors(errors) {
|
|
217
|
+
return errors.map(error => {
|
|
218
|
+
var _a, _b, _c, _d, _e;
|
|
219
|
+
const constraint = Object.values(error.constraints)[0];
|
|
220
|
+
// 英文错误信息直接使用
|
|
221
|
+
if (/^[a-zA-Z\s]+$/.test(constraint.message)) {
|
|
222
|
+
return `${error.property}: ${constraint.message}`;
|
|
223
|
+
}
|
|
224
|
+
// 中文错误信息特殊处理
|
|
225
|
+
const chineseMessages = {
|
|
226
|
+
'isString': '必须是字符串',
|
|
227
|
+
'isNumber': '必须是数字',
|
|
228
|
+
'isBoolean': '必须是布尔值',
|
|
229
|
+
'isDate': '必须是日期格式',
|
|
230
|
+
'min': `不能小于 ${(_a = constraint.values) === null || _a === void 0 ? void 0 : _a[0]}`,
|
|
231
|
+
'max': `不能大于 ${(_b = constraint.values) === null || _b === void 0 ? void 0 : _b[0]}`,
|
|
232
|
+
'minLength': `长度不能少于 ${(_c = constraint.values) === null || _c === void 0 ? void 0 : _c[0]}`,
|
|
233
|
+
'maxLength': `长度不能超过 ${(_d = constraint.values) === null || _d === void 0 ? void 0 : _d[0]}`,
|
|
234
|
+
'isEmail': '邮箱格式不正确',
|
|
235
|
+
'isEnum': `必须是以下值之一: ${(_e = constraint.values) === null || _e === void 0 ? void 0 : _e.join(', ')}`,
|
|
236
|
+
'matches': '格式不正确',
|
|
237
|
+
};
|
|
238
|
+
const ruleName = constraint.message.split(' ')[0];
|
|
239
|
+
const chineseMessage = chineseMessages[ruleName];
|
|
240
|
+
if (chineseMessage) {
|
|
241
|
+
const args = constraint.values || [];
|
|
242
|
+
let message = chineseMessage;
|
|
243
|
+
args.forEach(arg => {
|
|
244
|
+
message = message.replace(/\$\{(\w+)\}/g, (_, key) => {
|
|
245
|
+
const index = parseInt(key.replace(/[^\d]/g, '')) - 1;
|
|
246
|
+
return args[index] !== undefined ? args[index] : `$${key}`;
|
|
247
|
+
});
|
|
248
|
+
});
|
|
249
|
+
return `${error.property}: ${message}`;
|
|
250
|
+
}
|
|
251
|
+
// 默认使用原错误信息
|
|
252
|
+
return `${error.property}: ${constraint.message}`;
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* 创建CSV数据导入结果
|
|
257
|
+
* @param data 成功导入的数据
|
|
258
|
+
* @param errors 错误信息
|
|
259
|
+
* @param totalRows 总行数
|
|
260
|
+
* @param headers 表头信息
|
|
261
|
+
* @returns 导入结果对象
|
|
262
|
+
*/
|
|
263
|
+
function createImportResult(data, errors, totalRows, headers) {
|
|
264
|
+
return {
|
|
265
|
+
success: errors.length === 0,
|
|
266
|
+
data,
|
|
267
|
+
errors,
|
|
268
|
+
totalCount: totalRows,
|
|
269
|
+
successCount: data.length,
|
|
270
|
+
errorCount: errors.length,
|
|
271
|
+
headers
|
|
272
|
+
};
|
|
273
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
/**
|
|
3
|
+
* CSV 列映射装饰器
|
|
4
|
+
* 用于标记 DTO 类的属性对应的 CSV 列名
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* class UserDto {
|
|
9
|
+
* @CsvColumn('姓名')
|
|
10
|
+
* name: string;
|
|
11
|
+
*
|
|
12
|
+
* @CsvColumn('邮箱')
|
|
13
|
+
* email: string;
|
|
14
|
+
* }
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export declare function CsvColumn(columnName: string): PropertyDecorator;
|
|
18
|
+
/**
|
|
19
|
+
* 获取 CSV 列映射
|
|
20
|
+
*/
|
|
21
|
+
export declare function getCsvColumnMapping(dto: any): Record<string, string>;
|
|
22
|
+
/**
|
|
23
|
+
* 解析并验证 CSV 数据
|
|
24
|
+
*/
|
|
25
|
+
export declare function parseAndValidateCsvData(data: any[], dto: any, options?: {
|
|
26
|
+
skipValidation?: boolean;
|
|
27
|
+
}): Promise<{
|
|
28
|
+
data: any[];
|
|
29
|
+
errors: any[];
|
|
30
|
+
}>;
|
|
@@ -0,0 +1,85 @@
|
|
|
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.CsvColumn = CsvColumn;
|
|
13
|
+
exports.getCsvColumnMapping = getCsvColumnMapping;
|
|
14
|
+
exports.parseAndValidateCsvData = parseAndValidateCsvData;
|
|
15
|
+
require("reflect-metadata");
|
|
16
|
+
const class_transformer_1 = require("class-transformer");
|
|
17
|
+
const class_validator_1 = require("class-validator");
|
|
18
|
+
const CSV_COLUMN_METADATA_KEY = Symbol('csv:column');
|
|
19
|
+
/**
|
|
20
|
+
* CSV 列映射装饰器
|
|
21
|
+
* 用于标记 DTO 类的属性对应的 CSV 列名
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* class UserDto {
|
|
26
|
+
* @CsvColumn('姓名')
|
|
27
|
+
* name: string;
|
|
28
|
+
*
|
|
29
|
+
* @CsvColumn('邮箱')
|
|
30
|
+
* email: string;
|
|
31
|
+
* }
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
function CsvColumn(columnName) {
|
|
35
|
+
return (target, propertyKey) => {
|
|
36
|
+
const existingColumns = Reflect.getMetadata(CSV_COLUMN_METADATA_KEY, target.constructor) || {};
|
|
37
|
+
existingColumns[columnName] = propertyKey;
|
|
38
|
+
Reflect.defineMetadata(CSV_COLUMN_METADATA_KEY, existingColumns, target.constructor);
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* 获取 CSV 列映射
|
|
43
|
+
*/
|
|
44
|
+
function getCsvColumnMapping(dto) {
|
|
45
|
+
return Reflect.getMetadata(CSV_COLUMN_METADATA_KEY, dto) || {};
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* 解析并验证 CSV 数据
|
|
49
|
+
*/
|
|
50
|
+
function parseAndValidateCsvData(data, dto, options) {
|
|
51
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
52
|
+
const columnMapping = getCsvColumnMapping(dto);
|
|
53
|
+
const results = [];
|
|
54
|
+
const errors = [];
|
|
55
|
+
for (let i = 0; i < data.length; i++) {
|
|
56
|
+
const row = data[i];
|
|
57
|
+
const mappedData = {};
|
|
58
|
+
// 映射列名
|
|
59
|
+
for (const [csvColumn, dtoProperty] of Object.entries(columnMapping)) {
|
|
60
|
+
if (row.hasOwnProperty(csvColumn)) {
|
|
61
|
+
mappedData[dtoProperty] = row[csvColumn];
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// 转换为 DTO 实例
|
|
65
|
+
const instance = (0, class_transformer_1.plainToInstance)(dto, mappedData);
|
|
66
|
+
// 验证
|
|
67
|
+
if (!(options === null || options === void 0 ? void 0 : options.skipValidation)) {
|
|
68
|
+
const validationErrors = yield (0, class_validator_1.validate)(instance);
|
|
69
|
+
if (validationErrors.length > 0) {
|
|
70
|
+
errors.push({
|
|
71
|
+
row: i + 1,
|
|
72
|
+
data: row,
|
|
73
|
+
errors: validationErrors.map((e) => ({
|
|
74
|
+
property: e.property,
|
|
75
|
+
constraints: e.constraints,
|
|
76
|
+
})),
|
|
77
|
+
});
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
results.push(instance);
|
|
82
|
+
}
|
|
83
|
+
return { data: results, errors };
|
|
84
|
+
});
|
|
85
|
+
}
|