1import { Inject, Injectable } from "@nestjs/common"; 2import { loadEnv } from "../../config/env.js"; 3import { logger } from "../../common/logger.js"; 4import { PrismaService } from "../../common/prisma.service.js"; 5import { RedisService } from "../../common/redis.service.js"; 6import { APP_VERSION } from "../../constants.js"; 7 8export interface DeepCheck { 9 postgres: boolean; 10 redis: boolean; 11} 12 13@Injectable() 14export class HealthService { 15 private readonly startedAt = Date.now(); 16 17 constructor( 18 @Inject(PrismaService) private readonly prisma: PrismaService, 19 @Inject(RedisService) private readonly redis: RedisService 20 ) {} 21 22 liveness(): { status: "ok"; version: string; uptime: number } { 23 return { status: "ok", version: APP_VERSION, uptime: Math.round((Date.now() - this.startedAt) / 1000) }; 24 } 25 26 async deep(): Promise<{ ok: boolean; checks: DeepCheck }> { 27 let postgres = false; 28 try { 29 await this.prisma.$queryRaw`SELECT 1`; 30 postgres = true; 31 } catch (err) { 32 logger.warn(`health: postgres unreachable: ${(err as Error).message}`); 33 } 34 let redis = false; 35 try { 36 redis = await this.redis.ping(); 37 } catch { 38 redis = false; 39 } 40 return { ok: postgres && redis, checks: { postgres, redis } }; 41 } 42} 43