SPB Git
873 B · 13 lines typescript
1import { z } from "zod";2import { sqlPublic } from "@/db";3import { recordEvent } from "@/lib/papers/events";4import { ip, limited } from "@/lib/api";5const Body = z.object({ kind: z.literal("view"), slug: z.string().regex(/^[a-z0-9]{2,20}$/) });6export async function POST(req: Request) {7  if (limited(req, "events", 60)) return new Response(null, { status: 204 });8  let b; try { b = Body.parse(await req.json()); } catch { return new Response(null, { status: 204 }); }9  const [p] = await sqlPublic`SELECT id FROM public_papers WHERE slug = ${b.slug} AND status = 'published'`; if (!p) return new Response(null, { status: 204 });10  await recordEvent("view", p.id, { ip: ip(req), ua: req.headers.get("user-agent"), referrer: req.headers.get("referer"), locale: req.headers.get("x-locale") ?? undefined }).catch(() => {});11  return new Response(null, { status: 204 });12}13
Files · main
Menu

Theme