import { NextRequest, NextResponse } from "next/server"; import { z } from "zod"; import { db, ingredients, eq } from "@epicure/db"; import { requireAdmin } from "@/lib/api-auth"; type Params = { params: Promise<{ id: string }> }; const Schema = z.object({ name: z.string().trim().min(1).max(100).optional(), aliases: z.array(z.string().trim().min(1).max(100)).max(50).optional(), category: z.string().max(50).nullable().optional(), }); export async function PUT(req: NextRequest, { params }: Params) { const { response } = await requireAdmin(); if (response) return response; const { id } = await params; const parsed = Schema.safeParse(await req.json().catch(() => null)); if (!parsed.success) return NextResponse.json({ error: "Validation error" }, { status: 400 }); const data = parsed.data; try { await db.update(ingredients).set({ ...(data.name && { name: data.name }), ...(data.aliases && { aliases: data.aliases }), ...(data.category !== undefined && { category: data.category ?? undefined }), }).where(eq(ingredients.id, id)); } catch { return NextResponse.json({ error: "An ingredient with this name already exists" }, { status: 409 }); } return NextResponse.json({ updated: true }); } // Unlinks (doesn't cascade-delete) any pantry item / recipe ingredient that // pointed at this canonical entry — both onDelete: "set null". export async function DELETE(req: NextRequest, { params }: Params) { const { response } = await requireAdmin(); if (response) return response; const { id } = await params; await db.delete(ingredients).where(eq(ingredients.id, id)); return new NextResponse(null, { status: 204 }); }