export const dynamic = 'force-dynamic' import { NextRequest, NextResponse } from 'next/server' import { asAdmin } from '@/lib/db/with-user' import { users } from '@/lib/db/schema' import { eq } from 'drizzle-orm' import { verifyPassword } from '@/lib/auth/password' import { createSession } from '@/lib/auth/session' export async function POST(req: NextRequest) { const { email, password } = await req.json() if (!email || !password) { return NextResponse.json({ error: 'Email and password required' }, { status: 400 }) } const [user] = await asAdmin(db => db.select({ id: users.id, email: users.email, name: users.name, role: users.role, siteId: users.siteId, passwordHash: users.passwordHash, active: users.active, }).from(users).where(eq(users.email, email.toLowerCase())).limit(1) ) if (!user || !user.active) { return NextResponse.json({ error: 'Invalid credentials' }, { status: 401 }) } if (!user.passwordHash) { return NextResponse.json({ error: 'Account not configured — contact admin' }, { status: 401 }) } const valid = await verifyPassword(password, user.passwordHash) if (!valid) { return NextResponse.json({ error: 'Invalid credentials' }, { status: 401 }) } // Update last_login_at await asAdmin(db => db.update(users).set({ lastLoginAt: new Date() }).where(eq(users.id, user.id))) const token = await createSession({ sub: user.id, role: user.role, siteId: user.siteId ?? null, name: user.name, }) const appUrl = process.env.APP_URL ?? '' const res = NextResponse.json({ ok: true }) res.cookies.set('ims_session', token, { httpOnly: true, secure: appUrl.startsWith('https'), sameSite: 'lax', maxAge: 8 * 60 * 60, path: '/', }) return res }