@nest-omni/core 4.1.3-28 → 4.1.3-29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/audit/interceptors/audit-action.interceptor.d.ts +1 -0
  2. package/audit/interceptors/audit-action.interceptor.js +5 -3
  3. package/audit/services/audit-action.service.d.ts +1 -0
  4. package/audit/services/audit-action.service.js +5 -3
  5. package/audit/services/operation-description.service.d.ts +1 -0
  6. package/audit/services/operation-description.service.js +5 -3
  7. package/audit/services/transaction-audit.service.d.ts +1 -0
  8. package/audit/services/transaction-audit.service.js +6 -4
  9. package/common/helpers/validation-metadata-helper.d.ts +57 -0
  10. package/common/helpers/validation-metadata-helper.js +109 -5
  11. package/decorators/examples/field-i18n.example.d.ts +294 -0
  12. package/decorators/examples/field-i18n.example.js +478 -0
  13. package/decorators/field.decorators.d.ts +23 -0
  14. package/decorators/field.decorators.js +7 -2
  15. package/decorators/translate.decorator.d.ts +26 -0
  16. package/decorators/translate.decorator.js +26 -1
  17. package/filters/bad-request.filter.js +15 -9
  18. package/http-client/decorators/http-client.decorators.d.ts +1 -0
  19. package/http-client/decorators/http-client.decorators.js +47 -30
  20. package/http-client/http-client.module.d.ts +8 -0
  21. package/http-client/http-client.module.js +24 -24
  22. package/http-client/services/http-client.service.js +56 -11
  23. package/http-client/utils/context-extractor.util.d.ts +2 -0
  24. package/http-client/utils/context-extractor.util.js +15 -3
  25. package/interceptors/index.d.ts +0 -1
  26. package/interceptors/index.js +0 -1
  27. package/interceptors/translation-interceptor.service.d.ts +7 -0
  28. package/interceptors/translation-interceptor.service.js +40 -8
  29. package/package.json +1 -1
  30. package/setup/bootstrap.setup.js +1 -1
  31. package/shared/services/api-config.service.js +18 -3
  32. package/interceptors/http-logging-interceptor.service.d.ts +0 -34
  33. package/interceptors/http-logging-interceptor.service.js +0 -138
@@ -1,138 +0,0 @@
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 HttpLoggingInterceptor_1;
12
- Object.defineProperty(exports, "__esModule", { value: true });
13
- exports.HttpLoggingInterceptor = void 0;
14
- const common_1 = require("@nestjs/common");
15
- const api_config_service_1 = require("../shared/services/api-config.service");
16
- /**
17
- * HTTP 日志拦截器
18
- * 参考 Tomcat AccessLog 的实现,每个请求只记录一条日志
19
- * 只在 finish 事件中记录,因为异常过滤器会处理所有错误并返回响应
20
- */
21
- let HttpLoggingInterceptor = HttpLoggingInterceptor_1 = class HttpLoggingInterceptor {
22
- constructor(configService) {
23
- this.configService = configService;
24
- this.logger = new common_1.Logger(HttpLoggingInterceptor_1.name);
25
- }
26
- intercept(context, next) {
27
- const ctx = context.switchToHttp();
28
- const request = ctx.getRequest();
29
- const response = ctx.getResponse();
30
- const startTime = Date.now();
31
- // 只在 finish 事件中记录日志(此时响应已完成,状态码已确定)
32
- response.on('finish', () => {
33
- const duration = Date.now() - startTime;
34
- const requestId = String(request.id ||
35
- request.headers['x-request-id'] ||
36
- this.generateRequestId());
37
- this.logRequest(requestId, request, response, duration);
38
- });
39
- return next.handle();
40
- }
41
- /**
42
- * 生成请求 ID
43
- */
44
- generateRequestId() {
45
- return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
46
- }
47
- /**
48
- * 记录请求和响应(一条日志)
49
- */
50
- logRequest(requestId, request, response, duration) {
51
- const statusCode = response.statusCode;
52
- // 从 request 对象中读取异常信息(由 HttpExceptionFilter 存储)
53
- const exception = request._exception;
54
- // 将异常信息放在 message 中,这样一定会被输出
55
- let errorMessage = '';
56
- if (exception) {
57
- errorMessage = `\n Error: ${exception.message}\n Stack: ${exception.stack}`;
58
- }
59
- const logData = Object.assign(Object.assign({ requestId, timestamp: new Date().toISOString(), env: this.configService.nodeEnv, appName: this.configService.getString('NAME'), httpMethod: request.method, httpUrl: request.url, query: request.query, statusCode, duration: `${duration}ms`, requestHeaders: this.sanitizeHeaders(request.headers), requestBody: this.sanitizeBody(request.body), responseHeaders: this.sanitizeHeaders(response.getHeaders()) }, (exception && {
60
- errorMessage: exception.message,
61
- errorStack: exception.stack,
62
- errorCode: exception.code,
63
- originalStatusCode: exception.statusCode,
64
- })), { user: this.extractUser(request.headers) });
65
- const message = `HTTP ${request.method} ${request.url} ${statusCode} (${duration}ms)${errorMessage}`;
66
- // 根据是否有异常来决定日志级别
67
- if ((exception === null || exception === void 0 ? void 0 : exception.statusCode) >= 500) {
68
- this.logger.error(message, logData);
69
- }
70
- else if ((exception === null || exception === void 0 ? void 0 : exception.statusCode) >= 400) {
71
- this.logger.warn(message, logData);
72
- }
73
- else if (statusCode >= 500) {
74
- this.logger.error(message, logData);
75
- }
76
- else if (statusCode >= 400) {
77
- this.logger.warn(message, logData);
78
- }
79
- else {
80
- this.logger.log(message, logData);
81
- }
82
- }
83
- /**
84
- * 清理敏感的 header 信息
85
- */
86
- sanitizeHeaders(headers) {
87
- if (!headers)
88
- return {};
89
- const sanitized = Object.assign({}, headers);
90
- const sensitiveKeys = [
91
- 'authorization',
92
- 'apikey',
93
- 'x-api-key',
94
- 'token',
95
- 'cookie',
96
- ];
97
- for (const key of Object.keys(sanitized)) {
98
- if (sensitiveKeys.includes(key.toLowerCase())) {
99
- sanitized[key] = '[REDACTED]';
100
- }
101
- }
102
- return sanitized;
103
- }
104
- /**
105
- * 清理敏感的 body 信息
106
- */
107
- sanitizeBody(body) {
108
- if (!body)
109
- return body;
110
- const bodyStr = JSON.stringify(body);
111
- if (bodyStr.length > 1000) {
112
- return { _large: `${bodyStr.length} bytes` };
113
- }
114
- return body;
115
- }
116
- /**
117
- * 从 headers 提取用户信息
118
- */
119
- extractUser(headers) {
120
- const userHeader = headers['user'] || headers['x-user'];
121
- if (userHeader) {
122
- try {
123
- return typeof userHeader === 'string'
124
- ? JSON.parse(userHeader)
125
- : userHeader;
126
- }
127
- catch (_a) {
128
- return userHeader;
129
- }
130
- }
131
- return null;
132
- }
133
- };
134
- exports.HttpLoggingInterceptor = HttpLoggingInterceptor;
135
- exports.HttpLoggingInterceptor = HttpLoggingInterceptor = HttpLoggingInterceptor_1 = __decorate([
136
- (0, common_1.Injectable)(),
137
- __metadata("design:paramtypes", [api_config_service_1.ApiConfigService])
138
- ], HttpLoggingInterceptor);