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,