import { NextAuthOptions } from 'next-auth'; import CredentialsProvider from 'next-auth/providers/credentials'; import { DrizzleAdapter } from '@auth/drizzle-adapter'; import { db } from './db'; import { users } from './db/schema'; import { eq } from 'drizzle-orm'; import bcrypt from 'bcryptjs'; import type { Adapter } from 'next-auth/adapters'; export const authOptions: NextAuthOptions = { adapter: DrizzleAdapter(db) as Adapter, providers: [ CredentialsProvider({ name: 'credentials', credentials: { email: { label: 'Email', type: 'email' }, password: { label: 'Password', type: 'password' }, }, async authorize(credentials: Record | undefined) { if (!credentials?.email || !credentials?.password) { return null; } try { const user = await db .select() .from(users) .where(eq(users.email, credentials.email)) .limit(1); if (!user[0] || !user[0].isActive) { return null; } const isPasswordValid = await bcrypt.compare( credentials.password, user[0].password ); if (!isPasswordValid) { return null; } return { id: user[0].id, email: user[0].email, name: `${user[0].firstName} ${user[0].lastName}`, role: user[0].role, }; } catch (error) { console.error('Auth error:', error); return null; } }, }), ], session: { strategy: 'jwt', }, callbacks: { async jwt({ token, user }) { if (user) { token.role = user.role; } return token; }, async session({ session, token }) { if (token) { session.user.id = token.sub!; session.user.role = token.role as string; } return session; }, }, pages: { signIn: '/auth/signin', }, };