Initial commit
This commit is contained in:
63
app/api/contact/route.ts
Normal file
63
app/api/contact/route.ts
Normal file
@@ -0,0 +1,63 @@
|
||||
import { NextRequest, NextResponse } from "next/server";
|
||||
import { z } from "zod";
|
||||
import { getPrisma } from "../../../lib/db";
|
||||
import { ok, fail } from "../../../lib/http";
|
||||
|
||||
const ContactSchema = z.object({
|
||||
firstName: z.string().min(1, "First name is required"),
|
||||
lastName: z.string().min(1, "Last name is required"),
|
||||
email: z.string().email("Invalid email address"),
|
||||
subject: z.string().min(1, "Subject is required"),
|
||||
message: z.string().min(10, "Message must be at least 10 characters"),
|
||||
});
|
||||
|
||||
export async function POST(req: NextRequest) {
|
||||
const parsed = ContactSchema.safeParse(await req.json().catch(() => ({})));
|
||||
if (!parsed.success) {
|
||||
console.error("[CONTACT] Validation error:", parsed.error);
|
||||
const firstError = parsed.error.errors[0];
|
||||
return NextResponse.json(
|
||||
{ ok: false, message: firstError.message },
|
||||
{ status: 400 }
|
||||
);
|
||||
}
|
||||
|
||||
const { firstName, lastName, email, subject, message } = parsed.data;
|
||||
const name = `${firstName} ${lastName}`;
|
||||
console.log("[CONTACT] New message from:", email);
|
||||
|
||||
try {
|
||||
const prisma = await getPrisma();
|
||||
if (!prisma) {
|
||||
console.error("[CONTACT] Database not configured");
|
||||
return NextResponse.json(
|
||||
{ ok: false, message: "Service temporarily unavailable. Please try again later." },
|
||||
{ status: 503 }
|
||||
);
|
||||
}
|
||||
|
||||
// Store contact message in database
|
||||
await prisma.contactMessage.create({
|
||||
data: {
|
||||
name,
|
||||
email,
|
||||
subject,
|
||||
message,
|
||||
status: "NEW",
|
||||
},
|
||||
});
|
||||
|
||||
console.log("[CONTACT] Message saved from:", email);
|
||||
|
||||
// TODO: Send email notification to admin
|
||||
// TODO: Send confirmation email to user
|
||||
|
||||
return ok({ message: "Message received. We'll get back to you soon." });
|
||||
} catch (error) {
|
||||
console.error("[CONTACT] Error saving message:", error);
|
||||
return NextResponse.json(
|
||||
{ ok: false, message: "Failed to send message. Please try again." },
|
||||
{ status: 500 }
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user