@nest-omni/core 4.1.3-2 → 4.1.3-20
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 +10 -0
- package/audit/audit.module.js +63 -1
- package/audit/controllers/audit.controller.d.ts +88 -0
- package/audit/controllers/audit.controller.js +74 -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 +45 -0
- package/audit/decorators/audit-operation.decorator.js +49 -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-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/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 +11 -0
- package/audit/entities/entity-audit-log.entity.js +57 -2
- 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 -0
- package/audit/entities/manual-operation-log.entity.js +12 -1
- 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 +37 -6
- package/audit/enums/audit.enums.js +40 -7
- package/audit/index.d.ts +4 -1
- package/audit/index.js +34 -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 +15 -0
- package/audit/interceptors/audit.interceptor.js +23 -1
- package/audit/interceptors/index.d.ts +1 -0
- package/audit/interceptors/index.js +1 -0
- package/audit/interfaces/audit.interfaces.d.ts +187 -2
- 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 +97 -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 +230 -3
- package/audit/services/entity-audit.service.js +607 -14
- package/audit/services/index.d.ts +3 -0
- package/audit/services/index.js +3 -0
- package/audit/services/manual-audit-log.service.d.ts +134 -9
- package/audit/services/manual-audit-log.service.js +157 -40
- 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 +19 -0
- package/audit/subscribers/entity-audit.subscriber.js +76 -1
- 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 +82 -2
- package/cache/cache.module.js +76 -5
- package/cache/cache.service.d.ts +140 -0
- package/cache/cache.service.js +169 -0
- 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/examples/basic-usage.d.ts +15 -0
- package/cache/examples/basic-usage.js +62 -8
- package/cache/index.js +9 -0
- 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/memory-cache.provider.d.ts +43 -0
- package/cache/providers/memory-cache.provider.js +66 -0
- package/cache/providers/redis-cache.provider.d.ts +26 -0
- package/cache/providers/redis-cache.provider.js +29 -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 +142 -0
- package/common/boilerplate.polyfill.js +18 -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/utils.d.ts +15 -0
- package/common/utils.js +15 -0
- package/constants/language-code.js +1 -0
- package/decorators/field.decorators.d.ts +1 -1
- package/decorators/field.decorators.js +8 -1
- package/decorators/property.decorators.js +1 -0
- package/decorators/public-route.decorator.js +1 -0
- package/decorators/transform.decorators.d.ts +27 -0
- package/decorators/transform.decorators.js +29 -0
- 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/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 +52 -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/package.json +11 -7
- package/providers/context.provider.js +2 -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 +1 -0
- package/setup/bootstrap.setup.js +21 -0
- 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 -17
- 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/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
|
@@ -26,33 +26,61 @@ const common_1 = require("@nestjs/common");
|
|
|
26
26
|
const typeorm_1 = require("@nestjs/typeorm");
|
|
27
27
|
const typeorm_2 = require("typeorm");
|
|
28
28
|
const entities_1 = require("../entities");
|
|
29
|
+
const cache_1 = require("../../cache");
|
|
30
|
+
/**
|
|
31
|
+
* 操作描述服务
|
|
32
|
+
* 负责根据模板和参数动态生成多语言描述
|
|
33
|
+
*/
|
|
29
34
|
let OperationDescriptionService = class OperationDescriptionService {
|
|
30
|
-
constructor(templateRepository, transactionRepository, auditLogRepository, manualOperationRepository) {
|
|
35
|
+
constructor(templateRepository, transactionRepository, auditLogRepository, manualOperationRepository, cacheService) {
|
|
31
36
|
this.templateRepository = templateRepository;
|
|
32
37
|
this.transactionRepository = transactionRepository;
|
|
33
38
|
this.auditLogRepository = auditLogRepository;
|
|
34
39
|
this.manualOperationRepository = manualOperationRepository;
|
|
35
|
-
this.
|
|
40
|
+
this.cacheService = cacheService;
|
|
41
|
+
// 缓存命名空间
|
|
42
|
+
this.CACHE_NAMESPACE = 'audit:template';
|
|
43
|
+
// 缓存TTL(30分钟)
|
|
44
|
+
this.CACHE_TTL = 30 * 60 * 1000;
|
|
36
45
|
}
|
|
46
|
+
/**
|
|
47
|
+
* 动态生成操作名称
|
|
48
|
+
* @param templateKey 模板键
|
|
49
|
+
* @param language 语言
|
|
50
|
+
* @returns 操作名称
|
|
51
|
+
*/
|
|
37
52
|
generateOperationName(templateKey_1) {
|
|
38
53
|
return __awaiter(this, arguments, void 0, function* (templateKey, language = 'zh') {
|
|
39
54
|
const template = yield this.getOperationTemplate(templateKey);
|
|
40
55
|
if (!template) {
|
|
41
|
-
return templateKey;
|
|
56
|
+
return templateKey; // 如果没有模板,返回模板键
|
|
42
57
|
}
|
|
43
58
|
return template.nameTemplates[language] || template.nameTemplates['zh'] || templateKey;
|
|
44
59
|
});
|
|
45
60
|
}
|
|
61
|
+
/**
|
|
62
|
+
* 动态生成操作描述
|
|
63
|
+
* @param templateKey 模板键
|
|
64
|
+
* @param descriptionParams 描述参数
|
|
65
|
+
* @param language 语言
|
|
66
|
+
* @returns 描述文本
|
|
67
|
+
*/
|
|
46
68
|
generateDescription(templateKey_1, descriptionParams_1) {
|
|
47
69
|
return __awaiter(this, arguments, void 0, function* (templateKey, descriptionParams, language = 'zh') {
|
|
48
70
|
const template = yield this.getOperationTemplate(templateKey);
|
|
49
71
|
if (!template) {
|
|
50
|
-
return templateKey;
|
|
72
|
+
return templateKey; // 如果没有模板,返回模板键
|
|
51
73
|
}
|
|
52
74
|
const templateStr = template.descriptionTemplates[language] || template.descriptionTemplates['zh'] || templateKey;
|
|
53
75
|
return this.fillTemplate(templateStr, descriptionParams);
|
|
54
76
|
});
|
|
55
77
|
}
|
|
78
|
+
/**
|
|
79
|
+
* 动态生成变更详情
|
|
80
|
+
* @param changeDetails 变更详情列表
|
|
81
|
+
* @param language 语言
|
|
82
|
+
* @returns 格式化的变更详情
|
|
83
|
+
*/
|
|
56
84
|
generateChangeDetails(changeDetails_1) {
|
|
57
85
|
return __awaiter(this, arguments, void 0, function* (changeDetails, language = 'zh') {
|
|
58
86
|
return changeDetails.map((detail) => {
|
|
@@ -67,22 +95,32 @@ let OperationDescriptionService = class OperationDescriptionService {
|
|
|
67
95
|
});
|
|
68
96
|
});
|
|
69
97
|
}
|
|
98
|
+
/**
|
|
99
|
+
* 获取事务描述(包含所有变更)
|
|
100
|
+
* @param transactionId 事务ID
|
|
101
|
+
* @param language 语言
|
|
102
|
+
* @returns 事务描述对象
|
|
103
|
+
*/
|
|
70
104
|
getTransactionDescription(transactionId_1) {
|
|
71
105
|
return __awaiter(this, arguments, void 0, function* (transactionId, language = 'zh') {
|
|
106
|
+
// 获取事务信息
|
|
72
107
|
const transaction = yield this.transactionRepository.findOne({
|
|
73
108
|
where: { id: transactionId },
|
|
74
109
|
});
|
|
75
110
|
if (!transaction) {
|
|
76
111
|
throw new Error(`Transaction ${transactionId} not found`);
|
|
77
112
|
}
|
|
113
|
+
// 获取事务的审计日志
|
|
78
114
|
const auditLogs = yield this.auditLogRepository.find({
|
|
79
115
|
where: { requestId: transactionId },
|
|
80
116
|
order: { createdAt: 'ASC' },
|
|
81
117
|
});
|
|
118
|
+
// 获取事务的手动操作记录
|
|
82
119
|
const manualOperations = yield this.manualOperationRepository.find({
|
|
83
120
|
where: { transactionId },
|
|
84
121
|
order: { createdAt: 'ASC' },
|
|
85
122
|
});
|
|
123
|
+
// 生成操作名称和描述
|
|
86
124
|
let operationName;
|
|
87
125
|
let description;
|
|
88
126
|
if (transaction.operationTemplateKey) {
|
|
@@ -90,6 +128,7 @@ let OperationDescriptionService = class OperationDescriptionService {
|
|
|
90
128
|
description = yield this.generateDescription(transaction.operationTemplateKey, transaction.descriptionParams || {}, language);
|
|
91
129
|
}
|
|
92
130
|
else {
|
|
131
|
+
// 如果没有事务级别的模板,使用第一个变更的模板
|
|
93
132
|
const firstLog = auditLogs[0];
|
|
94
133
|
if (firstLog && firstLog.operationTemplateKey) {
|
|
95
134
|
operationName = yield this.generateOperationName(firstLog.operationTemplateKey, language);
|
|
@@ -100,7 +139,9 @@ let OperationDescriptionService = class OperationDescriptionService {
|
|
|
100
139
|
description = transaction.description || 'Unknown operation';
|
|
101
140
|
}
|
|
102
141
|
}
|
|
142
|
+
// 生成变更详情
|
|
103
143
|
const changes = [];
|
|
144
|
+
// 添加实体变更
|
|
104
145
|
for (const log of auditLogs) {
|
|
105
146
|
const changeDescription = log.operationTemplateKey
|
|
106
147
|
? yield this.generateDescription(log.operationTemplateKey, log.descriptionParams || {}, language)
|
|
@@ -117,6 +158,7 @@ let OperationDescriptionService = class OperationDescriptionService {
|
|
|
117
158
|
createdAt: log.createdAt,
|
|
118
159
|
});
|
|
119
160
|
}
|
|
161
|
+
// 添加手动操作
|
|
120
162
|
for (const manualOp of manualOperations) {
|
|
121
163
|
const opName = yield this.generateOperationName(manualOp.operationTemplateKey, language);
|
|
122
164
|
const opDescription = yield this.generateDescription(manualOp.operationTemplateKey, manualOp.descriptionParams, language);
|
|
@@ -127,6 +169,7 @@ let OperationDescriptionService = class OperationDescriptionService {
|
|
|
127
169
|
createdAt: manualOp.createdAt,
|
|
128
170
|
});
|
|
129
171
|
}
|
|
172
|
+
// 按时间排序
|
|
130
173
|
changes.sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime());
|
|
131
174
|
return {
|
|
132
175
|
operationName,
|
|
@@ -135,24 +178,147 @@ let OperationDescriptionService = class OperationDescriptionService {
|
|
|
135
178
|
};
|
|
136
179
|
});
|
|
137
180
|
}
|
|
181
|
+
/**
|
|
182
|
+
* 批量获取事务描述
|
|
183
|
+
* @param transactionIds 事务ID列表
|
|
184
|
+
* @param language 语言
|
|
185
|
+
* @returns 事务描述映射
|
|
186
|
+
*/
|
|
138
187
|
batchGetTransactionDescriptions(transactionIds_1) {
|
|
139
188
|
return __awaiter(this, arguments, void 0, function* (transactionIds, language = 'zh') {
|
|
189
|
+
if (transactionIds.length === 0) {
|
|
190
|
+
return {};
|
|
191
|
+
}
|
|
192
|
+
// 批量查询事务信息
|
|
193
|
+
const transactions = yield this.transactionRepository
|
|
194
|
+
.createQueryBuilder('tx')
|
|
195
|
+
.whereInIds(transactionIds)
|
|
196
|
+
.getMany();
|
|
197
|
+
// 批量查询审计日志
|
|
198
|
+
const auditLogs = yield this.auditLogRepository
|
|
199
|
+
.createQueryBuilder('log')
|
|
200
|
+
.where('log.requestId IN (:...transactionIds)', { transactionIds })
|
|
201
|
+
.orderBy('log.createdAt', 'ASC')
|
|
202
|
+
.getMany();
|
|
203
|
+
// 批量查询手动操作记录
|
|
204
|
+
const manualOperations = yield this.manualOperationRepository
|
|
205
|
+
.createQueryBuilder('op')
|
|
206
|
+
.where('op.transactionId IN (:...transactionIds)', { transactionIds })
|
|
207
|
+
.orderBy('op.createdAt', 'ASC')
|
|
208
|
+
.getMany();
|
|
209
|
+
// 收集所有需要的模板键
|
|
210
|
+
const templateKeys = new Set();
|
|
211
|
+
transactions.forEach(tx => {
|
|
212
|
+
if (tx.operationTemplateKey)
|
|
213
|
+
templateKeys.add(tx.operationTemplateKey);
|
|
214
|
+
});
|
|
215
|
+
auditLogs.forEach(log => {
|
|
216
|
+
if (log.operationTemplateKey)
|
|
217
|
+
templateKeys.add(log.operationTemplateKey);
|
|
218
|
+
});
|
|
219
|
+
manualOperations.forEach(op => {
|
|
220
|
+
if (op.operationTemplateKey)
|
|
221
|
+
templateKeys.add(op.operationTemplateKey);
|
|
222
|
+
});
|
|
223
|
+
// 批量预加载模板
|
|
224
|
+
if (templateKeys.size > 0) {
|
|
225
|
+
yield this.preloadTemplates(Array.from(templateKeys));
|
|
226
|
+
}
|
|
227
|
+
// 按事务ID分组
|
|
228
|
+
const logsByTxId = new Map();
|
|
229
|
+
const opsByTxId = new Map();
|
|
230
|
+
auditLogs.forEach(log => {
|
|
231
|
+
const txId = log.requestId;
|
|
232
|
+
if (!logsByTxId.has(txId))
|
|
233
|
+
logsByTxId.set(txId, []);
|
|
234
|
+
logsByTxId.get(txId).push(log);
|
|
235
|
+
});
|
|
236
|
+
manualOperations.forEach(op => {
|
|
237
|
+
const txId = op.transactionId;
|
|
238
|
+
if (!opsByTxId.has(txId))
|
|
239
|
+
opsByTxId.set(txId, []);
|
|
240
|
+
opsByTxId.get(txId).push(op);
|
|
241
|
+
});
|
|
242
|
+
// 构建结果
|
|
140
243
|
const results = {};
|
|
141
|
-
for (const
|
|
244
|
+
for (const transaction of transactions) {
|
|
142
245
|
try {
|
|
143
|
-
|
|
246
|
+
const txLogs = logsByTxId.get(transaction.id) || [];
|
|
247
|
+
const txOps = opsByTxId.get(transaction.id) || [];
|
|
248
|
+
// 生成操作名称和描述
|
|
249
|
+
let operationName;
|
|
250
|
+
let description;
|
|
251
|
+
if (transaction.operationTemplateKey) {
|
|
252
|
+
operationName = yield this.generateOperationName(transaction.operationTemplateKey, language);
|
|
253
|
+
description = yield this.generateDescription(transaction.operationTemplateKey, transaction.descriptionParams || {}, language);
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
const firstLog = txLogs[0];
|
|
257
|
+
if (firstLog && firstLog.operationTemplateKey) {
|
|
258
|
+
operationName = yield this.generateOperationName(firstLog.operationTemplateKey, language);
|
|
259
|
+
description = yield this.generateDescription(firstLog.operationTemplateKey, firstLog.descriptionParams || {}, language);
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
operationName = 'Unknown Operation';
|
|
263
|
+
description = transaction.description || 'Unknown operation';
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
// 生成变更详情
|
|
267
|
+
const changes = [];
|
|
268
|
+
// 添加实体变更
|
|
269
|
+
for (const log of txLogs) {
|
|
270
|
+
const changeDescription = log.operationTemplateKey
|
|
271
|
+
? yield this.generateDescription(log.operationTemplateKey, log.descriptionParams || {}, language)
|
|
272
|
+
: log.description || '';
|
|
273
|
+
const changeDetails = log.changeDetails
|
|
274
|
+
? yield this.generateChangeDetails(log.changeDetails, language)
|
|
275
|
+
: [];
|
|
276
|
+
changes.push({
|
|
277
|
+
entityName: log.entityType,
|
|
278
|
+
entityId: log.entityId,
|
|
279
|
+
operation: log.operation,
|
|
280
|
+
description: changeDescription,
|
|
281
|
+
details: changeDetails,
|
|
282
|
+
createdAt: log.createdAt,
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
// 添加手动操作
|
|
286
|
+
for (const manualOp of txOps) {
|
|
287
|
+
const opName = yield this.generateOperationName(manualOp.operationTemplateKey, language);
|
|
288
|
+
const opDescription = yield this.generateDescription(manualOp.operationTemplateKey, manualOp.descriptionParams, language);
|
|
289
|
+
changes.push({
|
|
290
|
+
type: 'manual',
|
|
291
|
+
description: `${opName}: ${opDescription}`,
|
|
292
|
+
details: manualOp.descriptionParams,
|
|
293
|
+
createdAt: manualOp.createdAt,
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
// 按时间排序
|
|
297
|
+
changes.sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime());
|
|
298
|
+
results[transaction.id] = {
|
|
299
|
+
operationName,
|
|
300
|
+
description,
|
|
301
|
+
changes,
|
|
302
|
+
};
|
|
144
303
|
}
|
|
145
304
|
catch (error) {
|
|
146
|
-
console.error(`Failed to get description for transaction ${
|
|
305
|
+
console.error(`Failed to get description for transaction ${transaction.id}:`, error);
|
|
147
306
|
}
|
|
148
307
|
}
|
|
149
308
|
return results;
|
|
150
309
|
});
|
|
151
310
|
}
|
|
311
|
+
/**
|
|
312
|
+
* 填充模板
|
|
313
|
+
* @param template 模板字符串
|
|
314
|
+
* @param params 参数
|
|
315
|
+
* @returns 填充后的字符串
|
|
316
|
+
*/
|
|
152
317
|
fillTemplate(template, params) {
|
|
153
318
|
if (!template)
|
|
154
319
|
return '';
|
|
155
320
|
let result = template;
|
|
321
|
+
// 替换参数 {key} -> value
|
|
156
322
|
for (const [key, value] of Object.entries(params || {})) {
|
|
157
323
|
const placeholder = `{${key}}`;
|
|
158
324
|
if (result.includes(placeholder)) {
|
|
@@ -161,6 +327,12 @@ let OperationDescriptionService = class OperationDescriptionService {
|
|
|
161
327
|
}
|
|
162
328
|
return result;
|
|
163
329
|
}
|
|
330
|
+
/**
|
|
331
|
+
* 格式化显示值
|
|
332
|
+
* @param value 原始值
|
|
333
|
+
* @param displayValue 显示值
|
|
334
|
+
* @returns 格式化后的值
|
|
335
|
+
*/
|
|
164
336
|
formatDisplayValue(value, displayValue) {
|
|
165
337
|
if (displayValue !== undefined) {
|
|
166
338
|
return displayValue;
|
|
@@ -170,32 +342,70 @@ let OperationDescriptionService = class OperationDescriptionService {
|
|
|
170
342
|
}
|
|
171
343
|
return String(value);
|
|
172
344
|
}
|
|
345
|
+
/**
|
|
346
|
+
* 获取操作模板(使用统一缓存服务)
|
|
347
|
+
* @param templateKey 模板键
|
|
348
|
+
* @returns 操作模板
|
|
349
|
+
*/
|
|
173
350
|
getOperationTemplate(templateKey) {
|
|
174
351
|
return __awaiter(this, void 0, void 0, function* () {
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
352
|
+
// 使用统一缓存服务的 getOrSet 方法
|
|
353
|
+
return this.cacheService.getOrSet(templateKey, () => __awaiter(this, void 0, void 0, function* () {
|
|
354
|
+
// 从数据库查询
|
|
355
|
+
const template = yield this.templateRepository.findOne({
|
|
356
|
+
where: { key: templateKey },
|
|
357
|
+
});
|
|
358
|
+
return template;
|
|
359
|
+
}), {
|
|
360
|
+
namespace: this.CACHE_NAMESPACE,
|
|
361
|
+
ttl: this.CACHE_TTL,
|
|
362
|
+
// 只使用内存缓存层,避免序列化开销
|
|
363
|
+
layers: [cache_1.CacheLayer.MEMORY],
|
|
180
364
|
});
|
|
181
|
-
|
|
182
|
-
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* 获取模板字符串(仅返回模板文本,不填充参数)
|
|
369
|
+
* @param templateKey 模板键
|
|
370
|
+
* @param language 语言
|
|
371
|
+
* @returns 模板字符串
|
|
372
|
+
*/
|
|
373
|
+
getTemplate(templateKey_1) {
|
|
374
|
+
return __awaiter(this, arguments, void 0, function* (templateKey, language = 'zh') {
|
|
375
|
+
const template = yield this.getOperationTemplate(templateKey);
|
|
376
|
+
if (!template) {
|
|
377
|
+
return null;
|
|
183
378
|
}
|
|
184
|
-
return template;
|
|
379
|
+
return template.descriptionTemplates[language] || template.descriptionTemplates['zh'] || null;
|
|
185
380
|
});
|
|
186
381
|
}
|
|
382
|
+
/**
|
|
383
|
+
* 清除模板缓存
|
|
384
|
+
*/
|
|
187
385
|
clearTemplateCache() {
|
|
188
|
-
|
|
386
|
+
// 使用统一缓存服务清除
|
|
387
|
+
this.cacheService.deletePattern(`${this.CACHE_NAMESPACE}:*`, [cache_1.CacheLayer.MEMORY]);
|
|
189
388
|
}
|
|
389
|
+
/**
|
|
390
|
+
* 预加载模板到缓存
|
|
391
|
+
* @param templateKeys 模板键列表
|
|
392
|
+
*/
|
|
190
393
|
preloadTemplates(templateKeys) {
|
|
191
394
|
return __awaiter(this, void 0, void 0, function* () {
|
|
192
395
|
const templates = yield this.templateRepository
|
|
193
396
|
.createQueryBuilder('template')
|
|
194
397
|
.where('template.key IN (:...keys)', { keys: templateKeys })
|
|
195
398
|
.getMany();
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
399
|
+
// 批量设置到缓存
|
|
400
|
+
const cacheItems = templates.map(template => ({
|
|
401
|
+
key: template.key,
|
|
402
|
+
value: template,
|
|
403
|
+
}));
|
|
404
|
+
yield this.cacheService.mset(cacheItems, {
|
|
405
|
+
namespace: this.CACHE_NAMESPACE,
|
|
406
|
+
ttl: this.CACHE_TTL,
|
|
407
|
+
layers: [cache_1.CacheLayer.MEMORY],
|
|
408
|
+
});
|
|
199
409
|
});
|
|
200
410
|
}
|
|
201
411
|
};
|
|
@@ -209,5 +419,6 @@ exports.OperationDescriptionService = OperationDescriptionService = __decorate([
|
|
|
209
419
|
__metadata("design:paramtypes", [typeorm_2.Repository,
|
|
210
420
|
typeorm_2.Repository,
|
|
211
421
|
typeorm_2.Repository,
|
|
212
|
-
typeorm_2.Repository
|
|
422
|
+
typeorm_2.Repository,
|
|
423
|
+
cache_1.CacheService])
|
|
213
424
|
], OperationDescriptionService);
|
|
@@ -4,19 +4,49 @@ import { AuditOperation } from '../enums';
|
|
|
4
4
|
import { AuditContextService } from './audit-context.service';
|
|
5
5
|
import { EntityAuditService } from './entity-audit.service';
|
|
6
6
|
import { MultiDatabaseService } from './multi-database.service';
|
|
7
|
+
/**
|
|
8
|
+
* 事务审计服务
|
|
9
|
+
*/
|
|
7
10
|
export declare class TransactionAuditService {
|
|
8
11
|
private readonly transactionRepository;
|
|
9
12
|
private readonly contextService;
|
|
10
13
|
private readonly auditService;
|
|
11
14
|
private readonly multiDbService;
|
|
12
15
|
constructor(transactionRepository: Repository<EntityTransactionEntity>, contextService: AuditContextService, auditService: EntityAuditService, multiDbService: MultiDatabaseService);
|
|
16
|
+
/**
|
|
17
|
+
* 开始事务
|
|
18
|
+
*/
|
|
13
19
|
beginTransaction(description: string): Promise<string>;
|
|
20
|
+
/**
|
|
21
|
+
* 提交事务
|
|
22
|
+
*/
|
|
14
23
|
commitTransaction(transactionId: string): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* 回滚事务(支持多数据库)
|
|
26
|
+
*/
|
|
15
27
|
rollbackTransaction(transactionId: string): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* 添加实体到事务
|
|
30
|
+
*/
|
|
16
31
|
addEntityToTransaction(transactionId: string, entityType: string, entityId: string, operation: AuditOperation): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* 执行回滚(支持多数据库)
|
|
34
|
+
*/
|
|
17
35
|
private performRollback;
|
|
36
|
+
/**
|
|
37
|
+
* 按数据库连接分组实体
|
|
38
|
+
*/
|
|
18
39
|
private groupEntitiesByConnection;
|
|
40
|
+
/**
|
|
41
|
+
* 在指定连接中回滚实体
|
|
42
|
+
*/
|
|
19
43
|
private rollbackEntitiesInConnection;
|
|
44
|
+
/**
|
|
45
|
+
* 回滚单个实体
|
|
46
|
+
*/
|
|
20
47
|
private rollbackSingleEntity;
|
|
48
|
+
/**
|
|
49
|
+
* 获取最新的审计日志
|
|
50
|
+
*/
|
|
21
51
|
private getLatestAuditLog;
|
|
22
52
|
}
|
|
@@ -30,6 +30,10 @@ const enums_1 = require("../enums");
|
|
|
30
30
|
const audit_context_service_1 = require("./audit-context.service");
|
|
31
31
|
const entity_audit_service_1 = require("./entity-audit.service");
|
|
32
32
|
const multi_database_service_1 = require("./multi-database.service");
|
|
33
|
+
const transaction_1 = require("@nest-omni/transaction");
|
|
34
|
+
/**
|
|
35
|
+
* 事务审计服务
|
|
36
|
+
*/
|
|
33
37
|
let TransactionAuditService = class TransactionAuditService {
|
|
34
38
|
constructor(transactionRepository, contextService, auditService, multiDbService) {
|
|
35
39
|
this.transactionRepository = transactionRepository;
|
|
@@ -37,23 +41,30 @@ let TransactionAuditService = class TransactionAuditService {
|
|
|
37
41
|
this.auditService = auditService;
|
|
38
42
|
this.multiDbService = multiDbService;
|
|
39
43
|
}
|
|
44
|
+
/**
|
|
45
|
+
* 开始事务
|
|
46
|
+
*/
|
|
40
47
|
beginTransaction(description) {
|
|
41
48
|
return __awaiter(this, void 0, void 0, function* () {
|
|
42
49
|
const context = yield this.contextService.getCurrentContext();
|
|
43
50
|
const transaction = this.transactionRepository.create({
|
|
44
51
|
description,
|
|
45
|
-
status: enums_1.
|
|
52
|
+
status: enums_1.AuditTransactionStatus.PENDING,
|
|
46
53
|
entities: [],
|
|
47
54
|
userId: context.userId,
|
|
48
55
|
username: context.username,
|
|
49
56
|
});
|
|
50
57
|
const savedTransaction = yield this.transactionRepository.save(transaction);
|
|
58
|
+
// 设置事务ID到上下文
|
|
51
59
|
this.contextService.setContext({
|
|
52
60
|
transactionId: savedTransaction.id,
|
|
53
61
|
});
|
|
54
62
|
return savedTransaction.id;
|
|
55
63
|
});
|
|
56
64
|
}
|
|
65
|
+
/**
|
|
66
|
+
* 提交事务
|
|
67
|
+
*/
|
|
57
68
|
commitTransaction(transactionId) {
|
|
58
69
|
return __awaiter(this, void 0, void 0, function* () {
|
|
59
70
|
const transaction = yield this.transactionRepository.findOne({
|
|
@@ -62,10 +73,13 @@ let TransactionAuditService = class TransactionAuditService {
|
|
|
62
73
|
if (!transaction) {
|
|
63
74
|
throw new Error(`Transaction not found: ${transactionId}`);
|
|
64
75
|
}
|
|
65
|
-
transaction.status = enums_1.
|
|
76
|
+
transaction.status = enums_1.AuditTransactionStatus.COMMITTED;
|
|
66
77
|
yield this.transactionRepository.save(transaction);
|
|
67
78
|
});
|
|
68
79
|
}
|
|
80
|
+
/**
|
|
81
|
+
* 回滚事务(支持多数据库)
|
|
82
|
+
*/
|
|
69
83
|
rollbackTransaction(transactionId) {
|
|
70
84
|
return __awaiter(this, void 0, void 0, function* () {
|
|
71
85
|
const transaction = yield this.transactionRepository.findOne({
|
|
@@ -74,11 +88,15 @@ let TransactionAuditService = class TransactionAuditService {
|
|
|
74
88
|
if (!transaction) {
|
|
75
89
|
throw new Error(`Transaction not found: ${transactionId}`);
|
|
76
90
|
}
|
|
91
|
+
// 执行回滚操作
|
|
77
92
|
yield this.performRollback(transaction);
|
|
78
|
-
transaction.status = enums_1.
|
|
93
|
+
transaction.status = enums_1.AuditTransactionStatus.ROLLED_BACK;
|
|
79
94
|
yield this.transactionRepository.save(transaction);
|
|
80
95
|
});
|
|
81
96
|
}
|
|
97
|
+
/**
|
|
98
|
+
* 添加实体到事务
|
|
99
|
+
*/
|
|
82
100
|
addEntityToTransaction(transactionId, entityType, entityId, operation) {
|
|
83
101
|
return __awaiter(this, void 0, void 0, function* () {
|
|
84
102
|
const transaction = yield this.transactionRepository.findOne({
|
|
@@ -95,24 +113,35 @@ let TransactionAuditService = class TransactionAuditService {
|
|
|
95
113
|
yield this.transactionRepository.save(transaction);
|
|
96
114
|
});
|
|
97
115
|
}
|
|
116
|
+
/**
|
|
117
|
+
* 执行回滚(支持多数据库)
|
|
118
|
+
*/
|
|
98
119
|
performRollback(transaction) {
|
|
99
120
|
return __awaiter(this, void 0, void 0, function* () {
|
|
121
|
+
// 按相反顺序回滚实体
|
|
100
122
|
const reversedEntities = [...transaction.entities].reverse();
|
|
123
|
+
// 按数据库连接分组
|
|
101
124
|
const entitiesByConnection = yield this.groupEntitiesByConnection(reversedEntities);
|
|
125
|
+
// 对每个数据库连接执行回滚
|
|
102
126
|
for (const [connectionName, entities] of Object.entries(entitiesByConnection)) {
|
|
103
127
|
yield this.rollbackEntitiesInConnection(connectionName, entities);
|
|
104
128
|
}
|
|
105
129
|
});
|
|
106
130
|
}
|
|
131
|
+
/**
|
|
132
|
+
* 按数据库连接分组实体
|
|
133
|
+
*/
|
|
107
134
|
groupEntitiesByConnection(entities) {
|
|
108
135
|
return __awaiter(this, void 0, void 0, function* () {
|
|
109
136
|
const grouped = {};
|
|
137
|
+
// 获取所有监听的连接
|
|
110
138
|
const monitoredConnections = this.multiDbService.getMonitoredConnections();
|
|
139
|
+
// 尝试确定每个实体属于哪个连接
|
|
111
140
|
for (const entity of entities) {
|
|
112
141
|
let connectionFound = false;
|
|
113
142
|
for (const connectionName of monitoredConnections) {
|
|
114
143
|
try {
|
|
115
|
-
const dataSource =
|
|
144
|
+
const dataSource = (0, transaction_1.getDataSource)(connectionName);
|
|
116
145
|
const metadata = dataSource.getMetadata(entity.entityType);
|
|
117
146
|
if (metadata) {
|
|
118
147
|
if (!grouped[connectionName]) {
|
|
@@ -124,9 +153,11 @@ let TransactionAuditService = class TransactionAuditService {
|
|
|
124
153
|
}
|
|
125
154
|
}
|
|
126
155
|
catch (error) {
|
|
156
|
+
// 继续尝试下一个连接
|
|
127
157
|
continue;
|
|
128
158
|
}
|
|
129
159
|
}
|
|
160
|
+
// 如果没有找到连接,使用默认连接
|
|
130
161
|
if (!connectionFound) {
|
|
131
162
|
const defaultConnection = 'default';
|
|
132
163
|
if (!grouped[defaultConnection]) {
|
|
@@ -138,9 +169,13 @@ let TransactionAuditService = class TransactionAuditService {
|
|
|
138
169
|
return grouped;
|
|
139
170
|
});
|
|
140
171
|
}
|
|
172
|
+
/**
|
|
173
|
+
* 在指定连接中回滚实体
|
|
174
|
+
*/
|
|
141
175
|
rollbackEntitiesInConnection(connectionName, entities) {
|
|
142
176
|
return __awaiter(this, void 0, void 0, function* () {
|
|
143
|
-
const dataSource =
|
|
177
|
+
const dataSource = (0, transaction_1.getDataSource)(connectionName);
|
|
178
|
+
// 使用事务执行回滚
|
|
144
179
|
yield dataSource.transaction((manager) => __awaiter(this, void 0, void 0, function* () {
|
|
145
180
|
for (const entity of entities) {
|
|
146
181
|
try {
|
|
@@ -154,26 +189,34 @@ let TransactionAuditService = class TransactionAuditService {
|
|
|
154
189
|
}));
|
|
155
190
|
});
|
|
156
191
|
}
|
|
192
|
+
/**
|
|
193
|
+
* 回滚单个实体
|
|
194
|
+
*/
|
|
157
195
|
rollbackSingleEntity(manager, entity, connectionName) {
|
|
158
196
|
return __awaiter(this, void 0, void 0, function* () {
|
|
159
197
|
const repository = manager.getRepository(entity.entityType);
|
|
160
198
|
switch (entity.operation) {
|
|
161
199
|
case enums_1.AuditOperation.CREATE:
|
|
200
|
+
// 创建操作回滚:删除实体
|
|
162
201
|
yield repository.delete({ id: entity.entityId });
|
|
163
202
|
break;
|
|
164
203
|
case enums_1.AuditOperation.UPDATE:
|
|
204
|
+
// 更新操作回滚:恢复到之前的值
|
|
205
|
+
// 需要从审计日志中获取之前的值
|
|
165
206
|
const auditLog = yield this.getLatestAuditLog(entity.entityType, entity.entityId);
|
|
166
207
|
if (auditLog && auditLog.oldValue) {
|
|
167
208
|
yield repository.update({ id: entity.entityId }, auditLog.oldValue);
|
|
168
209
|
}
|
|
169
210
|
break;
|
|
170
211
|
case enums_1.AuditOperation.DELETE:
|
|
212
|
+
// 删除操作回滚:恢复实体
|
|
171
213
|
const deletedAuditLog = yield this.getLatestAuditLog(entity.entityType, entity.entityId);
|
|
172
214
|
if (deletedAuditLog && deletedAuditLog.oldValue) {
|
|
173
215
|
yield repository.save(deletedAuditLog.oldValue);
|
|
174
216
|
}
|
|
175
217
|
break;
|
|
176
218
|
case enums_1.AuditOperation.RESTORE:
|
|
219
|
+
// 恢复操作回滚:撤销恢复
|
|
177
220
|
const restoreAuditLog = yield this.getLatestAuditLog(entity.entityType, entity.entityId);
|
|
178
221
|
if (restoreAuditLog && restoreAuditLog.oldValue) {
|
|
179
222
|
yield repository.update({ id: entity.entityId }, restoreAuditLog.oldValue);
|
|
@@ -184,8 +227,13 @@ let TransactionAuditService = class TransactionAuditService {
|
|
|
184
227
|
}
|
|
185
228
|
});
|
|
186
229
|
}
|
|
230
|
+
/**
|
|
231
|
+
* 获取最新的审计日志
|
|
232
|
+
*/
|
|
187
233
|
getLatestAuditLog(entityType, entityId) {
|
|
188
234
|
return __awaiter(this, void 0, void 0, function* () {
|
|
235
|
+
// 这里需要从审计服务获取
|
|
236
|
+
// 由于循环依赖,这里简化实现
|
|
189
237
|
return null;
|
|
190
238
|
});
|
|
191
239
|
}
|
|
@@ -2,13 +2,32 @@ import { EntitySubscriberInterface, InsertEvent, UpdateEvent, RemoveEvent, DataS
|
|
|
2
2
|
import { EntityAuditService } from '../services/entity-audit.service';
|
|
3
3
|
import { AuditContextService } from '../services/audit-context.service';
|
|
4
4
|
import { DefaultAuditStrategy } from '../services/audit-strategy.service';
|
|
5
|
+
/**
|
|
6
|
+
* 实体审计订阅者
|
|
7
|
+
*/
|
|
5
8
|
export declare class EntityAuditSubscriber implements EntitySubscriberInterface<any> {
|
|
6
9
|
private readonly entityAuditService;
|
|
7
10
|
private readonly contextService;
|
|
8
11
|
private readonly auditStrategy;
|
|
9
12
|
constructor(entityAuditService: EntityAuditService, contextService: AuditContextService, auditStrategy: DefaultAuditStrategy, dataSource: DataSource);
|
|
13
|
+
/**
|
|
14
|
+
* 在实体插入后记录审计日志
|
|
15
|
+
*/
|
|
10
16
|
afterInsert(event: InsertEvent<any>): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* 在实体更新后记录审计日志
|
|
19
|
+
*/
|
|
11
20
|
afterUpdate(event: UpdateEvent<any>): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* 在实体删除前记录审计日志
|
|
23
|
+
*/
|
|
12
24
|
beforeRemove(event: RemoveEvent<any>): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* 计算变更字段
|
|
27
|
+
*/
|
|
28
|
+
private calculateChangedFields;
|
|
29
|
+
/**
|
|
30
|
+
* 检查是否启用了审计
|
|
31
|
+
*/
|
|
13
32
|
private isAuditEnabled;
|
|
14
33
|
}
|