4ae0bd580e
Admin > Ingredients lets admins add/edit/delete canonical ingredients and their aliases (e.g. "sel"/"sel fin"/"table salt") without touching code — previously only settable by hand in packages/db/src/seed.ts. Deleting just unlinks referencing pantry items/recipe ingredients (onDelete: set null), nothing else changes. Fixed: deleting a shopping list, recipe, or collection from its own detail page used router.push to navigate away, leaving the deleted resource's URL in browser history — one back-button press landed on a real "Page not found" screen. All three now use router.replace so the dead URL never sits in history. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
41 lines
1.3 KiB
TypeScript
41 lines
1.3 KiB
TypeScript
import { NextRequest, NextResponse } from "next/server";
|
|
import { z } from "zod";
|
|
import { db, ingredients, asc } from "@epicure/db";
|
|
import { requireAdmin } from "@/lib/api-auth";
|
|
|
|
const Schema = z.object({
|
|
name: z.string().trim().min(1).max(100),
|
|
aliases: z.array(z.string().trim().min(1).max(100)).max(50).default([]),
|
|
category: z.string().max(50).optional(),
|
|
});
|
|
|
|
export async function GET() {
|
|
const { response } = await requireAdmin();
|
|
if (response) return response;
|
|
|
|
const rows = await db.select().from(ingredients).orderBy(asc(ingredients.name));
|
|
return NextResponse.json({ data: rows });
|
|
}
|
|
|
|
export async function POST(req: NextRequest) {
|
|
const { response } = await requireAdmin();
|
|
if (response) return response;
|
|
|
|
const parsed = Schema.safeParse(await req.json().catch(() => null));
|
|
if (!parsed.success) return NextResponse.json({ error: "Validation error" }, { status: 400 });
|
|
|
|
const id = crypto.randomUUID();
|
|
try {
|
|
await db.insert(ingredients).values({
|
|
id,
|
|
name: parsed.data.name,
|
|
aliases: parsed.data.aliases,
|
|
category: parsed.data.category,
|
|
});
|
|
} catch {
|
|
return NextResponse.json({ error: "An ingredient with this name already exists" }, { status: 409 });
|
|
}
|
|
|
|
return NextResponse.json({ id }, { status: 201 });
|
|
}
|