Files
portfolio/app/api/contacts/route.tsx
2025-09-08 08:15:58 +02:00

96 lines
2.7 KiB
TypeScript

import { type NextRequest, NextResponse } from "next/server";
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
export async function GET(request: NextRequest) {
try {
const { searchParams } = new URL(request.url);
const filter = searchParams.get('filter') || 'all';
const limit = parseInt(searchParams.get('limit') || '50');
const offset = parseInt(searchParams.get('offset') || '0');
let whereClause = {};
switch (filter) {
case 'unread':
whereClause = { responded: false };
break;
case 'responded':
whereClause = { responded: true };
break;
default:
whereClause = {};
}
const [contacts, total] = await Promise.all([
prisma.contact.findMany({
where: whereClause,
orderBy: { createdAt: 'desc' },
take: limit,
skip: offset,
}),
prisma.contact.count({ where: whereClause })
]);
return NextResponse.json({
contacts,
total,
hasMore: offset + contacts.length < total
});
} catch (error) {
console.error('Error fetching contacts:', error);
return NextResponse.json(
{ error: 'Failed to fetch contacts' },
{ status: 500 }
);
}
}
export async function POST(request: NextRequest) {
try {
const body = await request.json();
const { name, email, subject, message } = body;
// Validate required fields
if (!name || !email || !subject || !message) {
return NextResponse.json(
{ error: 'All fields are required' },
{ status: 400 }
);
}
// Validate email format
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
if (!emailRegex.test(email)) {
return NextResponse.json(
{ error: 'Invalid email format' },
{ status: 400 }
);
}
const contact = await prisma.contact.create({
data: {
name,
email,
subject,
message,
responded: false
}
});
return NextResponse.json({
message: 'Contact created successfully',
contact
}, { status: 201 });
} catch (error) {
console.error('Error creating contact:', error);
return NextResponse.json(
{ error: 'Failed to create contact' },
{ status: 500 }
);
}
}