Files
Admin_dash/app/api/status/route.ts

102 lines
3.4 KiB
TypeScript
Raw Normal View History

2026-02-08 02:32:45 -05:00
import { NextResponse } from 'next/server';
2026-02-08 03:03:53 -05:00
import { getDb } from '@/lib/db';
2026-02-08 02:32:45 -05:00
export const dynamic = 'force-dynamic';
export async function GET() {
2026-02-08 03:03:53 -05:00
try {
const db = await getDb();
// Get live status (most recent log per service)
const live = await db.all(`
SELECT service_name as name, url, status, latency
FROM uptime_logs
2026-02-08 03:03:53 -05:00
WHERE id IN (SELECT MAX(id) FROM uptime_logs GROUP BY service_name)
`);
// Get 24h stats
const stats24h = await db.all(`
SELECT service_name,
count(*) as total,
sum(case when status = 'up' then 1 else 0 end) as up_count
FROM uptime_logs
2026-02-08 03:03:53 -05:00
WHERE timestamp > datetime('now', '-24 hours')
GROUP BY service_name
`);
// Get 7d stats
const stats7d = await db.all(`
SELECT service_name,
count(*) as total,
sum(case when status = 'up' then 1 else 0 end) as up_count
FROM uptime_logs
2026-02-08 03:03:53 -05:00
WHERE timestamp > datetime('now', '-7 days')
GROUP BY service_name
`);
// Get lifetime stats (all available data)
const statsLifetime = await db.all(`
SELECT service_name,
count(*) as total,
sum(case when status = 'up' then 1 else 0 end) as up_count
FROM uptime_logs
GROUP BY service_name
`);
// Get average latency over last 24h (only for 'up' checks)
const avgLatencyRows = await db.all(`
SELECT service_name,
ROUND(AVG(latency)) as avg_latency
FROM uptime_logs
WHERE timestamp > datetime('now', '-24 hours')
AND status = 'up'
AND latency > 0
GROUP BY service_name
`);
// Get hourly history for last 24h (24 buckets per service)
const history = await db.all(`
SELECT service_name,
strftime('%Y-%m-%d %H:00', timestamp) as hour,
count(*) as total,
sum(case when status = 'up' then 1 else 0 end) as up_count
FROM uptime_logs
WHERE timestamp > datetime('now', '-24 hours')
GROUP BY service_name, hour
ORDER BY hour ASC
`);
// Group history by service
const historyMap: Record<string, Array<{ hour: string; up: boolean }>> = {};
for (const row of history) {
if (!historyMap[row.service_name]) historyMap[row.service_name] = [];
historyMap[row.service_name].push({
hour: row.hour,
up: row.up_count === row.total,
});
}
2026-02-08 03:03:53 -05:00
// Merge data
const results = live.map(l => {
const s24 = stats24h.find(s => s.service_name === l.name);
const s7d = stats7d.find(s => s.service_name === l.name);
const sLife = statsLifetime.find(s => s.service_name === l.name);
const avgLat = avgLatencyRows.find(s => s.service_name === l.name);
2026-02-08 03:03:53 -05:00
return {
...l,
uptime24h: s24 ? Math.round((s24.up_count / s24.total) * 100) : 100,
uptime7d: s7d ? Math.round((s7d.up_count / s7d.total) * 100) : 100,
uptimeLifetime: sLife ? Math.round((sLife.up_count / sLife.total) * 100) : 100,
avgLatency24h: avgLat ? avgLat.avg_latency : 0,
history: historyMap[l.name] || [],
2026-02-08 03:03:53 -05:00
};
});
return NextResponse.json(results);
} catch (error) {
console.error('Uptime stats error:', error);
return NextResponse.json([]);
}
2026-02-08 02:32:45 -05:00
}