@nest-omni/core 4.1.3-3 → 4.1.3-31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/audit/audit.module.d.ts +1 -0
- package/audit/audit.module.js +51 -2
- package/audit/controllers/audit.controller.d.ts +57 -1
- package/audit/controllers/audit.controller.js +43 -0
- package/audit/decorators/audit-action.decorator.d.ts +74 -0
- package/audit/decorators/audit-action.decorator.js +42 -0
- package/audit/decorators/audit-controller.decorator.d.ts +1 -1
- package/audit/decorators/audit-controller.decorator.js +2 -2
- package/audit/decorators/audit-operation.decorator.d.ts +0 -7
- package/audit/decorators/audit-operation.decorator.js +0 -7
- package/audit/decorators/entity-audit.decorator.d.ts +78 -2
- package/audit/decorators/entity-audit.decorator.js +145 -4
- package/audit/decorators/index.d.ts +2 -0
- package/audit/decorators/index.js +2 -0
- package/audit/dto/audit-action-query.dto.d.ts +13 -0
- package/audit/dto/audit-action-query.dto.js +77 -0
- package/audit/dto/index.d.ts +1 -0
- package/audit/dto/index.js +1 -0
- package/audit/entities/audit-action-summary.entity.d.ts +23 -0
- package/audit/entities/audit-action-summary.entity.js +101 -0
- package/audit/entities/entity-audit-log.entity.d.ts +7 -2
- package/audit/entities/entity-audit-log.entity.js +45 -9
- package/audit/entities/entity-transaction.entity.d.ts +8 -2
- package/audit/entities/entity-transaction.entity.js +39 -3
- package/audit/entities/index.d.ts +3 -0
- package/audit/entities/index.js +3 -0
- package/audit/entities/manual-operation-log.entity.d.ts +0 -2
- package/audit/entities/manual-operation-log.entity.js +8 -9
- package/audit/enums/audit.enums.d.ts +14 -6
- package/audit/enums/audit.enums.js +18 -9
- package/audit/examples/decorator-value-mapping.example.d.ts +70 -0
- package/audit/examples/decorator-value-mapping.example.js +414 -0
- package/audit/index.d.ts +5 -1
- package/audit/index.js +29 -2
- package/audit/interceptors/audit-action.interceptor.d.ts +39 -0
- package/audit/interceptors/audit-action.interceptor.js +217 -0
- package/audit/interceptors/audit.interceptor.d.ts +1 -0
- package/audit/interceptors/audit.interceptor.js +19 -11
- package/audit/interceptors/index.d.ts +1 -0
- package/audit/interceptors/index.js +1 -0
- package/audit/interfaces/audit.interfaces.d.ts +132 -4
- package/audit/services/audit-action.service.d.ts +142 -0
- package/audit/services/audit-action.service.js +246 -0
- package/audit/services/audit-context.service.d.ts +91 -0
- package/audit/services/audit-context.service.js +170 -0
- package/audit/services/entity-audit.service.d.ts +220 -9
- package/audit/services/entity-audit.service.js +761 -72
- package/audit/services/index.d.ts +3 -0
- package/audit/services/index.js +3 -0
- package/audit/services/manual-audit-log.service.d.ts +23 -23
- package/audit/services/manual-audit-log.service.js +34 -57
- package/audit/services/multi-database.service.d.ts +0 -5
- package/audit/services/multi-database.service.js +0 -24
- package/audit/services/operation-description.service.d.ts +14 -3
- package/audit/services/operation-description.service.js +165 -26
- package/audit/services/transaction-audit.service.d.ts +1 -0
- package/audit/services/transaction-audit.service.js +12 -9
- package/audit/subscribers/entity-audit.subscriber.d.ts +5 -0
- package/audit/subscribers/entity-audit.subscriber.js +69 -5
- package/cache/cache.module.d.ts +7 -8
- package/cache/cache.module.js +15 -13
- package/cache/cache.service.d.ts +6 -4
- package/cache/cache.service.js +24 -12
- package/cache/decorators/cache-put.decorator.js +5 -4
- package/cache/dependencies/callback.dependency.js +9 -0
- package/cache/dependencies/db.dependency.d.ts +43 -12
- package/cache/dependencies/db.dependency.js +46 -18
- package/cache/dependencies/tag.dependency.d.ts +31 -4
- package/cache/dependencies/tag.dependency.js +100 -11
- package/cache/entities/index.d.ts +1 -0
- package/cache/entities/index.js +17 -0
- package/cache/entities/typeorm-cache.entity.d.ts +71 -0
- package/cache/entities/typeorm-cache.entity.js +110 -0
- package/cache/index.d.ts +2 -1
- package/cache/index.js +19 -2
- package/cache/interfaces/cache-options.interface.d.ts +8 -0
- package/cache/providers/index.d.ts +2 -1
- package/cache/providers/index.js +2 -1
- package/cache/providers/lrucache.provider.d.ts +77 -0
- package/cache/providers/lrucache.provider.js +228 -0
- package/cache/providers/redis-cache.provider.d.ts +1 -0
- package/cache/providers/redis-cache.provider.js +8 -6
- package/cache/providers/typeorm-cache.provider.d.ts +211 -0
- package/cache/providers/typeorm-cache.provider.js +483 -0
- package/common/boilerplate.polyfill.d.ts +1 -0
- package/common/boilerplate.polyfill.js +18 -1
- package/common/helpers/validation-metadata-helper.d.ts +112 -0
- package/common/helpers/validation-metadata-helper.js +164 -0
- package/common/index.d.ts +1 -0
- package/common/index.js +4 -0
- package/decorators/examples/field-i18n.example.d.ts +294 -0
- package/decorators/examples/field-i18n.example.js +478 -0
- package/decorators/field.decorators.d.ts +95 -3
- package/decorators/field.decorators.js +152 -18
- package/decorators/transform.decorators.d.ts +0 -2
- package/decorators/transform.decorators.js +0 -23
- package/decorators/translate.decorator.d.ts +26 -0
- package/decorators/translate.decorator.js +26 -1
- package/email-log/email-log.constants.d.ts +8 -0
- package/email-log/email-log.constants.js +11 -0
- package/email-log/email-log.module.d.ts +47 -0
- package/email-log/email-log.module.js +140 -0
- package/email-log/index.d.ts +11 -0
- package/email-log/index.js +48 -0
- package/email-log/interfaces/email-log-options.interface.d.ts +61 -0
- package/email-log/interfaces/email-log-options.interface.js +134 -0
- package/email-log/interfaces/email-log-transport.interface.d.ts +20 -0
- package/email-log/interfaces/email-log-transport.interface.js +2 -0
- package/email-log/interfaces/index.d.ts +2 -0
- package/email-log/interfaces/index.js +18 -0
- package/email-log/providers/email-provider.d.ts +42 -0
- package/email-log/providers/email-provider.js +127 -0
- package/email-log/providers/index.d.ts +1 -0
- package/email-log/providers/index.js +17 -0
- package/email-log/services/email-log-alert.service.d.ts +46 -0
- package/email-log/services/email-log-alert.service.js +162 -0
- package/email-log/services/email-log-formatter.service.d.ts +78 -0
- package/email-log/services/email-log-formatter.service.js +442 -0
- package/email-log/services/email-log-logger.service.d.ts +85 -0
- package/email-log/services/email-log-logger.service.js +168 -0
- package/email-log/services/email-log-rate-limiter.service.d.ts +42 -0
- package/email-log/services/email-log-rate-limiter.service.js +110 -0
- package/email-log/services/email-log-transport.service.d.ts +80 -0
- package/email-log/services/email-log-transport.service.js +271 -0
- package/email-log/services/index.d.ts +5 -0
- package/email-log/services/index.js +21 -0
- package/email-log/transports/index.d.ts +1 -0
- package/email-log/transports/index.js +17 -0
- package/email-log/transports/pino-email.transport.d.ts +56 -0
- package/email-log/transports/pino-email.transport.js +188 -0
- package/email-log/utils/index.d.ts +2 -0
- package/email-log/utils/index.js +18 -0
- package/email-log/utils/log-level.helper.d.ts +46 -0
- package/email-log/utils/log-level.helper.js +74 -0
- package/email-log/utils/pino-transport.utils.d.ts +135 -0
- package/email-log/utils/pino-transport.utils.js +238 -0
- package/file-upload/controllers/file-access.controller.d.ts +23 -0
- package/file-upload/controllers/file-access.controller.js +128 -0
- package/file-upload/decorators/column.decorator.d.ts +151 -0
- package/file-upload/decorators/column.decorator.js +273 -0
- package/file-upload/decorators/csv-data.decorator.d.ts +30 -0
- package/file-upload/decorators/csv-data.decorator.js +85 -0
- package/file-upload/decorators/csv-import.decorator.d.ts +34 -0
- package/file-upload/decorators/csv-import.decorator.js +24 -0
- package/file-upload/decorators/examples/column-mapping.example.d.ts +76 -0
- package/file-upload/decorators/examples/column-mapping.example.js +122 -0
- package/file-upload/decorators/excel-data.decorator.d.ts +30 -0
- package/file-upload/decorators/excel-data.decorator.js +85 -0
- package/file-upload/decorators/file-upload.decorator.d.ts +83 -0
- package/file-upload/decorators/file-upload.decorator.js +172 -0
- package/file-upload/decorators/index.d.ts +5 -0
- package/file-upload/decorators/index.js +38 -0
- package/file-upload/decorators/process.decorator.d.ts +40 -0
- package/file-upload/decorators/process.decorator.js +52 -0
- package/file-upload/decorators/validate-data.decorator.d.ts +91 -0
- package/file-upload/decorators/validate-data.decorator.js +39 -0
- package/file-upload/dto/create-file.dto.d.ts +24 -0
- package/file-upload/dto/create-file.dto.js +112 -0
- package/file-upload/dto/find-files.dto.d.ts +15 -0
- package/file-upload/dto/find-files.dto.js +76 -0
- package/file-upload/dto/index.d.ts +4 -0
- package/file-upload/dto/index.js +20 -0
- package/file-upload/dto/pagination.dto.d.ts +7 -0
- package/file-upload/dto/pagination.dto.js +39 -0
- package/file-upload/dto/update-file.dto.d.ts +15 -0
- package/file-upload/dto/update-file.dto.js +67 -0
- package/file-upload/entities/file-metadata.entity.d.ts +25 -0
- package/file-upload/entities/file-metadata.entity.js +76 -0
- package/file-upload/entities/file.entity.d.ts +114 -0
- package/file-upload/entities/file.entity.js +350 -0
- package/file-upload/entities/index.d.ts +2 -0
- package/file-upload/entities/index.js +18 -0
- package/file-upload/enums/file-type.enum.d.ts +72 -0
- package/file-upload/enums/file-type.enum.js +212 -0
- package/file-upload/exceptions/file-upload.exception.d.ts +57 -0
- package/file-upload/exceptions/file-upload.exception.js +120 -0
- package/file-upload/exceptions/index.d.ts +1 -0
- package/file-upload/exceptions/index.js +17 -0
- package/file-upload/file-upload.module.d.ts +89 -0
- package/file-upload/file-upload.module.js +292 -0
- package/file-upload/index.d.ts +37 -0
- package/file-upload/index.js +77 -0
- package/file-upload/interceptors/file-upload.interceptor.d.ts +101 -0
- package/file-upload/interceptors/file-upload.interceptor.js +594 -0
- package/file-upload/interceptors/index.d.ts +1 -0
- package/file-upload/interceptors/index.js +17 -0
- package/file-upload/interfaces/custom-file-type.interface.d.ts +72 -0
- package/file-upload/interfaces/custom-file-type.interface.js +2 -0
- package/file-upload/interfaces/file-buffer.interface.d.ts +72 -0
- package/file-upload/interfaces/file-buffer.interface.js +2 -0
- package/file-upload/interfaces/file-entity.interface.d.ts +142 -0
- package/file-upload/interfaces/file-entity.interface.js +28 -0
- package/file-upload/interfaces/file-metadata.interface.d.ts +21 -0
- package/file-upload/interfaces/file-metadata.interface.js +2 -0
- package/file-upload/interfaces/file-processor.interface.d.ts +93 -0
- package/file-upload/interfaces/file-processor.interface.js +2 -0
- package/file-upload/interfaces/file-upload-options.interface.d.ts +74 -0
- package/file-upload/interfaces/file-upload-options.interface.js +5 -0
- package/file-upload/interfaces/index.d.ts +7 -0
- package/file-upload/interfaces/index.js +24 -0
- package/file-upload/interfaces/processor-options.interface.d.ts +102 -0
- package/file-upload/interfaces/processor-options.interface.js +2 -0
- package/file-upload/interfaces/storage-provider.interface.d.ts +239 -0
- package/file-upload/interfaces/storage-provider.interface.js +2 -0
- package/file-upload/interfaces/upload-options.interface.d.ts +19 -0
- package/file-upload/interfaces/upload-options.interface.js +2 -0
- package/file-upload/processors/csv.processor.d.ts +98 -0
- package/file-upload/processors/csv.processor.js +391 -0
- package/file-upload/processors/excel.processor.d.ts +130 -0
- package/file-upload/processors/excel.processor.js +547 -0
- package/file-upload/processors/image.processor.d.ts +199 -0
- package/file-upload/processors/image.processor.js +377 -0
- package/file-upload/providers/index.d.ts +2 -0
- package/file-upload/providers/index.js +18 -0
- package/file-upload/providers/local-storage.provider.d.ts +98 -0
- package/file-upload/providers/local-storage.provider.js +484 -0
- package/file-upload/providers/s3-storage.provider.d.ts +87 -0
- package/file-upload/providers/s3-storage.provider.js +455 -0
- package/file-upload/services/file-signature-validator.service.d.ts +118 -0
- package/file-upload/services/file-signature-validator.service.js +376 -0
- package/file-upload/services/file.service.d.ts +193 -0
- package/file-upload/services/file.service.js +638 -0
- package/file-upload/services/index.d.ts +4 -0
- package/file-upload/services/index.js +20 -0
- package/file-upload/services/malicious-file-detector.service.d.ts +300 -0
- package/file-upload/services/malicious-file-detector.service.js +1234 -0
- package/file-upload/services/mime-registry.service.d.ts +47 -0
- package/file-upload/services/mime-registry.service.js +167 -0
- package/file-upload/utils/checksum.util.d.ts +28 -0
- package/file-upload/utils/checksum.util.js +65 -0
- package/file-upload/utils/dynamic-import.util.d.ts +54 -0
- package/file-upload/utils/dynamic-import.util.js +156 -0
- package/file-upload/utils/filename.util.d.ts +59 -0
- package/file-upload/utils/filename.util.js +184 -0
- package/file-upload/utils/filepath.util.d.ts +70 -0
- package/file-upload/utils/filepath.util.js +152 -0
- package/file-upload/utils/index.d.ts +4 -0
- package/file-upload/utils/index.js +20 -0
- package/filters/bad-request.filter.d.ts +9 -0
- package/filters/bad-request.filter.js +57 -16
- package/http-client/config/http-client.config.d.ts +5 -0
- package/http-client/config/http-client.config.js +27 -14
- package/http-client/decorators/http-client.decorators.d.ts +7 -28
- package/http-client/decorators/http-client.decorators.js +124 -99
- package/http-client/entities/http-log.entity.d.ts +0 -20
- package/http-client/entities/http-log.entity.js +1 -21
- package/http-client/examples/advanced-usage.example.d.ts +4 -5
- package/http-client/examples/advanced-usage.example.js +7 -59
- package/http-client/examples/axios-config-extended.example.d.ts +17 -0
- package/http-client/examples/axios-config-extended.example.js +311 -0
- package/http-client/examples/flexible-response-example.d.ts +28 -0
- package/http-client/examples/flexible-response-example.js +120 -0
- package/http-client/examples/index.d.ts +2 -0
- package/http-client/examples/index.js +2 -0
- package/http-client/examples/proxy-from-environment.example.d.ts +133 -0
- package/http-client/examples/proxy-from-environment.example.js +409 -0
- package/http-client/examples/ssl-certificate.example.d.ts +47 -0
- package/http-client/examples/ssl-certificate.example.js +432 -0
- package/http-client/http-client.module.d.ts +43 -2
- package/http-client/http-client.module.js +150 -90
- package/http-client/index.d.ts +1 -1
- package/http-client/interfaces/api-client-config.interface.d.ts +24 -103
- package/http-client/interfaces/http-client-config.interface.d.ts +137 -62
- package/http-client/services/api-client-registry.service.d.ts +8 -21
- package/http-client/services/api-client-registry.service.js +31 -282
- package/http-client/services/circuit-breaker.service.d.ts +69 -2
- package/http-client/services/circuit-breaker.service.js +185 -7
- package/http-client/services/http-client.service.d.ts +85 -23
- package/http-client/services/http-client.service.js +512 -168
- package/http-client/services/http-log-query.service.js +0 -13
- package/http-client/services/index.d.ts +0 -1
- package/http-client/services/index.js +0 -1
- package/http-client/services/logging.service.d.ts +69 -16
- package/http-client/services/logging.service.js +290 -170
- package/http-client/utils/call-stack-extractor.util.d.ts +26 -0
- package/http-client/utils/call-stack-extractor.util.js +35 -0
- package/http-client/utils/context-extractor.util.d.ts +2 -0
- package/http-client/utils/context-extractor.util.js +17 -3
- package/http-client/utils/curl-generator.util.js +2 -5
- package/http-client/utils/index.d.ts +2 -0
- package/http-client/utils/index.js +2 -0
- package/http-client/utils/proxy-environment.util.d.ts +42 -0
- package/http-client/utils/proxy-environment.util.js +154 -0
- package/http-client/utils/retry-recorder.util.d.ts +0 -4
- package/http-client/utils/retry-recorder.util.js +2 -27
- package/http-client/utils/sanitize.util.d.ts +58 -0
- package/http-client/utils/sanitize.util.js +188 -0
- package/http-client/utils/security-validator.util.d.ts +118 -0
- package/http-client/utils/security-validator.util.js +354 -0
- package/index.d.ts +4 -1
- package/index.js +6 -1
- package/interceptors/translation-interceptor.service.d.ts +7 -0
- package/interceptors/translation-interceptor.service.js +40 -8
- package/ip-filter/constants.d.ts +21 -0
- package/ip-filter/constants.js +24 -0
- package/ip-filter/decorators/index.d.ts +1 -0
- package/ip-filter/decorators/index.js +17 -0
- package/ip-filter/decorators/ip-filter.decorator.d.ts +58 -0
- package/ip-filter/decorators/ip-filter.decorator.js +79 -0
- package/ip-filter/guards/index.d.ts +1 -0
- package/ip-filter/guards/index.js +17 -0
- package/ip-filter/guards/ip-filter.guard.d.ts +62 -0
- package/ip-filter/guards/ip-filter.guard.js +174 -0
- package/ip-filter/index.d.ts +7 -0
- package/ip-filter/index.js +23 -0
- package/ip-filter/interfaces/index.d.ts +4 -0
- package/ip-filter/interfaces/index.js +20 -0
- package/ip-filter/interfaces/ip-filter-async-options.interface.d.ts +15 -0
- package/ip-filter/interfaces/ip-filter-async-options.interface.js +2 -0
- package/ip-filter/interfaces/ip-filter-metadata.interface.d.ts +26 -0
- package/ip-filter/interfaces/ip-filter-metadata.interface.js +2 -0
- package/ip-filter/interfaces/ip-filter-options.interface.d.ts +34 -0
- package/ip-filter/interfaces/ip-filter-options.interface.js +2 -0
- package/ip-filter/interfaces/ip-rule.interface.d.ts +36 -0
- package/ip-filter/interfaces/ip-rule.interface.js +2 -0
- package/ip-filter/ip-filter.module.d.ts +55 -0
- package/ip-filter/ip-filter.module.js +105 -0
- package/ip-filter/services/index.d.ts +1 -0
- package/ip-filter/services/index.js +17 -0
- package/ip-filter/services/ip-filter.service.d.ts +92 -0
- package/ip-filter/services/ip-filter.service.js +238 -0
- package/ip-filter/utils/index.d.ts +1 -0
- package/ip-filter/utils/index.js +17 -0
- package/ip-filter/utils/ip-utils.d.ts +61 -0
- package/ip-filter/utils/ip-utils.js +162 -0
- package/package.json +34 -29
- package/providers/context.provider.d.ts +9 -0
- package/providers/context.provider.js +13 -0
- package/redis-lock/comprehensive-lock-cleanup.service.d.ts +94 -0
- package/redis-lock/comprehensive-lock-cleanup.service.js +253 -0
- package/redis-lock/index.d.ts +2 -0
- package/redis-lock/index.js +5 -1
- package/redis-lock/lock-heartbeat.service.d.ts +80 -0
- package/redis-lock/lock-heartbeat.service.js +232 -0
- package/redis-lock/redis-lock.module.d.ts +6 -0
- package/redis-lock/redis-lock.module.js +136 -77
- package/redis-lock/redis-lock.service.d.ts +31 -0
- package/redis-lock/redis-lock.service.js +124 -17
- package/setup/bootstrap.setup.d.ts +2 -1
- package/setup/bootstrap.setup.js +3 -2
- package/setup/index.d.ts +1 -0
- package/setup/index.js +1 -0
- package/setup/run-in-mode.decorator.d.ts +56 -0
- package/setup/run-in-mode.decorator.js +92 -0
- package/setup/schedule.decorator.d.ts +1 -0
- package/setup/schedule.decorator.js +28 -13
- package/setup/worker.decorator.js +10 -1
- package/shared/index.d.ts +1 -1
- package/shared/index.js +1 -1
- package/shared/{serviceRegistryModule.js → service-registry.module.js} +28 -17
- package/shared/services/api-config.service.d.ts +41 -0
- package/shared/services/api-config.service.js +175 -8
- package/shared/services/index.d.ts +0 -1
- package/shared/services/index.js +0 -1
- package/validators/custom-validate.validator.d.ts +1 -0
- package/validators/custom-validate.validator.js +1 -0
- package/validators/file-mimetype.validator.d.ts +0 -2
- package/validators/file-mimetype.validator.js +4 -6
- package/validators/is-exists.validator.d.ts +15 -6
- package/validators/is-exists.validator.js +8 -7
- package/validators/is-unique.validator.d.ts +22 -7
- package/validators/is-unique.validator.js +41 -17
- package/vault/vault-config.service.js +1 -1
- package/cache/providers/memory-cache.provider.d.ts +0 -49
- package/cache/providers/memory-cache.provider.js +0 -197
- package/http-client/services/cache.service.d.ts +0 -76
- package/http-client/services/cache.service.js +0 -333
- package/shared/services/validator.service.d.ts +0 -3
- package/shared/services/validator.service.js +0 -20
- /package/shared/{serviceRegistryModule.d.ts → service-registry.module.d.ts} +0 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Email logging transport configuration options
|
|
3
|
+
* Follows libs/core pattern from CacheModuleOptions
|
|
4
|
+
*/
|
|
5
|
+
export declare class EmailLogOptions {
|
|
6
|
+
/**
|
|
7
|
+
* Enable email log transport
|
|
8
|
+
* @default false
|
|
9
|
+
*/
|
|
10
|
+
enabled: boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Minimum log level to trigger email
|
|
13
|
+
* Uses Pino log levels: 'trace', 'debug', 'info', 'warn', 'error', 'fatal'
|
|
14
|
+
* @default 'error'
|
|
15
|
+
*/
|
|
16
|
+
level: string;
|
|
17
|
+
/**
|
|
18
|
+
* Recipient email addresses
|
|
19
|
+
*/
|
|
20
|
+
to: string[];
|
|
21
|
+
/**
|
|
22
|
+
* CC recipient email addresses (optional)
|
|
23
|
+
*/
|
|
24
|
+
cc?: string[];
|
|
25
|
+
/**
|
|
26
|
+
* Sender email address
|
|
27
|
+
*/
|
|
28
|
+
from: string;
|
|
29
|
+
/**
|
|
30
|
+
* Email subject prefix
|
|
31
|
+
* Final subject: "[prefix] appName - log level"
|
|
32
|
+
* @default '[Log Alert]'
|
|
33
|
+
*/
|
|
34
|
+
subjectPrefix?: string;
|
|
35
|
+
/**
|
|
36
|
+
* SMTP configuration
|
|
37
|
+
*/
|
|
38
|
+
smtpHost: string;
|
|
39
|
+
smtpPort?: number;
|
|
40
|
+
smtpUsername?: string;
|
|
41
|
+
smtpPassword?: string;
|
|
42
|
+
smtpSecure?: boolean;
|
|
43
|
+
smtpIgnoreTLSError?: boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Rate limiting configuration
|
|
46
|
+
*/
|
|
47
|
+
rateLimitMaxEmails?: number;
|
|
48
|
+
rateLimitWindowMs?: number;
|
|
49
|
+
rateLimitBurstSize?: number;
|
|
50
|
+
/**
|
|
51
|
+
* Email formatting options
|
|
52
|
+
*/
|
|
53
|
+
useHtmlFormat?: boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Filtering options
|
|
56
|
+
*/
|
|
57
|
+
includeApps?: string[];
|
|
58
|
+
excludeApps?: string[];
|
|
59
|
+
includeErrors?: string[];
|
|
60
|
+
excludeErrors?: string[];
|
|
61
|
+
}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.EmailLogOptions = void 0;
|
|
13
|
+
const decorators_1 = require("../../decorators");
|
|
14
|
+
/**
|
|
15
|
+
* Email logging transport configuration options
|
|
16
|
+
* Follows libs/core pattern from CacheModuleOptions
|
|
17
|
+
*/
|
|
18
|
+
class EmailLogOptions {
|
|
19
|
+
}
|
|
20
|
+
exports.EmailLogOptions = EmailLogOptions;
|
|
21
|
+
__decorate([
|
|
22
|
+
(0, decorators_1.StringField)({ fieldLabel: { zh: '启用邮件日志', en: 'Enable Email Log' } }),
|
|
23
|
+
__metadata("design:type", Boolean)
|
|
24
|
+
], EmailLogOptions.prototype, "enabled", void 0);
|
|
25
|
+
__decorate([
|
|
26
|
+
(0, decorators_1.StringField)({ fieldLabel: { zh: '日志级别', en: 'Log Level' } }),
|
|
27
|
+
__metadata("design:type", String)
|
|
28
|
+
], EmailLogOptions.prototype, "level", void 0);
|
|
29
|
+
__decorate([
|
|
30
|
+
(0, decorators_1.EmailField)({ each: true, fieldLabel: { zh: '收件人', en: 'Recipients' } }),
|
|
31
|
+
__metadata("design:type", Array)
|
|
32
|
+
], EmailLogOptions.prototype, "to", void 0);
|
|
33
|
+
__decorate([
|
|
34
|
+
(0, decorators_1.EmailFieldOptional)({
|
|
35
|
+
each: true,
|
|
36
|
+
fieldLabel: { zh: '抄送', en: 'CC Recipients' },
|
|
37
|
+
}),
|
|
38
|
+
__metadata("design:type", Array)
|
|
39
|
+
], EmailLogOptions.prototype, "cc", void 0);
|
|
40
|
+
__decorate([
|
|
41
|
+
(0, decorators_1.EmailField)({ fieldLabel: { zh: '发件人', en: 'Sender Email' } }),
|
|
42
|
+
__metadata("design:type", String)
|
|
43
|
+
], EmailLogOptions.prototype, "from", void 0);
|
|
44
|
+
__decorate([
|
|
45
|
+
(0, decorators_1.StringFieldOptional)({
|
|
46
|
+
fieldLabel: { zh: '邮件主题前缀', en: 'Subject Prefix' },
|
|
47
|
+
}),
|
|
48
|
+
__metadata("design:type", String)
|
|
49
|
+
], EmailLogOptions.prototype, "subjectPrefix", void 0);
|
|
50
|
+
__decorate([
|
|
51
|
+
(0, decorators_1.StringField)({ fieldLabel: { zh: 'SMTP主机', en: 'SMTP Host' } }),
|
|
52
|
+
__metadata("design:type", String)
|
|
53
|
+
], EmailLogOptions.prototype, "smtpHost", void 0);
|
|
54
|
+
__decorate([
|
|
55
|
+
(0, decorators_1.NumberFieldOptional)({ fieldLabel: { zh: 'SMTP端口', en: 'SMTP Port' } }),
|
|
56
|
+
__metadata("design:type", Number)
|
|
57
|
+
], EmailLogOptions.prototype, "smtpPort", void 0);
|
|
58
|
+
__decorate([
|
|
59
|
+
(0, decorators_1.StringFieldOptional)({
|
|
60
|
+
fieldLabel: { zh: 'SMTP用户名', en: 'SMTP Username' },
|
|
61
|
+
}),
|
|
62
|
+
__metadata("design:type", String)
|
|
63
|
+
], EmailLogOptions.prototype, "smtpUsername", void 0);
|
|
64
|
+
__decorate([
|
|
65
|
+
(0, decorators_1.StringFieldOptional)({
|
|
66
|
+
fieldLabel: { zh: 'SMTP密码', en: 'SMTP Password' },
|
|
67
|
+
sensitive: true,
|
|
68
|
+
}),
|
|
69
|
+
__metadata("design:type", String)
|
|
70
|
+
], EmailLogOptions.prototype, "smtpPassword", void 0);
|
|
71
|
+
__decorate([
|
|
72
|
+
(0, decorators_1.BooleanFieldOptional)({
|
|
73
|
+
fieldLabel: { zh: 'SSL/TLS加密', en: 'SMTP Secure' },
|
|
74
|
+
}),
|
|
75
|
+
__metadata("design:type", Boolean)
|
|
76
|
+
], EmailLogOptions.prototype, "smtpSecure", void 0);
|
|
77
|
+
__decorate([
|
|
78
|
+
(0, decorators_1.BooleanFieldOptional)({
|
|
79
|
+
fieldLabel: { zh: '忽略TLS错误', en: 'Ignore TLS Error' },
|
|
80
|
+
}),
|
|
81
|
+
__metadata("design:type", Boolean)
|
|
82
|
+
], EmailLogOptions.prototype, "smtpIgnoreTLSError", void 0);
|
|
83
|
+
__decorate([
|
|
84
|
+
(0, decorators_1.NumberFieldOptional)({
|
|
85
|
+
fieldLabel: { zh: '速率限制最大邮件数', en: 'Rate Limit Max Emails' },
|
|
86
|
+
}),
|
|
87
|
+
__metadata("design:type", Number)
|
|
88
|
+
], EmailLogOptions.prototype, "rateLimitMaxEmails", void 0);
|
|
89
|
+
__decorate([
|
|
90
|
+
(0, decorators_1.NumberFieldOptional)({
|
|
91
|
+
fieldLabel: { zh: '速率限制时间窗口(毫秒)', en: 'Rate Limit Window MS' },
|
|
92
|
+
}),
|
|
93
|
+
__metadata("design:type", Number)
|
|
94
|
+
], EmailLogOptions.prototype, "rateLimitWindowMs", void 0);
|
|
95
|
+
__decorate([
|
|
96
|
+
(0, decorators_1.NumberFieldOptional)({
|
|
97
|
+
fieldLabel: { zh: '突发大小', en: 'Rate Limit Burst Size' },
|
|
98
|
+
}),
|
|
99
|
+
__metadata("design:type", Number)
|
|
100
|
+
], EmailLogOptions.prototype, "rateLimitBurstSize", void 0);
|
|
101
|
+
__decorate([
|
|
102
|
+
(0, decorators_1.BooleanFieldOptional)({
|
|
103
|
+
fieldLabel: { zh: 'HTML格式', en: 'Use HTML Format' },
|
|
104
|
+
}),
|
|
105
|
+
__metadata("design:type", Boolean)
|
|
106
|
+
], EmailLogOptions.prototype, "useHtmlFormat", void 0);
|
|
107
|
+
__decorate([
|
|
108
|
+
(0, decorators_1.StringFieldOptional)({
|
|
109
|
+
each: true,
|
|
110
|
+
fieldLabel: { zh: '包含应用', en: 'Include Apps' },
|
|
111
|
+
}),
|
|
112
|
+
__metadata("design:type", Array)
|
|
113
|
+
], EmailLogOptions.prototype, "includeApps", void 0);
|
|
114
|
+
__decorate([
|
|
115
|
+
(0, decorators_1.StringFieldOptional)({
|
|
116
|
+
each: true,
|
|
117
|
+
fieldLabel: { zh: '排除应用', en: 'Exclude Apps' },
|
|
118
|
+
}),
|
|
119
|
+
__metadata("design:type", Array)
|
|
120
|
+
], EmailLogOptions.prototype, "excludeApps", void 0);
|
|
121
|
+
__decorate([
|
|
122
|
+
(0, decorators_1.StringFieldOptional)({
|
|
123
|
+
each: true,
|
|
124
|
+
fieldLabel: { zh: '包含错误类型', en: 'Include Errors' },
|
|
125
|
+
}),
|
|
126
|
+
__metadata("design:type", Array)
|
|
127
|
+
], EmailLogOptions.prototype, "includeErrors", void 0);
|
|
128
|
+
__decorate([
|
|
129
|
+
(0, decorators_1.StringFieldOptional)({
|
|
130
|
+
each: true,
|
|
131
|
+
fieldLabel: { zh: '排除错误类型', en: 'Exclude Errors' },
|
|
132
|
+
}),
|
|
133
|
+
__metadata("design:type", Array)
|
|
134
|
+
], EmailLogOptions.prototype, "excludeErrors", void 0);
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { LogDescriptor } from 'pino';
|
|
2
|
+
/**
|
|
3
|
+
* Email log transport contract
|
|
4
|
+
* Defines the interface for Pino email transport
|
|
5
|
+
*/
|
|
6
|
+
export interface IEmailLogTransport {
|
|
7
|
+
/**
|
|
8
|
+
* Write log entry to email transport
|
|
9
|
+
* Implements Writable stream interface for Pino
|
|
10
|
+
*/
|
|
11
|
+
write(data: LogDescriptor): void;
|
|
12
|
+
/**
|
|
13
|
+
* Flush any pending emails
|
|
14
|
+
*/
|
|
15
|
+
flush?(): Promise<void>;
|
|
16
|
+
/**
|
|
17
|
+
* Check if transport is enabled for given log level
|
|
18
|
+
*/
|
|
19
|
+
shouldSend(level: string): boolean;
|
|
20
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./email-log-options.interface"), exports);
|
|
18
|
+
__exportStar(require("./email-log-transport.interface"), exports);
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
interface EmailLogProviderOptions {
|
|
2
|
+
smtpHost: string;
|
|
3
|
+
smtpPort?: number;
|
|
4
|
+
smtpUsername?: string;
|
|
5
|
+
smtpPassword?: string;
|
|
6
|
+
smtpSecure?: boolean;
|
|
7
|
+
smtpIgnoreTLSError?: boolean;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Email provider for log alerts
|
|
11
|
+
* Wraps nodemailer for SMTP email sending
|
|
12
|
+
*/
|
|
13
|
+
export declare class EmailLogProvider {
|
|
14
|
+
private readonly options;
|
|
15
|
+
private readonly logger;
|
|
16
|
+
private transporter;
|
|
17
|
+
constructor(options: EmailLogProviderOptions);
|
|
18
|
+
/**
|
|
19
|
+
* Initialize nodemailer transporter
|
|
20
|
+
*/
|
|
21
|
+
private initializeTransporter;
|
|
22
|
+
/**
|
|
23
|
+
* Verify SMTP connection (useful for health checks)
|
|
24
|
+
*/
|
|
25
|
+
verifyConnection(): Promise<boolean>;
|
|
26
|
+
/**
|
|
27
|
+
* Send log email
|
|
28
|
+
*/
|
|
29
|
+
sendLogEmail(params: {
|
|
30
|
+
to: string[];
|
|
31
|
+
cc?: string[];
|
|
32
|
+
from: string;
|
|
33
|
+
subject: string;
|
|
34
|
+
html?: string;
|
|
35
|
+
text?: string;
|
|
36
|
+
}): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Close the transporter connection
|
|
39
|
+
*/
|
|
40
|
+
close(): Promise<void>;
|
|
41
|
+
}
|
|
42
|
+
export {};
|
|
@@ -0,0 +1,127 @@
|
|
|
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 __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
12
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
13
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
14
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
15
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
16
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
17
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
18
|
+
});
|
|
19
|
+
};
|
|
20
|
+
var EmailLogProvider_1;
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.EmailLogProvider = void 0;
|
|
23
|
+
const common_1 = require("@nestjs/common");
|
|
24
|
+
const nodemailer = require("nodemailer");
|
|
25
|
+
/**
|
|
26
|
+
* Email provider for log alerts
|
|
27
|
+
* Wraps nodemailer for SMTP email sending
|
|
28
|
+
*/
|
|
29
|
+
let EmailLogProvider = EmailLogProvider_1 = class EmailLogProvider {
|
|
30
|
+
constructor(options) {
|
|
31
|
+
this.options = options;
|
|
32
|
+
this.logger = new common_1.Logger(EmailLogProvider_1.name);
|
|
33
|
+
this.transporter = null;
|
|
34
|
+
this.initializeTransporter();
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Initialize nodemailer transporter
|
|
38
|
+
*/
|
|
39
|
+
initializeTransporter() {
|
|
40
|
+
const config = {
|
|
41
|
+
host: this.options.smtpHost,
|
|
42
|
+
port: this.options.smtpPort || 587,
|
|
43
|
+
secure: this.options.smtpSecure || false,
|
|
44
|
+
tls: {
|
|
45
|
+
rejectUnauthorized: this.options.smtpIgnoreTLSError !== undefined
|
|
46
|
+
? !this.options.smtpIgnoreTLSError
|
|
47
|
+
: true,
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
if (this.options.smtpUsername || this.options.smtpPassword) {
|
|
51
|
+
config.auth = {
|
|
52
|
+
user: this.options.smtpUsername,
|
|
53
|
+
pass: this.options.smtpPassword,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
this.transporter = nodemailer.createTransport(config);
|
|
57
|
+
this.logger.log(`Email transporter initialized: ${this.options.smtpHost}:${this.options.smtpPort || 587}`);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Verify SMTP connection (useful for health checks)
|
|
61
|
+
*/
|
|
62
|
+
verifyConnection() {
|
|
63
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
64
|
+
if (!this.transporter) {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
try {
|
|
68
|
+
yield this.transporter.verify();
|
|
69
|
+
this.logger.debug('SMTP connection verified successfully');
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
this.logger.error(`SMTP connection verification failed: ${error.message}`);
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Send log email
|
|
80
|
+
*/
|
|
81
|
+
sendLogEmail(params) {
|
|
82
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
83
|
+
if (!this.transporter) {
|
|
84
|
+
throw new Error('Email transporter not initialized');
|
|
85
|
+
}
|
|
86
|
+
try {
|
|
87
|
+
const mailOptions = {
|
|
88
|
+
from: params.from,
|
|
89
|
+
to: params.to.join(', '),
|
|
90
|
+
subject: params.subject,
|
|
91
|
+
};
|
|
92
|
+
if (params.cc && params.cc.length > 0) {
|
|
93
|
+
mailOptions.cc = params.cc.join(', ');
|
|
94
|
+
}
|
|
95
|
+
if (params.html) {
|
|
96
|
+
mailOptions.html = params.html;
|
|
97
|
+
}
|
|
98
|
+
else if (params.text) {
|
|
99
|
+
mailOptions.text = params.text;
|
|
100
|
+
}
|
|
101
|
+
const info = yield this.transporter.sendMail(mailOptions);
|
|
102
|
+
this.logger.debug(`Log email sent to ${params.to.join(', ')} - Message ID: ${info.messageId}`);
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
this.logger.error(`Failed to send log email: ${error.message}`, error.stack);
|
|
106
|
+
throw error;
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Close the transporter connection
|
|
112
|
+
*/
|
|
113
|
+
close() {
|
|
114
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
115
|
+
if (this.transporter) {
|
|
116
|
+
this.transporter.close();
|
|
117
|
+
this.transporter = null;
|
|
118
|
+
this.logger.debug('Email transporter closed');
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
exports.EmailLogProvider = EmailLogProvider;
|
|
124
|
+
exports.EmailLogProvider = EmailLogProvider = EmailLogProvider_1 = __decorate([
|
|
125
|
+
(0, common_1.Injectable)(),
|
|
126
|
+
__metadata("design:paramtypes", [Object])
|
|
127
|
+
], EmailLogProvider);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './email-provider';
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./email-provider"), exports);
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { EmailLogOptions } from '../interfaces';
|
|
2
|
+
import { EmailLogRateLimiterService } from './email-log-rate-limiter.service';
|
|
3
|
+
import { EmailLogFormatterService } from './email-log-formatter.service';
|
|
4
|
+
/**
|
|
5
|
+
* Email log alert service
|
|
6
|
+
* Sends email notifications for critical log entries
|
|
7
|
+
*
|
|
8
|
+
* This service can be used directly to send email alerts
|
|
9
|
+
* without requiring Pino transport integration
|
|
10
|
+
*
|
|
11
|
+
* Note: Manual email alerts don't include HTTP context.
|
|
12
|
+
* For HTTP context, use Pino logger which automatically includes it via customProps.
|
|
13
|
+
*/
|
|
14
|
+
export declare class EmailLogAlertService {
|
|
15
|
+
private readonly options;
|
|
16
|
+
private readonly rateLimiter;
|
|
17
|
+
private readonly formatter;
|
|
18
|
+
private readonly logger;
|
|
19
|
+
private readonly appName;
|
|
20
|
+
private emailProvider;
|
|
21
|
+
constructor(options: EmailLogOptions, rateLimiter: EmailLogRateLimiterService, formatter: EmailLogFormatterService);
|
|
22
|
+
/**
|
|
23
|
+
* Send a log alert via email
|
|
24
|
+
* @param level Log level (error, fatal, etc.)
|
|
25
|
+
* @param message Log message
|
|
26
|
+
* @param error Optional error object
|
|
27
|
+
* @param context Optional additional context
|
|
28
|
+
*/
|
|
29
|
+
sendAlert(level: string, message: string, error?: Error, context?: Record<string, any>): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Send error alert
|
|
32
|
+
*/
|
|
33
|
+
error(message: string, error?: Error, context?: Record<string, any>): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Send fatal alert
|
|
36
|
+
*/
|
|
37
|
+
fatal(message: string, error?: Error, context?: Record<string, any>): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Format and send email
|
|
40
|
+
*/
|
|
41
|
+
private sendEmail;
|
|
42
|
+
/**
|
|
43
|
+
* Cleanup on module destroy
|
|
44
|
+
*/
|
|
45
|
+
onModuleDestroy(): Promise<void>;
|
|
46
|
+
}
|
|
@@ -0,0 +1,162 @@
|
|
|
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 EmailLogAlertService_1;
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
exports.EmailLogAlertService = void 0;
|
|
26
|
+
const common_1 = require("@nestjs/common");
|
|
27
|
+
const email_log_constants_1 = require("../email-log.constants");
|
|
28
|
+
const email_log_rate_limiter_service_1 = require("./email-log-rate-limiter.service");
|
|
29
|
+
const email_log_formatter_service_1 = require("./email-log-formatter.service");
|
|
30
|
+
const email_provider_1 = require("../providers/email-provider");
|
|
31
|
+
const log_level_helper_1 = require("../utils/log-level.helper");
|
|
32
|
+
/**
|
|
33
|
+
* Email log alert service
|
|
34
|
+
* Sends email notifications for critical log entries
|
|
35
|
+
*
|
|
36
|
+
* This service can be used directly to send email alerts
|
|
37
|
+
* without requiring Pino transport integration
|
|
38
|
+
*
|
|
39
|
+
* Note: Manual email alerts don't include HTTP context.
|
|
40
|
+
* For HTTP context, use Pino logger which automatically includes it via customProps.
|
|
41
|
+
*/
|
|
42
|
+
let EmailLogAlertService = EmailLogAlertService_1 = class EmailLogAlertService {
|
|
43
|
+
constructor(options, rateLimiter, formatter) {
|
|
44
|
+
this.options = options;
|
|
45
|
+
this.rateLimiter = rateLimiter;
|
|
46
|
+
this.formatter = formatter;
|
|
47
|
+
this.logger = new common_1.Logger(EmailLogAlertService_1.name);
|
|
48
|
+
this.appName = process.env.NAME || process.env.APP_NAME || 'omni-app';
|
|
49
|
+
this.emailProvider = new email_provider_1.EmailLogProvider({
|
|
50
|
+
smtpHost: options.smtpHost,
|
|
51
|
+
smtpPort: options.smtpPort || 587,
|
|
52
|
+
smtpUsername: options.smtpUsername,
|
|
53
|
+
smtpPassword: options.smtpPassword,
|
|
54
|
+
smtpSecure: options.smtpSecure || false,
|
|
55
|
+
smtpIgnoreTLSError: options.smtpIgnoreTLSError || false,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Send a log alert via email
|
|
60
|
+
* @param level Log level (error, fatal, etc.)
|
|
61
|
+
* @param message Log message
|
|
62
|
+
* @param error Optional error object
|
|
63
|
+
* @param context Optional additional context
|
|
64
|
+
*/
|
|
65
|
+
sendAlert(level, message, error, context) {
|
|
66
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
67
|
+
// Check if enabled
|
|
68
|
+
if (!this.options.enabled) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
// Check log level threshold
|
|
72
|
+
const levelValue = (0, log_level_helper_1.getLevelValue)(level);
|
|
73
|
+
const thresholdValue = (0, log_level_helper_1.getLevelValue)(this.options.level);
|
|
74
|
+
if (levelValue < thresholdValue) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
// Check rate limiting
|
|
78
|
+
const rateLimitKey = `email-log:${this.appName}:${level}`;
|
|
79
|
+
if (!this.rateLimiter.canSend(rateLimitKey)) {
|
|
80
|
+
this.logger.debug(`Rate limited email for log: ${message}`);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
// Create log entry
|
|
84
|
+
const logEntry = {
|
|
85
|
+
level,
|
|
86
|
+
message,
|
|
87
|
+
timestamp: Date.now(),
|
|
88
|
+
};
|
|
89
|
+
if (error) {
|
|
90
|
+
logEntry.error = error;
|
|
91
|
+
}
|
|
92
|
+
if (context) {
|
|
93
|
+
logEntry.context = context;
|
|
94
|
+
}
|
|
95
|
+
// Send email
|
|
96
|
+
yield this.sendEmail(logEntry);
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Send error alert
|
|
101
|
+
*/
|
|
102
|
+
error(message, error, context) {
|
|
103
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
104
|
+
return this.sendAlert('error', message, error, context);
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Send fatal alert
|
|
109
|
+
*/
|
|
110
|
+
fatal(message, error, context) {
|
|
111
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
112
|
+
return this.sendAlert('fatal', message, error, context);
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Format and send email
|
|
117
|
+
*/
|
|
118
|
+
sendEmail(logEntry) {
|
|
119
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
120
|
+
const subjectPrefix = this.options.subjectPrefix || '[Log Alert]';
|
|
121
|
+
// Convert log entry to Pino format for formatter
|
|
122
|
+
const pinoLog = Object.assign(Object.assign({ level: (0, log_level_helper_1.getLevelValue)(logEntry.level), time: logEntry.timestamp || Date.now(), msg: logEntry.message }, (logEntry.error
|
|
123
|
+
? {
|
|
124
|
+
err: {
|
|
125
|
+
type: logEntry.error.name,
|
|
126
|
+
message: logEntry.error.message,
|
|
127
|
+
stack: logEntry.error.stack,
|
|
128
|
+
},
|
|
129
|
+
}
|
|
130
|
+
: {})), (logEntry.context || {}));
|
|
131
|
+
const emailContent = this.options.useHtmlFormat
|
|
132
|
+
? this.formatter.formatHtml(pinoLog, this.appName, subjectPrefix)
|
|
133
|
+
: this.formatter.formatText(pinoLog, this.appName, subjectPrefix);
|
|
134
|
+
yield this.emailProvider.sendLogEmail({
|
|
135
|
+
to: this.options.to,
|
|
136
|
+
cc: this.options.cc,
|
|
137
|
+
from: this.options.from,
|
|
138
|
+
subject: emailContent.subject,
|
|
139
|
+
html: 'html' in emailContent ? emailContent.html : undefined,
|
|
140
|
+
text: 'text' in emailContent ? emailContent.text : undefined,
|
|
141
|
+
});
|
|
142
|
+
this.logger.debug(`Log email sent for ${this.appName}: ${logEntry.message}`);
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Cleanup on module destroy
|
|
147
|
+
*/
|
|
148
|
+
onModuleDestroy() {
|
|
149
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
150
|
+
yield this.emailProvider.close();
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
exports.EmailLogAlertService = EmailLogAlertService;
|
|
155
|
+
exports.EmailLogAlertService = EmailLogAlertService = EmailLogAlertService_1 = __decorate([
|
|
156
|
+
(0, common_1.Injectable)(),
|
|
157
|
+
__param(0, (0, common_1.Inject)(email_log_constants_1.EMAIL_LOG_OPTIONS)),
|
|
158
|
+
__param(1, (0, common_1.Inject)(email_log_constants_1.EMAIL_LOG_RATE_LIMITER)),
|
|
159
|
+
__param(2, (0, common_1.Inject)(email_log_constants_1.EMAIL_LOG_FORMATTER)),
|
|
160
|
+
__metadata("design:paramtypes", [Function, email_log_rate_limiter_service_1.EmailLogRateLimiterService,
|
|
161
|
+
email_log_formatter_service_1.EmailLogFormatterService])
|
|
162
|
+
], EmailLogAlertService);
|