← 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 });
}