incidents.ts30 lines · main
| 1 | import { Hono } from 'hono'; |
| 2 | |
| 3 | import { listIncidents } from '../services/incidents.js'; |
| 4 | import { getMaintenanceState } from '../services/platform-settings.js'; |
| 5 | import 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 | */ |
| 12 | export const incidentsRouter = new Hono<AppEnv>(); |
| 13 | |
| 14 | incidentsRouter.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 | */ |
| 28 | incidentsRouter.get('/v1/status/maintenance', async (c) => { |
| 29 | return c.json(await getMaintenanceState()); |
| 30 | }); |