import { AuthOptions, getServerSession as getNextAuthServerSession, } from 'next-auth'; import { PrismaAdapter } from '@next-auth/prisma-adapter'; import Credentials from 'next-auth/providers/credentials'; import { PrismaClient } from '@repo/db'; const prisma = new PrismaClient(); export const options: AuthOptions = { providers: [ Credentials({ credentials: { code: { label: 'code', type: 'code' }, }, async authorize(credentials, req) { try { if (!credentials) throw new Error('No credentials provided'); const code = await prisma.oAuthToken.findFirstOrThrow({ where: { accessToken: credentials.code, }, }); const user = await prisma.user.findFirstOrThrow({ where: { id: code.userId, }, }); if (!user) return null; return user; } catch (error) { return null; } }, }), ], secret: process.env.NEXTAUTH_SECRET, session: { strategy: 'jwt', maxAge: 30 * 24 * 60 * 60, }, adapter: PrismaAdapter(prisma as any), callbacks: { jwt: async ({ token, user }) => { if (user && 'firstname' in user) { return { ...token, ...user, }; } return token; }, session: async ({ session, user, token }) => { return { ...session, user: token, }; }, }, pages: { signIn: '/login', signOut: '/logout', error: '/authError', }, } satisfies AuthOptions; export const getServerSession = async () => getNextAuthServerSession(options);