背景:A4 需要字典三层合并、配置单一来源与阈值同源。\n改动:新增 catalog 模块(类型/条目/三层合并/编码不可改/快照工具);platform 新增 SystemConfigService/Controller、NamingService 与配置版本历史;roles/users/customers/customer-fields 改为读 system_configs 上限。\n影响面:新增 13 个 REST 端点与 4 个模块注入;system_configs 写入走事务/乐观锁/版本历史;OpenAPI 快照更新。\n回滚:回滚本提交并恢复 shared 契约;新增表可保留。\n验证:api typecheck/build;单测 137;集成 58;OpenAPI diff 无破坏性变更。
60 lines
2.1 KiB
TypeScript
60 lines
2.1 KiB
TypeScript
import { REQUEST_ID_HEADER, ulid } from '@lingxi/shared';
|
|
import { Module } from '@nestjs/common';
|
|
import { LoggerModule } from 'nestjs-pino';
|
|
|
|
import { SecurityModule } from './common/security/security.module';
|
|
import { APP_CONFIG, AppConfigModule } from './config/config.module';
|
|
import type { AppConfig } from './config/env';
|
|
import { PrismaModule } from './infra/prisma/prisma.module';
|
|
import { RedisModule } from './infra/redis/redis.module';
|
|
import { CatalogModule } from './modules/catalog/catalog.module';
|
|
import { ClientModule } from './modules/client/client.module';
|
|
import { IdentityModule } from './modules/identity/identity.module';
|
|
import { PlatformModule } from './modules/platform/platform.module';
|
|
|
|
@Module({
|
|
imports: [
|
|
AppConfigModule,
|
|
LoggerModule.forRootAsync({
|
|
imports: [AppConfigModule],
|
|
inject: [APP_CONFIG],
|
|
useFactory: (config: AppConfig) => ({
|
|
pinoHttp: {
|
|
level: config.logLevel,
|
|
genReqId: (request, response) => {
|
|
const header = request.headers[REQUEST_ID_HEADER];
|
|
const existing = Array.isArray(header) ? header[0] : header;
|
|
const traceId = typeof existing === 'string' && existing.length > 0 ? existing : ulid();
|
|
response.setHeader(REQUEST_ID_HEADER, traceId);
|
|
return traceId;
|
|
},
|
|
customProps: (request) => ({ trace_id: request.id }),
|
|
redact: {
|
|
paths: ['req.headers.authorization', 'req.headers.cookie', 'res.headers["set-cookie"]'],
|
|
censor: '[redacted]',
|
|
},
|
|
autoLogging: {
|
|
ignore: (request) => request.url === '/health',
|
|
},
|
|
...(config.nodeEnv === 'development' && process.env.VITEST === undefined
|
|
? {
|
|
transport: {
|
|
target: 'pino-pretty',
|
|
options: { singleLine: true, translateTime: 'SYS:HH:MM:ss.l' },
|
|
},
|
|
}
|
|
: {}),
|
|
},
|
|
}),
|
|
}),
|
|
PrismaModule,
|
|
RedisModule,
|
|
SecurityModule,
|
|
IdentityModule,
|
|
ClientModule,
|
|
CatalogModule,
|
|
PlatformModule,
|
|
],
|
|
})
|
|
export class AppModule {}
|