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.
33 lines
866 B
TypeScript
33 lines
866 B
TypeScript
import {
|
|
Injectable,
|
|
Logger,
|
|
OnApplicationShutdown,
|
|
OnModuleInit,
|
|
} from "@nestjs/common";
|
|
import { closeDb } from "../../config/database.js";
|
|
|
|
const SERVICE_NAME = "core-edu";
|
|
|
|
@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(`service ${SERVICE_NAME} shutdown complete`);
|
|
} catch (error) {
|
|
this.logger.error(
|
|
`shutdown failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
);
|
|
}
|
|
}
|
|
}
|