feat: Wabenhain Honig-Shop Anwendung

Vollstaendige Next.js/Prisma-E-Commerce-Anwendung fuer eine Imkerei:
Shop, Warenkorb, Stripe-Checkout, Kundenkonto mit 2FA, Admin-Bereich
(Produkte, Ernten, Chargen, Bestellungen, Gutscheine, admin-editierbare
Website-Inhalte), i18n (DE/EN), Rate-Limiting/CSP/Audit-Log-Haertung,
PostgreSQL- und MySQL-Unterstuetzung ueber austauschbare Prisma-
Treiber-Adapter, Unit-/Komponenten-/E2E-Tests.
This commit is contained in:
Nick Szaunig committed 2026-08-17 14:30:28 +02:00
1 parent 5c76fcc266
commit c7927f2883
240 files changed
+26096 -137

No files matched your search

+41
View File
@@ -0,0 +1,41 @@
import { NextResponse } from "next/server";
import { prisma } from "@/lib/prisma";
import { businessInquirySchema } from "@/lib/validation";
import { rateLimit, getClientIp } from "@/lib/rate-limit";
import { verifyTurnstileToken } from "@/lib/turnstile";
export async function POST(request: Request) {
const ip = await getClientIp();
if (!rateLimit(`business-inquiry:${ip}`, 5, 60 * 60 * 1000)) {
return NextResponse.json(
{ error: "Zu viele Anfragen. Bitte versuche es später erneut." },
{ status: 429 }
);
}
const body = await request.json().catch(() => null);
const parsed = businessInquirySchema.safeParse(body);
if (!parsed.success) {
return NextResponse.json(
{ error: "Bitte überprüfe deine Angaben.", issues: parsed.error.flatten() },
{ status: 400 }
);
}
const turnstileToken = typeof body?.turnstileToken === "string" ? body.turnstileToken : null;
if (!(await verifyTurnstileToken(turnstileToken, ip))) {
return NextResponse.json({ error: "Die Sicherheitsprüfung ist fehlgeschlagen." }, { status: 400 });
}
const { desiredDeliveryDate, ...rest } = parsed.data;
await prisma.businessInquiry.create({
data: {
...rest,
desiredDeliveryDate: desiredDeliveryDate ? new Date(desiredDeliveryDate) : null,
},
});
return NextResponse.json({ success: true });
}