import { NextRequest, NextResponse } from 'next/server'; import { z } from 'zod'; import { prisma } from '@/lib/db'; import { verifyPassword, signToken, setSessionCookie } from '@/lib/auth'; import { Role } from '@/types'; const loginSchema = z.object({ email: z.string().email(), password: z.string(), }); export async function POST(request: NextRequest) { try { const body = await request.json(); const validated = loginSchema.parse(body); // Find user const user = await prisma.user.findUnique({ where: { email: validated.email }, }); if (!user) { return NextResponse.json( { error: 'Invalid email or password' }, { status: 401 } ); } // Verify password const isValid = await verifyPassword(validated.password, user.passwordHash); if (!isValid) { return NextResponse.json( { error: 'Invalid email or password' }, { status: 401 } ); } // Generate token const token = signToken({ userId: user.id, email: user.email, role: user.role as Role, }); // Set session cookie await setSessionCookie(token); return NextResponse.json({ success: true, user: { id: user.id, email: user.email, firstName: user.firstName, lastName: user.lastName, role: user.role, ghlLocationId: user.ghlLocationId, }, token, }); } catch (error) { if (error instanceof z.ZodError) { return NextResponse.json( { error: 'Validation failed', details: error.issues }, { status: 400 } ); } console.error('Login error:', error); return NextResponse.json( { error: 'Internal server error' }, { status: 500 } ); } }