From 95f5252366e957d987c95a2d29bbd9b8051aae7c Mon Sep 17 00:00:00 2001 From: Nick Szaunig Date: Thu, 17 Sep 2026 03:14:15 +0200 Subject: [PATCH] fix: gleichnamige Produkte aus verschiedenen Jahrgaengen brechen das Anlegen nicht mehr ab MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Product.slug ist eindeutig und zugleich die oeffentliche Adresse (/honig/). Ohne eigene Angabe wird er aus dem Namen gebildet. Bei jahrgangsweise gefuehrtem Honig kollidiert das zwangslaeufig: "Waldhonig" ergibt in jedem Jahr denselben Slug "waldhonig". Bisher schlug das als unbehandelte Prisma-Ausnahme (P2002) durch. Statt einer Meldung erschien die Fehlerseite des Admin-Bereichs, aus der nicht hervorgeht, dass lediglich die Adresse belegt ist — und das eingegebene Formular war verloren. Jetzt wird der Slug vorher geprueft und die Eingabe mit einem konkreten Vorschlag abgelehnt ("waldhonig-2026"). Das Formular hat fuer genau diesen Fall bereits ein eigenes Slug-Feld. Co-Authored-By: Claude Opus 5 (1M context) --- src/app/admin/actions/products.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/app/admin/actions/products.ts b/src/app/admin/actions/products.ts index 887d80c..cc647a4 100644 --- a/src/app/admin/actions/products.ts +++ b/src/app/admin/actions/products.ts @@ -54,6 +54,21 @@ export async function createProductAction(formData: FormData): Promise { // ignoriert statt sich auf eine korrekt ausgefuellte Auswahl zu verlassen. const isHoney = category === "HONIG"; + // Product.slug ist eindeutig UND zugleich die oeffentliche Adresse + // (/honig/). Ohne eigene Angabe wird er aus dem Namen gebildet — bei + // jahrgangsweise gefuehrtem Honig kollidiert das zwangslaeufig: "Waldhonig" + // ergibt in jedem Jahr denselben Slug "waldhonig". Ohne diese Behandlung + // schlug das als unbehandelte Prisma-Ausnahme (P2002) durch, und statt + // einer Meldung erschien die Fehlerseite des Admin-Bereichs — aus der nicht + // hervorgeht, dass lediglich die Adresse belegt ist. + const slugTaken = await prisma.product.findUnique({ where: { slug }, select: { id: true } }); + if (slugTaken) { + fail( + "/admin/produkte/neu", + `Die Adresse "${slug}" ist bereits vergeben. Bei gleichnamigen Produkten aus verschiedenen Jahrgaengen im Feld "Slug" eine eigene Adresse eintragen, zum Beispiel "${slug}-${new Date().getFullYear()}".` + ); + } + const product = await prisma.product.create({ data: { slug,