Files
spreewaldzeit/app/api/inquiries/route.ts

87 lines
2.3 KiB
TypeScript

import { NextResponse } from "next/server";
import { prisma } from "@/lib/db";
import { inquirySchema } from "@/lib/validations";
import { sendInquiryMails } from "@/lib/email";
export async function POST(request: Request) {
let body: unknown;
try {
body = await request.json();
} catch {
return NextResponse.json({ error: "Ungültige Anfrage." }, { status: 400 });
}
const parsed = inquirySchema.safeParse(body);
if (!parsed.success) {
return NextResponse.json(
{
error: "Bitte prüfen Sie Ihre Eingaben.",
issues: parsed.error.flatten().fieldErrors,
},
{ status: 400 }
);
}
// Honeypot: wenn `website` gefüllt ist, ist es vermutlich ein Bot.
if (parsed.data.website) {
return NextResponse.json({ ok: true }, { status: 200 });
}
const { apartmentSlug, arrival, departure, guests, name, email, phone, message } =
parsed.data;
const apartment = await prisma.apartment.findUnique({
where: { slug: apartmentSlug },
});
if (!apartment) {
return NextResponse.json({ error: "Wohnung nicht gefunden." }, { status: 404 });
}
const arrivalDate = new Date(arrival);
const departureDate = new Date(departure);
if (guests > apartment.maxGuests) {
return NextResponse.json(
{ error: `Für diese Wohnung sind maximal ${apartment.maxGuests} Personen möglich.` },
{ status: 400 }
);
}
// Hinweis: wir blockieren eine Anfrage NICHT, nur weil die Zeit schon belegt ist —
// der Gast bekommt ggf. eine Absage, und der Vermieter sieht alles im Admin.
// Aber wir markieren im Memo-Feld nichts — Vermieter entscheidet.
const inquiry = await prisma.inquiry.create({
data: {
apartmentId: apartment.id,
arrival: arrivalDate,
departure: departureDate,
guests,
name,
email,
phone: phone || null,
message: message || "",
status: "new",
},
});
// Mails senden — Fehler dürfen den Erfolg nicht verhindern
try {
await sendInquiryMails({
apartmentName: apartment.name,
arrival: arrivalDate,
departure: departureDate,
guests,
name,
email,
phone,
message,
inquiryId: inquiry.id,
});
} catch (err) {
console.error("Mailversand fehlgeschlagen:", err);
}
return NextResponse.json({ ok: true, id: inquiry.id }, { status: 201 });
}