import { Inject, Injectable } from "@nestjs/common"; import { loadEnv } from "../../config/env.js"; import { logger } from "../../common/logger.js"; import { PrismaService } from "../../common/prisma.service.js"; import { RedisService } from "../../common/redis.service.js"; import { APP_VERSION } from "../../constants.js"; export interface DeepCheck { postgres: boolean; redis: boolean; } @Injectable() export class HealthService { private readonly startedAt = Date.now(); constructor( @Inject(PrismaService) private readonly prisma: PrismaService, @Inject(RedisService) private readonly redis: RedisService ) {} liveness(): { status: "ok"; version: string; uptime: number } { return { status: "ok", version: APP_VERSION, uptime: Math.round((Date.now() - this.startedAt) / 1000) }; } async deep(): Promise<{ ok: boolean; checks: DeepCheck }> { let postgres = false; try { await this.prisma.$queryRaw`SELECT 1`; postgres = true; } catch (err) { logger.warn(`health: postgres unreachable: ${(err as Error).message}`); } let redis = false; try { redis = await this.redis.ping(); } catch { redis = false; } return { ok: postgres && redis, checks: { postgres, redis } }; } }