NestJS (6 services): implement @RequirePermission decorator with SetMetadata+Reflector, register APP_GUARD globally, fix as assertions to type guards, add explicit return types, fix import type for express, fix /metrics implicit any, replace native Error with ApplicationError, remove typeorm remnants, register LifecycleService. teacher-bff: add logger, ApplicationError, GlobalErrorFilter, forward real userId to downstream, log downstream failures, migrate health controller to shared/health. Go (2 services): interface to any, doc comments, CORS dev whitelist, JWT secret fail-fast, push-gateway internal API auth, metrics and readyz endpoints, remove dead code. Python (2 services): lifespan return type, dev_mode to bool, data-ana APIRouter, ai POST body model, ClickHouse async wrapping.
46 lines
1.3 KiB
TypeScript
46 lines
1.3 KiB
TypeScript
import {
|
||
Injectable,
|
||
Logger,
|
||
OnApplicationShutdown,
|
||
OnModuleInit,
|
||
} from "@nestjs/common";
|
||
import { closeDb } from "../../config/database.js";
|
||
|
||
const SERVICE_NAME = "classes";
|
||
|
||
/**
|
||
* 优雅停机服务。
|
||
*
|
||
* 信号处理由 NestJS 在 `app.listen` 之前调用 `app.enableShutdownHooks()`
|
||
* 触发(SIGTERM / SIGINT),NestJS 会依次调用 OnApplicationShutdown 钩子。
|
||
* K8s 配置 `terminationGracePeriodSeconds=60` 给予足够时间清理。
|
||
*
|
||
* Classes 服务仅使用 Drizzle ORM(MySQL),无 Kafka / Redis 依赖。
|
||
* 关闭时仅需关闭数据库连接池。
|
||
*/
|
||
@Injectable()
|
||
export class LifecycleService implements OnModuleInit, OnApplicationShutdown {
|
||
private readonly logger = new Logger(LifecycleService.name);
|
||
|
||
onModuleInit(): void {
|
||
this.logger.log(`service ${SERVICE_NAME} module initialized`);
|
||
}
|
||
|
||
async onApplicationShutdown(signal?: string): Promise<void> {
|
||
this.logger.log(
|
||
`service ${SERVICE_NAME} shutting down (signal=${signal ?? "unknown"})`,
|
||
);
|
||
|
||
try {
|
||
await closeDb();
|
||
this.logger.log("database connection closed");
|
||
} catch (error) {
|
||
this.logger.error(
|
||
`database close failed: ${error instanceof Error ? error.message : String(error)}`,
|
||
);
|
||
}
|
||
|
||
this.logger.log(`service ${SERVICE_NAME} shutdown complete`);
|
||
}
|
||
}
|