incidents.ts30 lines · main
1import { Hono } from 'hono';
2
3import { listIncidents } from '../services/incidents.js';
4import { getMaintenanceState } from '../services/platform-settings.js';
5import type { AppEnv } from '../types/app-env.js';
6
7/**
8 * Public status feed — no auth, no rate limit. Returns recent incidents
9 * for status pages + RSS feed consumption. Admin write surface lives
10 * on adminRouter (so it inherits requireAuth + requireAdmin + step-up).
11 */
12export const incidentsRouter = new Hono<AppEnv>();
13
14incidentsRouter.get('/v1/status/incidents', async (c) => {
15 const limitParam = c.req.query('limit');
16 const limit = limitParam ? Math.min(100, Math.max(1, Number(limitParam) || 50)) : 50;
17 const activeOnly = c.req.query('active') === 'true';
18 const rows = await listIncidents({ limit, activeOnly });
19 return c.json({ incidents: rows });
20});
21
22/**
23 * Public maintenance state — no auth, no rate limit. Returns the effective
24 * maintenance state so the marketing site can render a scheduled/active/
25 * upcoming banner. Reachable during maintenance via the /v1/status/*
26 * whitelist in the maintenance middleware.
27 */
28incidentsRouter.get('/v1/status/maintenance', async (c) => {
29 return c.json(await getMaintenanceState());
30});