import { getGameDb } from '@/lib/db/client' import { AdminError, deleteAdminRow, insertAdminRow, readAdminRows, updateAdminRow } from '@/lib/db/admin' // #38 — rows of one admin table: GET (capped list), POST (insert), PATCH ({key, values}), DELETE ({key}). async function jsonBody(req: Request): Promise> { let body: unknown try { body = await req.json() } catch { throw new AdminError(400, 'Invalid JSON body') } if (typeof body !== 'object' || body === null || Array.isArray(body)) throw new AdminError(400, 'Body must be a JSON object') return body as Record } async function run(fn: () => Promise): Promise { try { return Response.json(await fn()) } catch (err) { if (err instanceof AdminError) return Response.json({ error: err.message }, { status: err.status }) throw err } } export async function GET(req: Request, ctx: { params: Promise<{ name: string }> }) { const db = await getGameDb() const { name } = await ctx.params const url = new URL(req.url) const limitRaw = url.searchParams.get('limit') const offsetRaw = url.searchParams.get('offset') const limit = limitRaw === null ? 50 : Number(limitRaw) const offset = offsetRaw === null ? 0 : Number(offsetRaw) return run(() => readAdminRows(db, name, limit, offset)) } export async function POST(req: Request, ctx: { params: Promise<{ name: string }> }) { const db = await getGameDb() const { name } = await ctx.params return run(async () => insertAdminRow(db, name, await jsonBody(req))) } export async function PATCH(req: Request, ctx: { params: Promise<{ name: string }> }) { const db = await getGameDb() const { name } = await ctx.params return run(async () => { const body = await jsonBody(req) return updateAdminRow(db, name, body.key, body.values) }) } export async function DELETE(req: Request, ctx: { params: Promise<{ name: string }> }) { const db = await getGameDb() const { name } = await ctx.params return run(async () => deleteAdminRow(db, name, (await jsonBody(req)).key)) }