import { NextRequest, NextResponse } from 'next/server'; import { z } from 'zod'; import { verifyPassword, createSession } from '@/lib/auth'; import { prisma } from '@/lib/prisma'; const loginSchema = z.object({ email: z.string().email(), password: z.string().min(1), }); export async function POST(request: NextRequest) { try { const body = await request.json(); const { email, password } = loginSchema.parse(body); // Look up user by email const user = await prisma.user.findUnique({ where: { email }, }); if (!user) { return NextResponse.json( { error: 'Invalid email or password' }, { status: 401 } ); } // Verify the password const isValid = await verifyPassword(password, user.passwordHash); if (!isValid) { return NextResponse.json( { error: 'Invalid email or password' }, { status: 401 } ); } // Create a session const session = await createSession(user.id); // Set the session cookie const response = NextResponse.json({ success: true, user: { id: user.id, email: user.email, name: user.name, }, }); response.cookies.set('sessionToken', session.token, { httpOnly: true, secure: process.env.NODE_ENV === 'production', sameSite: 'lax', maxAge: 60 * 60 * 24 * 30, // 30 days path: '/', }); return response; } catch (error) { if (error instanceof z.ZodError) { return NextResponse.json( { error: 'Invalid request data', details: error.errors }, { status: 400 } ); } console.error('Login error:', error); return NextResponse.json( { error: 'An error occurred during login' }, { status: 500 } ); } }