import NextAuth from "next-auth"; import authConfig from '@/auth.config'; import { PrismaClient } from '@/prisma/generated/client'; import { getUserById, genUsername } from "./helpers/user"; import { Role } from "@/config/enum"; import db from "@/lib/db"; const prisma = new PrismaClient({ log: ["error"], }); export const { auth, handlers, signIn, signOut } = NextAuth({ // adapter: PrismaAdapter(prisma), callbacks: { async signIn({ user, account }) { // Allow OAuth without email verification if (account?.provider !== 'credentials') return true; if (!user.id) throw new Error('User not found'); const existingUser = await getUserById(user.id); if (!existingUser?.emailVerified) return false; return true; }, async session({ token, session }) { // console.log("session", session, "token", token); if (token.sub && session.user) { session.user.id = token.sub; session.user.name = token.name; } if (token.role && session.user) { session.user.role = token.role as Role; } return session; }, async jwt({ token }) { if (!token.sub) return token; const existingUser = await getUserById(token.sub); if (!existingUser) return token; const name = await genUsername( existingUser.givenName, existingUser.familyName ); if (existingUser) { token.role = existingUser.role; } if (token.isNewUser && !existingUser.name) { token.name = name; } else { token.name = existingUser.name; } console.log('token', token); return token; }, }, ...authConfig, secret: process.env.AUTH_SECRET, debug: true, });