import { Controller, Get, Logger, ServiceUnavailableException } from "@nestjs/common"; import { SkipThrottle } from "@nestjs/throttler"; import { Public } from "./common/decorators/public.decorator.js"; import { PrismaService } from "./common/prisma/prisma.service.js"; import { RedisService } from "./common/redis/redis.service.js"; @SkipThrottle() @Controller("health") export class AppController { private readonly logger = new Logger(AppController.name); private readonly startTime: number; constructor( private readonly prisma: PrismaService, private readonly redis: RedisService, ) { this.startTime = Date.now(); } @Public() @Get() check() { return { status: "ok", timestamp: new Date().toISOString(), version: process.env.npm_package_version ?? "0.1.0", uptime: Math.floor((Date.now() - this.startTime) / 1000), environment: process.env.NODE_ENV ?? "development", }; } @Public() @Get("db") async checkDatabase() { try { await this.prisma.$queryRaw`SELECT 1`; return { status: "ok", service: "database" }; } catch (error) { this.logger.error("Database health check failed", error); throw new ServiceUnavailableException({ status: "error", service: "database", message: "Database connection failed", }); } } @Public() @Get("redis") async checkRedis() { try { await this.redis.ping(); return { status: "ok", service: "redis" }; } catch (error) { this.logger.error("Redis health check failed", error); throw new ServiceUnavailableException({ status: "error", service: "redis", message: "Redis connection failed", }); } } }