← back to Trademarks Copyright
src/app/api/drops/drop-items/[id]/route.ts
51 lines
import { NextRequest, NextResponse } from "next/server";
import { query } from "@/lib/db";
/**
* PATCH /api/drops/drop-items/<id> { headline?, blurb?, pro_extra?, cta_text?, cta_url? }
* Lets the admin hand-edit any item in a drop before send.
*/
export async function PATCH(
req: NextRequest,
{ params }: { params: Promise<{ id: string }> }
) {
const { id } = await params;
const numId = Number(id);
if (!Number.isFinite(numId)) return NextResponse.json({ error: "bad id" }, { status: 400 });
const body = await req.json().catch(() => ({}));
if (!body || typeof body !== "object" || Array.isArray(body)) {
return NextResponse.json({ error: "json object body required" }, { status: 400 });
}
const updates: Record<string, string | null> = {};
for (const field of ["headline", "blurb", "pro_extra", "cta_text", "cta_url"] as const) {
if (field in body) updates[field] = body[field] ?? null;
}
if (!Object.keys(updates).length) return NextResponse.json({ error: "no fields to update" }, { status: 400 });
const set = Object.keys(updates).map((k, i) => `${k} = $${i + 2}`).join(", ");
const values = Object.values(updates);
const { rows } = await query(
`UPDATE drop_items SET ${set} WHERE id = $1 RETURNING id, headline, blurb, pro_extra, cta_text, cta_url`,
[numId, ...values]
);
if (!rows.length) return NextResponse.json({ error: "not found" }, { status: 404 });
return NextResponse.json({ ok: true, item: rows[0] });
}
/** GET the drop_items for a drop — used by the admin inline editor. */
export async function GET(
_req: NextRequest,
{ params }: { params: Promise<{ id: string }> }
) {
const { id } = await params;
const numId = Number(id);
if (!Number.isFinite(numId)) return NextResponse.json({ error: "bad id" }, { status: 400 });
const { rows } = await query(
`SELECT id, position, headline, blurb, pro_extra, cta_text, cta_url, source_kind, source_id
FROM drop_items WHERE drop_id = $1 ORDER BY position`,
[numId]
);
return NextResponse.json({ items: rows });
}