← back to Trademarks Copyright

src/app/api/drops/preview/[token]/[id]/route.ts

32 lines

import { NextRequest, NextResponse } from "next/server";
import { query } from "@/lib/db";
import { renderDropHTML } from "@/lib/drops";

/**
 * Renders the raw email HTML for a drop + subscriber combo — useful for
 * verifying rendering in a browser (open /api/drops/preview/<token>/<dropId>).
 * Requires a valid subscriber token.
 */
export async function GET(
  req: NextRequest,
  { params }: { params: Promise<{ token: string; id: string }> }
) {
  const { token, id } = await params;
  const dropId = Number(id);
  if (!Number.isFinite(dropId)) return NextResponse.json({ error: "bad id" }, { status: 400 });

  const { rows } = await query<{ tier: string; token: string }>(
    `SELECT tier, token FROM subscribers WHERE token = $1`, [token]
  );
  if (!rows.length) return NextResponse.json({ error: "unknown subscriber" }, { status: 404 });

  const { html } = await renderDropHTML({
    dropId,
    tier: rows[0].tier as "trial" | "standard" | "pro" | "comp",
    subscriberToken: rows[0].token,
    appBaseUrl: req.nextUrl.origin,
  });

  return new Response(html, { headers: { "content-type": "text/html; charset=utf-8" } });
}