import { NextResponse } from 'next/server'; import { prisma } from '@/lib/db'; import { validateUser } from '@/lib/auth'; import { generateAdminToken } from '@/lib/admin-auth'; import { createUserLoginSchema } from '@/lib/validation'; import { cookies } from 'next/headers'; export const runtime = 'nodejs'; function getErrorMessages() { return { fieldsRequired: 'Email and password are required', invalidCredentials: 'Invalid admin credentials', serverError: 'Server error', invalidInput: 'Invalid input data', accessDenied: 'Access denied - admin privileges required' }; } export async function POST(request: Request) { try { const messages = getErrorMessages(); const body = await request.json(); // Validate input const validation = createUserLoginSchema().safeParse(body); if (!validation.success) { return NextResponse.json( { error: messages.invalidInput }, { status: 400 } ); } const { email, password } = validation.data; // Find user by email const user = await prisma.user.findUnique({ where: { email: email.toLowerCase() } }); if (!user) { return NextResponse.json( { error: messages.invalidCredentials }, { status: 401 } ); } // Check if user has admin/moderator role if (!['admin', 'moderator'].includes(user.role)) { return NextResponse.json( { error: messages.accessDenied }, { status: 403 } ); } // Validate password const isValidPassword = await validateUser(email, password); if (!isValidPassword) { return NextResponse.json( { error: messages.invalidCredentials }, { status: 401 } ); } // Generate admin token const adminToken = generateAdminToken(user); console.log('Generated admin token for user:', user.email); // Update last login await prisma.user.update({ where: { id: user.id }, data: { lastLoginAt: new Date() } }); // Set admin cookie const cookieStore = await cookies(); cookieStore.set('adminToken', adminToken, { httpOnly: true, secure: process.env.NODE_ENV === 'production', sameSite: 'strict', maxAge: 60 * 60 * 8, // 8 hours path: '/' }); console.log('Admin cookie set successfully'); return NextResponse.json({ success: true, user: { id: user.id, email: user.email, name: user.name, role: user.role } }); } catch (error) { console.error('Admin login error:', error); return NextResponse.json( { error: getErrorMessages().serverError }, { status: 500 } ); } }