@nest-omni/core 4.1.3-27 → 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 (32) 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/http-client/decorators/http-client.decorators.d.ts +1 -0
  18. package/http-client/decorators/http-client.decorators.js +47 -30
  19. package/http-client/http-client.module.d.ts +8 -0
  20. package/http-client/http-client.module.js +24 -24
  21. package/http-client/services/http-client.service.js +56 -11
  22. package/http-client/utils/context-extractor.util.d.ts +2 -0
  23. package/http-client/utils/context-extractor.util.js +15 -3
  24. package/interceptors/index.d.ts +0 -1
  25. package/interceptors/index.js +0 -1
  26. package/interceptors/translation-interceptor.service.d.ts +7 -0
  27. package/interceptors/translation-interceptor.service.js +40 -8
  28. package/package.json +1 -1
  29. package/setup/bootstrap.setup.js +1 -1
  30. package/shared/services/api-config.service.js +18 -3
  31. package/interceptors/http-logging-interceptor.service.d.ts +0 -38
  32. package/interceptors/http-logging-interceptor.service.js +0 -167
@@ -1,167 +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 operators_1 = require("rxjs/operators");
16
- const api_config_service_1 = require("../shared/services/api-config.service");
17
- /**
18
- * HTTP 日志拦截器
19
- * 参考 Tomcat AccessLog 的实现,每个请求只记录一条日志
20
- * 在请求完成时同时记录请求和响应的完整信息
21
- */
22
- let HttpLoggingInterceptor = HttpLoggingInterceptor_1 = class HttpLoggingInterceptor {
23
- constructor(configService) {
24
- this.configService = configService;
25
- this.logger = new common_1.Logger(HttpLoggingInterceptor_1.name);
26
- }
27
- intercept(context, next) {
28
- const ctx = context.switchToHttp();
29
- const request = ctx.getRequest();
30
- const response = ctx.getResponse();
31
- const startTime = Date.now();
32
- const { method, url, headers, body } = request;
33
- const requestId = String(request.id || headers['x-request-id'] || this.generateRequestId());
34
- // 监听响应完成事件,一条日志同时记录请求和响应
35
- response.on('finish', () => {
36
- const duration = Date.now() - startTime;
37
- this.logRequestResponse(requestId, request, response, duration);
38
- });
39
- return next.handle().pipe((0, operators_1.catchError)((error) => {
40
- const duration = Date.now() - startTime;
41
- this.logRequestError(requestId, request, error, duration);
42
- throw error;
43
- }));
44
- }
45
- /**
46
- * 生成请求 ID
47
- */
48
- generateRequestId() {
49
- return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
50
- }
51
- /**
52
- * 记录请求和响应(一条日志)
53
- */
54
- logRequestResponse(requestId, request, response, duration) {
55
- const statusCode = response.statusCode;
56
- const logData = {
57
- requestId,
58
- timestamp: new Date().toISOString(),
59
- env: this.configService.nodeEnv,
60
- appName: this.configService.getString('NAME'),
61
- http: {
62
- method: request.method,
63
- url: request.url,
64
- query: request.query,
65
- statusCode,
66
- duration: `${duration}ms`,
67
- req: {
68
- headers: this.sanitizeHeaders(request.headers),
69
- body: this.sanitizeBody(request.body),
70
- },
71
- res: {
72
- headers: this.sanitizeHeaders(response.getHeaders()),
73
- },
74
- },
75
- user: this.extractUser(request.headers),
76
- };
77
- const message = `HTTP ${request.method} ${request.url} ${statusCode} (${duration}ms)`;
78
- if (statusCode >= 500) {
79
- this.logger.error(message, logData);
80
- }
81
- else if (statusCode >= 400) {
82
- this.logger.warn(message, logData);
83
- }
84
- else {
85
- this.logger.log(message, logData);
86
- }
87
- }
88
- /**
89
- * 记录请求和错误(一条日志)
90
- */
91
- logRequestError(requestId, request, error, duration) {
92
- const logData = {
93
- requestId,
94
- timestamp: new Date().toISOString(),
95
- env: this.configService.nodeEnv,
96
- appName: this.configService.getString('NAME'),
97
- http: {
98
- method: request.method,
99
- url: request.url,
100
- query: request.query,
101
- statusCode: (error === null || error === void 0 ? void 0 : error.status) || 500,
102
- duration: `${duration}ms`,
103
- req: {
104
- headers: this.sanitizeHeaders(request.headers),
105
- body: this.sanitizeBody(request.body),
106
- },
107
- },
108
- error: {
109
- message: error.message,
110
- stack: error.stack,
111
- code: error.code,
112
- },
113
- user: this.extractUser(request.headers),
114
- };
115
- this.logger.error(`HTTP ${request.method} ${request.url} ${(error === null || error === void 0 ? void 0 : error.status) || 500} (${duration}ms) - ${error.message}`, logData);
116
- }
117
- /**
118
- * 清理敏感的 header 信息
119
- */
120
- sanitizeHeaders(headers) {
121
- if (!headers)
122
- return {};
123
- const sanitized = Object.assign({}, headers);
124
- const sensitiveKeys = ['authorization', 'apikey', 'x-api-key', 'token', 'cookie'];
125
- for (const key of Object.keys(sanitized)) {
126
- if (sensitiveKeys.includes(key.toLowerCase())) {
127
- sanitized[key] = '[REDACTED]';
128
- }
129
- }
130
- return sanitized;
131
- }
132
- /**
133
- * 清理敏感的 body 信息
134
- */
135
- sanitizeBody(body) {
136
- if (!body)
137
- return body;
138
- // 如果 body 太大,只记录部分信息
139
- const bodyStr = JSON.stringify(body);
140
- if (bodyStr.length > 1000) {
141
- return { _large: `${bodyStr.length} bytes` };
142
- }
143
- return body;
144
- }
145
- /**
146
- * 从 headers 提取用户信息
147
- */
148
- extractUser(headers) {
149
- const userHeader = headers['user'] || headers['x-user'];
150
- if (userHeader) {
151
- try {
152
- return typeof userHeader === 'string'
153
- ? JSON.parse(userHeader)
154
- : userHeader;
155
- }
156
- catch (_a) {
157
- return userHeader;
158
- }
159
- }
160
- return null;
161
- }
162
- };
163
- exports.HttpLoggingInterceptor = HttpLoggingInterceptor;
164
- exports.HttpLoggingInterceptor = HttpLoggingInterceptor = HttpLoggingInterceptor_1 = __decorate([
165
- (0, common_1.Injectable)(),
166
- __metadata("design:paramtypes", [api_config_service_1.ApiConfigService])
167
- ], HttpLoggingInterceptor);