route.ts 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import { renderToBuffer } from "@json-render/react-pdf/render";
  2. import { examples } from "@/lib/examples";
  3. import type { Spec } from "@json-render/core";
  4. export async function GET(req: Request) {
  5. const { searchParams } = new URL(req.url);
  6. const name = searchParams.get("name") ?? "invoice";
  7. const download = searchParams.get("download") === "1";
  8. const example = examples.find((e) => e.name === name);
  9. if (!example) {
  10. return new Response("Example not found", { status: 404 });
  11. }
  12. return pdfResponse(example.spec, name, download);
  13. }
  14. export async function POST(req: Request) {
  15. const { spec, download, filename } = (await req.json()) as {
  16. spec: Spec;
  17. download?: boolean;
  18. filename?: string;
  19. };
  20. if (!spec || !spec.root || !spec.elements) {
  21. return new Response("Invalid spec", { status: 400 });
  22. }
  23. return pdfResponse(spec, filename ?? "document", download ?? false);
  24. }
  25. async function pdfResponse(spec: Spec, name: string, download: boolean) {
  26. const buffer = await renderToBuffer(spec);
  27. const disposition = download
  28. ? `attachment; filename="${name}.pdf"`
  29. : `inline; filename="${name}.pdf"`;
  30. return new Response(buffer as unknown as ArrayBuffer, {
  31. headers: {
  32. "Content-Type": "application/pdf",
  33. "Content-Disposition": disposition,
  34. "Cache-Control": "no-store",
  35. },
  36. });
  37. }