import type { NextRequest } from "next/server"; import { getActor, requireSignedIn } from "@/lib/auth/actor"; import { errorResponse, firstZodMessage, jsonError } from "@/lib/http"; import { ladeLogo } from "@/lib/qr/logo"; import { renderSvg } from "@/lib/qr/render"; import { qrRequestSchema, resolveQrRequest } from "@/lib/qr/request"; /** * Liefert die Live-Vorschau als SVG-Data-URL. Die Erzeugung passiert * serverseitig, damit Vorschau und Download garantiert identisch sind. */ export async function POST(request: NextRequest): Promise { try { // Der Generator steht nur Angemeldeten offen; die Weiterleitung // unter /r/{slug} bleibt davon unberührt und öffentlich. requireSignedIn(await getActor()); const parsed = qrRequestSchema.safeParse(await request.json()); if (!parsed.success) { return jsonError(firstZodMessage(parsed.error)); } const { content } = await resolveQrRequest(parsed.data); const logo = await ladeLogo(parsed.data.design); const svg = await renderSvg(content, parsed.data.design, logo); return Response.json({ content, dataUrl: `data:image/svg+xml;base64,${Buffer.from(svg, "utf8").toString("base64")}`, }); } catch (error) { return errorResponse(error); } }