@lark-apaas/fullstack-nestjs-core 1.1.5 → 1.1.6-alpha.0
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/README.md +165 -0
- package/dist/index.cjs +407 -32
- package/dist/index.d.cts +21 -2
- package/dist/index.d.ts +21 -2
- package/dist/index.js +399 -26
- package/package.json +7 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import { NestModule, DynamicModule, MiddlewareConsumer, NestMiddleware } from '@nestjs/common';
|
|
2
|
+
import { HttpClientConfig, PlatformPluginOptions } from '@lark-apaas/http-client';
|
|
2
3
|
import { NestExpressApplication } from '@nestjs/platform-express';
|
|
3
4
|
export { DevToolsModule, DevToolsOptions, DevToolsV2Module, DevToolsV2Options } from '@lark-apaas/nestjs-openapi-devtools';
|
|
4
5
|
import { Request, Response, NextFunction } from 'express';
|
|
6
|
+
import { PlatformHttpClient } from '@lark-apaas/nestjs-common';
|
|
5
7
|
export * from '@lark-apaas/nestjs-authnpaas';
|
|
6
8
|
export * from '@lark-apaas/nestjs-datapaas';
|
|
9
|
+
export * from '@lark-apaas/nestjs-observable';
|
|
10
|
+
export * from '@lark-apaas/nestjs-trigger';
|
|
7
11
|
|
|
8
12
|
declare global {
|
|
9
13
|
namespace Express {
|
|
@@ -33,6 +37,13 @@ declare global {
|
|
|
33
37
|
/**
|
|
34
38
|
* PlatformModule 配置选项
|
|
35
39
|
*/
|
|
40
|
+
|
|
41
|
+
interface PlatformHttpClientOptions {
|
|
42
|
+
/** HttpClient 基础配置(超时、headers 等) */
|
|
43
|
+
config?: Omit<HttpClientConfig, 'platform'>;
|
|
44
|
+
/** 平台插件配置(默认启用) */
|
|
45
|
+
platform?: PlatformPluginOptions;
|
|
46
|
+
}
|
|
36
47
|
interface PlatformModuleOptions {
|
|
37
48
|
/**
|
|
38
49
|
* 是否启用 CSRF 保护
|
|
@@ -44,6 +55,10 @@ interface PlatformModuleOptions {
|
|
|
44
55
|
* 默认: '/api/*'
|
|
45
56
|
*/
|
|
46
57
|
csrfRoutes?: string | string[];
|
|
58
|
+
/**
|
|
59
|
+
* 平台 HttpClient 配置
|
|
60
|
+
*/
|
|
61
|
+
httpClient?: PlatformHttpClientOptions;
|
|
47
62
|
}
|
|
48
63
|
|
|
49
64
|
declare class PlatformModule implements NestModule {
|
|
@@ -94,7 +109,11 @@ declare class UserContextMiddleware implements NestMiddleware {
|
|
|
94
109
|
}
|
|
95
110
|
|
|
96
111
|
declare class ViewContextMiddleware implements NestMiddleware {
|
|
97
|
-
|
|
112
|
+
private readonly client;
|
|
113
|
+
private readonly logger;
|
|
114
|
+
constructor(client: PlatformHttpClient);
|
|
115
|
+
private getAppInfo;
|
|
116
|
+
use(req: Request, res: Response, next: NextFunction): Promise<void>;
|
|
98
117
|
}
|
|
99
118
|
|
|
100
119
|
/**
|
|
@@ -108,4 +127,4 @@ interface ApiNotFoundResponse {
|
|
|
108
127
|
timestamp: string;
|
|
109
128
|
}
|
|
110
129
|
|
|
111
|
-
export { type ApiNotFoundResponse, CsrfMiddleware, CsrfTokenMiddleware, PlatformModule, type PlatformModuleOptions, UserContextMiddleware, ViewContextMiddleware, configureApp };
|
|
130
|
+
export { type ApiNotFoundResponse, CsrfMiddleware, CsrfTokenMiddleware, type PlatformHttpClientOptions, PlatformModule, type PlatformModuleOptions, UserContextMiddleware, ViewContextMiddleware, configureApp };
|
package/dist/index.js
CHANGED
|
@@ -4,10 +4,15 @@ var __name = (target, value) => __defProp(target, "name", { value, configurable:
|
|
|
4
4
|
// src/modules/platform/module.ts
|
|
5
5
|
import { Global, Module, ValidationPipe } from "@nestjs/common";
|
|
6
6
|
import { APP_PIPE } from "@nestjs/core";
|
|
7
|
+
import { CommonModule, OBSERVABLE_SERVICE } from "@lark-apaas/nestjs-common";
|
|
7
8
|
import { ConfigModule, ConfigService } from "@nestjs/config";
|
|
8
|
-
import {
|
|
9
|
+
import { NestjsObservableModule as ObservableModule, Observable } from "@lark-apaas/nestjs-observable";
|
|
10
|
+
import { HttpModule } from "@nestjs/axios";
|
|
11
|
+
import { LoggerModule, AppLogger as AppLogger2, LoggerContextMiddleware } from "@lark-apaas/nestjs-logger";
|
|
9
12
|
import { DataPaasModule, SqlExecutionContextMiddleware } from "@lark-apaas/nestjs-datapaas";
|
|
10
13
|
import { AuthNPaasModule } from "@lark-apaas/nestjs-authnpaas";
|
|
14
|
+
import { AutomationModule } from "@lark-apaas/nestjs-trigger";
|
|
15
|
+
import { PLATFORM_HTTP_CLIENT as PLATFORM_HTTP_CLIENT2 } from "@lark-apaas/nestjs-common";
|
|
11
16
|
|
|
12
17
|
// src/middlewares/user-context/index.ts
|
|
13
18
|
import { Injectable } from "@nestjs/common";
|
|
@@ -120,7 +125,8 @@ CsrfMiddleware = _ts_decorate2([
|
|
|
120
125
|
], CsrfMiddleware);
|
|
121
126
|
|
|
122
127
|
// src/middlewares/view-context/index.ts
|
|
123
|
-
import { Injectable as Injectable3 } from "@nestjs/common";
|
|
128
|
+
import { Inject, Injectable as Injectable3, Logger } from "@nestjs/common";
|
|
129
|
+
import { PLATFORM_HTTP_CLIENT } from "@lark-apaas/nestjs-common";
|
|
124
130
|
function _ts_decorate3(decorators, target, key, desc) {
|
|
125
131
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
126
132
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
@@ -128,13 +134,50 @@ function _ts_decorate3(decorators, target, key, desc) {
|
|
|
128
134
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
129
135
|
}
|
|
130
136
|
__name(_ts_decorate3, "_ts_decorate");
|
|
131
|
-
|
|
137
|
+
function _ts_metadata(k, v) {
|
|
138
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
139
|
+
}
|
|
140
|
+
__name(_ts_metadata, "_ts_metadata");
|
|
141
|
+
function _ts_param(paramIndex, decorator) {
|
|
142
|
+
return function(target, key) {
|
|
143
|
+
decorator(target, key, paramIndex);
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
__name(_ts_param, "_ts_param");
|
|
147
|
+
var ViewContextMiddleware = class _ViewContextMiddleware {
|
|
132
148
|
static {
|
|
133
149
|
__name(this, "ViewContextMiddleware");
|
|
134
150
|
}
|
|
135
|
-
|
|
151
|
+
client;
|
|
152
|
+
logger = new Logger(_ViewContextMiddleware.name);
|
|
153
|
+
constructor(client) {
|
|
154
|
+
this.client = client;
|
|
155
|
+
}
|
|
156
|
+
async getAppInfo(appId) {
|
|
157
|
+
if (!appId) {
|
|
158
|
+
this.logger.warn(`appId is empty, skip get app info`);
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
try {
|
|
162
|
+
const resp = await this.client.get(`b/${appId}/get_published_v2`);
|
|
163
|
+
if (resp.status !== 200) {
|
|
164
|
+
throw new Error(`Failed to get app info, status: ${resp.status}`);
|
|
165
|
+
}
|
|
166
|
+
const data = await resp.json();
|
|
167
|
+
if (data.status_code !== "0") {
|
|
168
|
+
throw new Error(`Failed to get app info, status_code: ${data.status_code}`);
|
|
169
|
+
}
|
|
170
|
+
return data.data.app_info ?? {};
|
|
171
|
+
} catch (err) {
|
|
172
|
+
this.logger.error(err, "Failed to get app info");
|
|
173
|
+
return null;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
async use(req, res, next) {
|
|
136
177
|
const { userId, tenantId, appId } = req.userContext;
|
|
137
178
|
const csrfToken = req.csrfToken;
|
|
179
|
+
const appInfo = await this.getAppInfo(appId);
|
|
180
|
+
this.logger.debug(`appInfo: ${JSON.stringify(appInfo)}`);
|
|
138
181
|
req.__platform_data__ = {
|
|
139
182
|
csrfToken: csrfToken ?? "",
|
|
140
183
|
userId: userId ?? "",
|
|
@@ -152,7 +195,12 @@ var ViewContextMiddleware = class {
|
|
|
152
195
|
}
|
|
153
196
|
};
|
|
154
197
|
ViewContextMiddleware = _ts_decorate3([
|
|
155
|
-
Injectable3()
|
|
198
|
+
Injectable3(),
|
|
199
|
+
_ts_param(0, Inject(PLATFORM_HTTP_CLIENT)),
|
|
200
|
+
_ts_metadata("design:type", Function),
|
|
201
|
+
_ts_metadata("design:paramtypes", [
|
|
202
|
+
typeof PlatformHttpClient === "undefined" ? Object : PlatformHttpClient
|
|
203
|
+
])
|
|
156
204
|
], ViewContextMiddleware);
|
|
157
205
|
|
|
158
206
|
// src/middlewares/csrf_token/index.ts
|
|
@@ -252,6 +300,128 @@ function apiResponseInterceptor(req, res, next) {
|
|
|
252
300
|
}
|
|
253
301
|
__name(apiResponseInterceptor, "apiResponseInterceptor");
|
|
254
302
|
|
|
303
|
+
// src/middlewares/request-context/index.ts
|
|
304
|
+
import { Injectable as Injectable5 } from "@nestjs/common";
|
|
305
|
+
import { RequestContextService } from "@lark-apaas/nestjs-common";
|
|
306
|
+
function _ts_decorate5(decorators, target, key, desc) {
|
|
307
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
308
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
309
|
+
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;
|
|
310
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
311
|
+
}
|
|
312
|
+
__name(_ts_decorate5, "_ts_decorate");
|
|
313
|
+
function _ts_metadata2(k, v) {
|
|
314
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
315
|
+
}
|
|
316
|
+
__name(_ts_metadata2, "_ts_metadata");
|
|
317
|
+
var RequestContextMiddleware = class {
|
|
318
|
+
static {
|
|
319
|
+
__name(this, "RequestContextMiddleware");
|
|
320
|
+
}
|
|
321
|
+
requestContext;
|
|
322
|
+
constructor(requestContext) {
|
|
323
|
+
this.requestContext = requestContext;
|
|
324
|
+
}
|
|
325
|
+
use(req, _res, next) {
|
|
326
|
+
const path = req.originalUrl ?? req.url;
|
|
327
|
+
const userContext = req.userContext ?? {};
|
|
328
|
+
this.requestContext.run({
|
|
329
|
+
path,
|
|
330
|
+
method: req.method,
|
|
331
|
+
userId: userContext.userId,
|
|
332
|
+
tenantId: userContext.tenantId,
|
|
333
|
+
appId: userContext.appId
|
|
334
|
+
}, () => next());
|
|
335
|
+
}
|
|
336
|
+
};
|
|
337
|
+
RequestContextMiddleware = _ts_decorate5([
|
|
338
|
+
Injectable5(),
|
|
339
|
+
_ts_metadata2("design:type", Function),
|
|
340
|
+
_ts_metadata2("design:paramtypes", [
|
|
341
|
+
typeof RequestContextService === "undefined" ? Object : RequestContextService
|
|
342
|
+
])
|
|
343
|
+
], RequestContextMiddleware);
|
|
344
|
+
|
|
345
|
+
// src/services/http-interceptor.service.ts
|
|
346
|
+
import { Injectable as Injectable6 } from "@nestjs/common";
|
|
347
|
+
import { HttpService } from "@nestjs/axios";
|
|
348
|
+
import { AppLogger } from "@lark-apaas/nestjs-logger";
|
|
349
|
+
function _ts_decorate6(decorators, target, key, desc) {
|
|
350
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
351
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
352
|
+
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;
|
|
353
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
354
|
+
}
|
|
355
|
+
__name(_ts_decorate6, "_ts_decorate");
|
|
356
|
+
function _ts_metadata3(k, v) {
|
|
357
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
358
|
+
}
|
|
359
|
+
__name(_ts_metadata3, "_ts_metadata");
|
|
360
|
+
var HttpInterceptorService = class {
|
|
361
|
+
static {
|
|
362
|
+
__name(this, "HttpInterceptorService");
|
|
363
|
+
}
|
|
364
|
+
httpService;
|
|
365
|
+
logger;
|
|
366
|
+
constructor(httpService, logger) {
|
|
367
|
+
this.httpService = httpService;
|
|
368
|
+
this.logger = logger;
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* 模块初始化时配置拦截器
|
|
372
|
+
*/
|
|
373
|
+
onModuleInit() {
|
|
374
|
+
this.setupInterceptors();
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* 配置 axios 请求/响应拦截器
|
|
378
|
+
*/
|
|
379
|
+
setupInterceptors() {
|
|
380
|
+
const axiosInstance = this.httpService.axiosRef;
|
|
381
|
+
axiosInstance.interceptors.request.use((config) => {
|
|
382
|
+
this.logger.log("HTTP Request", {
|
|
383
|
+
method: config.method?.toUpperCase(),
|
|
384
|
+
url: config.url,
|
|
385
|
+
headers: config.headers,
|
|
386
|
+
params: config.params,
|
|
387
|
+
data: config.data
|
|
388
|
+
}, "HttpService");
|
|
389
|
+
return config;
|
|
390
|
+
}, (error) => {
|
|
391
|
+
this.logger.error("HTTP Request Error", error, "HttpService");
|
|
392
|
+
return Promise.reject(error);
|
|
393
|
+
});
|
|
394
|
+
axiosInstance.interceptors.response.use((response) => {
|
|
395
|
+
this.logger.log("HTTP Response", {
|
|
396
|
+
method: response.config.method?.toUpperCase(),
|
|
397
|
+
url: response.config.url,
|
|
398
|
+
status: response.status,
|
|
399
|
+
statusText: response.statusText,
|
|
400
|
+
data: response.data
|
|
401
|
+
}, "HttpService");
|
|
402
|
+
return response;
|
|
403
|
+
}, (error) => {
|
|
404
|
+
this.logger.error("HTTP Response Error", {
|
|
405
|
+
method: error.config?.method?.toUpperCase(),
|
|
406
|
+
url: error.config?.url,
|
|
407
|
+
status: error.response?.status,
|
|
408
|
+
statusText: error.response?.statusText,
|
|
409
|
+
data: error.response?.data,
|
|
410
|
+
message: error.message
|
|
411
|
+
}, "HttpService");
|
|
412
|
+
return Promise.reject(error);
|
|
413
|
+
});
|
|
414
|
+
}
|
|
415
|
+
};
|
|
416
|
+
HttpInterceptorService = _ts_decorate6([
|
|
417
|
+
Injectable6(),
|
|
418
|
+
_ts_metadata3("design:type", Function),
|
|
419
|
+
_ts_metadata3("design:paramtypes", [
|
|
420
|
+
typeof HttpService === "undefined" ? Object : HttpService,
|
|
421
|
+
typeof AppLogger === "undefined" ? Object : AppLogger
|
|
422
|
+
])
|
|
423
|
+
], HttpInterceptorService);
|
|
424
|
+
|
|
255
425
|
// src/modules/platform/config/app.config.ts
|
|
256
426
|
import { registerAs } from "@nestjs/config";
|
|
257
427
|
var NAMESPACE = "app";
|
|
@@ -265,19 +435,19 @@ var app_config_default = registerAs(NAMESPACE, () => {
|
|
|
265
435
|
});
|
|
266
436
|
|
|
267
437
|
// src/middlewares/debug/index.ts
|
|
268
|
-
import { Injectable as
|
|
438
|
+
import { Injectable as Injectable7 } from "@nestjs/common";
|
|
269
439
|
import { HttpAdapterHost } from "@nestjs/core";
|
|
270
|
-
function
|
|
440
|
+
function _ts_decorate7(decorators, target, key, desc) {
|
|
271
441
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
272
442
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
273
443
|
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;
|
|
274
444
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
275
445
|
}
|
|
276
|
-
__name(
|
|
277
|
-
function
|
|
446
|
+
__name(_ts_decorate7, "_ts_decorate");
|
|
447
|
+
function _ts_metadata4(k, v) {
|
|
278
448
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
279
449
|
}
|
|
280
|
-
__name(
|
|
450
|
+
__name(_ts_metadata4, "_ts_metadata");
|
|
281
451
|
var processStartTimestamp = Date.now();
|
|
282
452
|
var FrameworkDebugMiddleware = class {
|
|
283
453
|
static {
|
|
@@ -325,23 +495,201 @@ var FrameworkDebugMiddleware = class {
|
|
|
325
495
|
};
|
|
326
496
|
}
|
|
327
497
|
};
|
|
328
|
-
FrameworkDebugMiddleware =
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
498
|
+
FrameworkDebugMiddleware = _ts_decorate7([
|
|
499
|
+
Injectable7(),
|
|
500
|
+
_ts_metadata4("design:type", Function),
|
|
501
|
+
_ts_metadata4("design:paramtypes", [
|
|
332
502
|
typeof HttpAdapterHost === "undefined" ? Object : HttpAdapterHost
|
|
333
503
|
])
|
|
334
504
|
], FrameworkDebugMiddleware);
|
|
335
505
|
|
|
506
|
+
// src/services/platform-http-client.service.ts
|
|
507
|
+
import { Injectable as Injectable8, Logger as Logger2 } from "@nestjs/common";
|
|
508
|
+
import { HttpClient } from "@lark-apaas/http-client";
|
|
509
|
+
function _ts_decorate8(decorators, target, key, desc) {
|
|
510
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
511
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
512
|
+
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;
|
|
513
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
514
|
+
}
|
|
515
|
+
__name(_ts_decorate8, "_ts_decorate");
|
|
516
|
+
function _ts_metadata5(k, v) {
|
|
517
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
518
|
+
}
|
|
519
|
+
__name(_ts_metadata5, "_ts_metadata");
|
|
520
|
+
var ProtectedHttpClient = class ProtectedHttpClient2 {
|
|
521
|
+
static {
|
|
522
|
+
__name(this, "ProtectedHttpClient");
|
|
523
|
+
}
|
|
524
|
+
client;
|
|
525
|
+
constructor(client) {
|
|
526
|
+
this.client = client;
|
|
527
|
+
}
|
|
528
|
+
request(config) {
|
|
529
|
+
return this.client.request(config);
|
|
530
|
+
}
|
|
531
|
+
get(url, config) {
|
|
532
|
+
return this.client.get(url, config);
|
|
533
|
+
}
|
|
534
|
+
post(url, data, config) {
|
|
535
|
+
return this.client.post(url, data, config);
|
|
536
|
+
}
|
|
537
|
+
put(url, data, config) {
|
|
538
|
+
return this.client.put(url, data, config);
|
|
539
|
+
}
|
|
540
|
+
patch(url, data, config) {
|
|
541
|
+
return this.client.patch(url, data, config);
|
|
542
|
+
}
|
|
543
|
+
delete(url, config) {
|
|
544
|
+
return this.client.delete(url, config);
|
|
545
|
+
}
|
|
546
|
+
};
|
|
547
|
+
var PlatformHttpClientService = class _PlatformHttpClientService {
|
|
548
|
+
static {
|
|
549
|
+
__name(this, "PlatformHttpClientService");
|
|
550
|
+
}
|
|
551
|
+
client;
|
|
552
|
+
protectedClient;
|
|
553
|
+
logger = new Logger2(_PlatformHttpClientService.name);
|
|
554
|
+
constructor() {
|
|
555
|
+
const baseConfig = {
|
|
556
|
+
timeout: 5e3
|
|
557
|
+
};
|
|
558
|
+
this.client = new HttpClient({
|
|
559
|
+
...baseConfig,
|
|
560
|
+
platform: {
|
|
561
|
+
enabled: true
|
|
562
|
+
}
|
|
563
|
+
});
|
|
564
|
+
this.protectedClient = new ProtectedHttpClient(this.client);
|
|
565
|
+
this.registerGlobalInterceptors();
|
|
566
|
+
}
|
|
567
|
+
/**
|
|
568
|
+
* 获取受保护的 HttpClient 实例(推荐)
|
|
569
|
+
*
|
|
570
|
+
* 该实例不暴露 interceptors,防止业务代码修改全局拦截器
|
|
571
|
+
*
|
|
572
|
+
* @returns 受保护的 HttpClient 实例
|
|
573
|
+
*/
|
|
574
|
+
get instance() {
|
|
575
|
+
return this.protectedClient;
|
|
576
|
+
}
|
|
577
|
+
/**
|
|
578
|
+
* 获取原始 HttpClient 实例(危险)
|
|
579
|
+
*
|
|
580
|
+
* ⚠️ 警告:该实例允许修改拦截器,会影响所有使用全局实例的地方
|
|
581
|
+
*
|
|
582
|
+
* 仅用于特殊场景,不应该暴露给业务代码
|
|
583
|
+
* 如果需要自定义拦截器,请使用 `create()` 方法创建独立实例
|
|
584
|
+
*
|
|
585
|
+
* @internal
|
|
586
|
+
* @returns 原始 HttpClient 实例
|
|
587
|
+
*/
|
|
588
|
+
get rawInstance() {
|
|
589
|
+
return this.client;
|
|
590
|
+
}
|
|
591
|
+
/**
|
|
592
|
+
* 创建一个新的独立 HttpClient 实例
|
|
593
|
+
*
|
|
594
|
+
* 适用于需要自定义拦截器或配置的场景
|
|
595
|
+
* 创建的实例完全独立,不会影响全局实例
|
|
596
|
+
*
|
|
597
|
+
* @param options - 配置选项(会与全局配置合并)
|
|
598
|
+
* @returns 完整的 HttpClient 实例(允许修改拦截器)
|
|
599
|
+
*
|
|
600
|
+
* @example
|
|
601
|
+
* ```typescript
|
|
602
|
+
* @Injectable()
|
|
603
|
+
* export class FileService {
|
|
604
|
+
* private fileClient: HttpClient;
|
|
605
|
+
*
|
|
606
|
+
* constructor(private platformHttp: PlatformHttpClientService) {
|
|
607
|
+
* // 创建超时 60 秒的独立实例
|
|
608
|
+
* this.fileClient = this.platformHttp.create({
|
|
609
|
+
* config: { timeout: 60000 }
|
|
610
|
+
* });
|
|
611
|
+
*
|
|
612
|
+
* // 为这个实例注册拦截器(不影响全局实例)
|
|
613
|
+
* this.fileClient.interceptors.request.use((config) => {
|
|
614
|
+
* console.log('File upload starting...');
|
|
615
|
+
* return config;
|
|
616
|
+
* });
|
|
617
|
+
* }
|
|
618
|
+
*
|
|
619
|
+
* async uploadFile(file: Buffer) {
|
|
620
|
+
* return this.fileClient.post('/file/upload', file);
|
|
621
|
+
* }
|
|
622
|
+
* }
|
|
623
|
+
* ```
|
|
624
|
+
*/
|
|
625
|
+
create(options) {
|
|
626
|
+
const mergedConfig = {
|
|
627
|
+
timeout: 5e3,
|
|
628
|
+
...options?.config
|
|
629
|
+
};
|
|
630
|
+
const mergedPlatform = {
|
|
631
|
+
enabled: true,
|
|
632
|
+
...options?.platform
|
|
633
|
+
};
|
|
634
|
+
return new HttpClient({
|
|
635
|
+
...mergedConfig,
|
|
636
|
+
platform: mergedPlatform
|
|
637
|
+
});
|
|
638
|
+
}
|
|
639
|
+
/**
|
|
640
|
+
* 注册全局拦截器
|
|
641
|
+
*/
|
|
642
|
+
registerGlobalInterceptors() {
|
|
643
|
+
this.client.interceptors.request.use((config) => {
|
|
644
|
+
this.logger.log("Internal HTTP Request", {
|
|
645
|
+
method: config.method?.toUpperCase(),
|
|
646
|
+
url: config.url,
|
|
647
|
+
headers: config.headers,
|
|
648
|
+
params: config.params,
|
|
649
|
+
data: config.data
|
|
650
|
+
}, "HttpService");
|
|
651
|
+
return config;
|
|
652
|
+
}, (error) => {
|
|
653
|
+
this.logger.error("HTTP Request Error", error, "HttpService");
|
|
654
|
+
return Promise.reject(error);
|
|
655
|
+
});
|
|
656
|
+
this.client.interceptors.response.use((response) => {
|
|
657
|
+
this.logger.log("InternalHTTP Response", {
|
|
658
|
+
method: response.config.method?.toUpperCase(),
|
|
659
|
+
url: response.config.url,
|
|
660
|
+
status: response.status,
|
|
661
|
+
statusText: response.statusText,
|
|
662
|
+
data: response.data
|
|
663
|
+
}, "HttpService");
|
|
664
|
+
return response;
|
|
665
|
+
}, (error) => {
|
|
666
|
+
this.logger.error("Internal HTTP Response Error", {
|
|
667
|
+
method: error.config?.method?.toUpperCase(),
|
|
668
|
+
url: error.config?.url,
|
|
669
|
+
status: error.response?.status,
|
|
670
|
+
statusText: error.response?.statusText,
|
|
671
|
+
data: error.response?.data,
|
|
672
|
+
message: error.message
|
|
673
|
+
}, "HttpService");
|
|
674
|
+
return Promise.reject(error);
|
|
675
|
+
});
|
|
676
|
+
}
|
|
677
|
+
};
|
|
678
|
+
PlatformHttpClientService = _ts_decorate8([
|
|
679
|
+
Injectable8(),
|
|
680
|
+
_ts_metadata5("design:type", Function),
|
|
681
|
+
_ts_metadata5("design:paramtypes", [])
|
|
682
|
+
], PlatformHttpClientService);
|
|
683
|
+
|
|
336
684
|
// src/modules/platform/module.ts
|
|
337
|
-
function
|
|
685
|
+
function _ts_decorate9(decorators, target, key, desc) {
|
|
338
686
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
339
687
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
340
688
|
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;
|
|
341
689
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
342
690
|
}
|
|
343
|
-
__name(
|
|
344
|
-
var PLATFORM_MODULE_OPTIONS = "PLATFORM_MODULE_OPTIONS";
|
|
691
|
+
__name(_ts_decorate9, "_ts_decorate");
|
|
692
|
+
var PLATFORM_MODULE_OPTIONS = /* @__PURE__ */ Symbol("PLATFORM_MODULE_OPTIONS");
|
|
345
693
|
var PlatformModule = class _PlatformModule {
|
|
346
694
|
static {
|
|
347
695
|
__name(this, "PlatformModule");
|
|
@@ -352,6 +700,7 @@ var PlatformModule = class _PlatformModule {
|
|
|
352
700
|
return {
|
|
353
701
|
module: _PlatformModule,
|
|
354
702
|
imports: [
|
|
703
|
+
HttpInterceptorService,
|
|
355
704
|
ConfigModule.forRoot({
|
|
356
705
|
isGlobal: true,
|
|
357
706
|
envFilePath: [
|
|
@@ -362,7 +711,13 @@ var PlatformModule = class _PlatformModule {
|
|
|
362
711
|
app_config_default
|
|
363
712
|
]
|
|
364
713
|
}),
|
|
714
|
+
CommonModule,
|
|
715
|
+
ObservableModule,
|
|
365
716
|
LoggerModule,
|
|
717
|
+
HttpModule.register({
|
|
718
|
+
timeout: 5e3,
|
|
719
|
+
maxRedirects: 5
|
|
720
|
+
}),
|
|
366
721
|
DataPaasModule.forRootAsync({
|
|
367
722
|
imports: [
|
|
368
723
|
ConfigModule,
|
|
@@ -370,17 +725,17 @@ var PlatformModule = class _PlatformModule {
|
|
|
370
725
|
],
|
|
371
726
|
inject: [
|
|
372
727
|
ConfigService,
|
|
373
|
-
|
|
728
|
+
AppLogger2
|
|
374
729
|
],
|
|
375
730
|
useFactory: /* @__PURE__ */ __name(async (...args) => {
|
|
376
731
|
const configService = args[0];
|
|
377
732
|
const appLogger = args[1];
|
|
378
733
|
const drizzleLogger = {
|
|
379
734
|
logQuery(query, params) {
|
|
380
|
-
appLogger.log?.("SQL Query"
|
|
735
|
+
appLogger.log?.("SQL Query " + JSON.stringify({
|
|
381
736
|
query,
|
|
382
737
|
params
|
|
383
|
-
}, "Database");
|
|
738
|
+
}), "Database");
|
|
384
739
|
}
|
|
385
740
|
};
|
|
386
741
|
return {
|
|
@@ -389,7 +744,8 @@ var PlatformModule = class _PlatformModule {
|
|
|
389
744
|
};
|
|
390
745
|
}, "useFactory")
|
|
391
746
|
}),
|
|
392
|
-
AuthNPaasModule.forRoot()
|
|
747
|
+
AuthNPaasModule.forRoot(),
|
|
748
|
+
AutomationModule.forRoot()
|
|
393
749
|
],
|
|
394
750
|
providers: [
|
|
395
751
|
{
|
|
@@ -404,11 +760,26 @@ var PlatformModule = class _PlatformModule {
|
|
|
404
760
|
enableImplicitConversion: true
|
|
405
761
|
}
|
|
406
762
|
})
|
|
763
|
+
},
|
|
764
|
+
{
|
|
765
|
+
provide: OBSERVABLE_SERVICE,
|
|
766
|
+
useClass: Observable
|
|
767
|
+
},
|
|
768
|
+
{
|
|
769
|
+
provide: PLATFORM_HTTP_CLIENT2,
|
|
770
|
+
useFactory: /* @__PURE__ */ __name((svc) => svc.instance, "useFactory"),
|
|
771
|
+
inject: [
|
|
772
|
+
PlatformHttpClientService
|
|
773
|
+
]
|
|
407
774
|
}
|
|
408
775
|
],
|
|
409
776
|
exports: [
|
|
410
777
|
ConfigModule,
|
|
411
|
-
LoggerModule
|
|
778
|
+
LoggerModule,
|
|
779
|
+
CommonModule,
|
|
780
|
+
OBSERVABLE_SERVICE,
|
|
781
|
+
PlatformHttpClientService,
|
|
782
|
+
PLATFORM_HTTP_CLIENT2
|
|
412
783
|
]
|
|
413
784
|
};
|
|
414
785
|
}
|
|
@@ -421,7 +792,7 @@ var PlatformModule = class _PlatformModule {
|
|
|
421
792
|
if (process.env.NODE_ENV === "development") {
|
|
422
793
|
consumer.apply(FrameworkDebugMiddleware).forRoutes("/api/__framework__/debug");
|
|
423
794
|
}
|
|
424
|
-
consumer.apply(UserContextMiddleware, LoggerContextMiddleware, SqlExecutionContextMiddleware).forRoutes("/*");
|
|
795
|
+
consumer.apply(UserContextMiddleware, RequestContextMiddleware, LoggerContextMiddleware, SqlExecutionContextMiddleware).forRoutes("/*");
|
|
425
796
|
consumer.apply(CsrfTokenMiddleware, ViewContextMiddleware).exclude("/api/(.*)").forRoutes("*");
|
|
426
797
|
if (options.enableCsrf !== false) {
|
|
427
798
|
const csrfRoutes = options.csrfRoutes || "/api/*";
|
|
@@ -435,20 +806,20 @@ var PlatformModule = class _PlatformModule {
|
|
|
435
806
|
}
|
|
436
807
|
}
|
|
437
808
|
};
|
|
438
|
-
PlatformModule =
|
|
809
|
+
PlatformModule = _ts_decorate9([
|
|
439
810
|
Global(),
|
|
440
811
|
Module({})
|
|
441
812
|
], PlatformModule);
|
|
442
813
|
|
|
443
814
|
// src/setup.ts
|
|
444
|
-
import { AppLogger as
|
|
815
|
+
import { AppLogger as AppLogger3 } from "@lark-apaas/nestjs-logger";
|
|
445
816
|
import cookieParser from "cookie-parser";
|
|
446
817
|
import { DevToolsV2Module } from "@lark-apaas/nestjs-openapi-devtools";
|
|
447
818
|
var defaultPerms = {
|
|
448
819
|
disableSwagger: false
|
|
449
820
|
};
|
|
450
821
|
async function configureApp(app, perms = defaultPerms) {
|
|
451
|
-
app.useLogger(app.get(
|
|
822
|
+
app.useLogger(app.get(AppLogger3));
|
|
452
823
|
app.flushLogs();
|
|
453
824
|
app.use(cookieParser());
|
|
454
825
|
const globalPrefix = process.env.CLIENT_BASE_PATH ?? "";
|
|
@@ -470,6 +841,8 @@ __name(configureApp, "configureApp");
|
|
|
470
841
|
import { DevToolsModule, DevToolsV2Module as DevToolsV2Module2 } from "@lark-apaas/nestjs-openapi-devtools";
|
|
471
842
|
export * from "@lark-apaas/nestjs-authnpaas";
|
|
472
843
|
export * from "@lark-apaas/nestjs-datapaas";
|
|
844
|
+
export * from "@lark-apaas/nestjs-observable";
|
|
845
|
+
export * from "@lark-apaas/nestjs-trigger";
|
|
473
846
|
export {
|
|
474
847
|
CsrfMiddleware,
|
|
475
848
|
CsrfTokenMiddleware,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lark-apaas/fullstack-nestjs-core",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.6-alpha.0",
|
|
4
4
|
"description": "FullStack Nestjs Core",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -39,10 +39,16 @@
|
|
|
39
39
|
"prepublishOnly": "npm run build"
|
|
40
40
|
},
|
|
41
41
|
"dependencies": {
|
|
42
|
+
"@lark-apaas/http-client": "0.1.0",
|
|
42
43
|
"@lark-apaas/nestjs-authnpaas": "^1.0.2",
|
|
44
|
+
"@lark-apaas/nestjs-common": "0.1.0",
|
|
43
45
|
"@lark-apaas/nestjs-datapaas": "^1.0.5",
|
|
44
46
|
"@lark-apaas/nestjs-logger": "^1.0.2",
|
|
47
|
+
"@lark-apaas/nestjs-observable": "0.0.1-alpha.26",
|
|
45
48
|
"@lark-apaas/nestjs-openapi-devtools": "^1.0.9",
|
|
49
|
+
"@lark-apaas/nestjs-trigger": "0.0.1-alpha.2",
|
|
50
|
+
"@nestjs/axios": "^4.0.1",
|
|
51
|
+
"axios": "^1.13.2",
|
|
46
52
|
"cookie-parser": "^1.4.7"
|
|
47
53
|
},
|
|
48
54
|
"devDependencies": {
|