import { AlertTriangle, Database, HeartPulse, Server } from "lucide-react"; import { redirect } from "next/navigation"; import { Badge } from "@/components/ui/badge"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { canAccess, getAdminContext, PERMS } from "@/lib/permissions"; import { prisma } from "@/lib/prisma"; import { HealthCheckClient } from "./health-check-client"; async function getDevOpsData() { const now = Math.floor(Date.now() / 1000); const dayAgo = now - 86400; // DB health — simple count query let dbStatus: "healthy" | "error" = "healthy"; let dbLatency = 0; try { const start = Date.now(); await prisma.user.count({ take: 1 }); dbLatency = Date.now() - start; } catch { dbStatus = "error"; } // Recent emulator errors const recentErrors = await prisma.emulatorErrors.findMany({ orderBy: { id: "desc" }, take: 20, }); const errorsToday = await prisma.emulatorErrors.count({ where: { timestamp: { gte: dayAgo } }, }); // Emulator settings (version info) const emuVersion = await prisma.emulatorSettings.findFirst({ where: { key: "version" }, }); // Online user count as proxy for emulator health const onlineUsers = await prisma.user.count({ where: { online: "1" } }); return { dbStatus, dbLatency, recentErrors, errorsToday, emuVersion: emuVersion?.value ?? "Unknown", onlineUsers, }; } export default async function DevOpsPage() { const { session, permissions } = await getAdminContext(); if (!canAccess(permissions, PERMS.DEVOPS_VIEW, session.user.rank)) { redirect("/admin"); } const data = await getDevOpsData(); return (

Health Status

System health, emulator status and error monitoring

{/* Status cards */}
Database {data.dbStatus === "healthy" ? "Healthy" : "Error"}

Latency: {data.dbLatency}ms

Emulator

Version: {data.emuVersion}

Online Users
{data.onlineUsers}

Current active connections

Errors (24h)
{data.errorsToday}

Emulator errors today

{/* Recent errors */} Recent Emulator Errors {data.recentErrors.length === 0 ? (

No recent errors

) : (
{data.recentErrors.map((error) => (
#{error.id} {new Date(error.timestamp * 1000).toLocaleString()}
                    {Buffer.from(error.stacktrace).toString("utf-8")}
                  
))}
)}
); }