import 'server-only'; import type {NextAuthOptions} from "next-auth"; import {getServerSession} from "next-auth"; import {PrismaAdapter} from "@auth/prisma-adapter"; import {prisma} from "@/lib/server/prisma"; import GoogleProvider from "next-auth/providers/google"; import CredentialsProvider from "next-auth/providers/credentials"; import bcrypt from "bcryptjs"; export const authOptions: NextAuthOptions = { adapter: PrismaAdapter(prisma), session: { strategy: "jwt", }, providers: [ GoogleProvider({ clientId: process.env.GOOGLE_CLIENT_ID!, clientSecret: process.env.GOOGLE_CLIENT_SECRET!, }), CredentialsProvider({ name: "credentials", credentials: { email: {label: "Email", type: "email"}, password: {label: "Password", type: "password"}, }, async authorize(credentials) { if (!credentials?.email || !credentials?.password) { throw new Error("Email and password are required"); } const user = await prisma.user.findUnique({ where: {email: credentials.email}, }); if (!user || !user.password) { throw new Error("Invalid email or password"); } const isCorrectPassword = await bcrypt.compare( credentials.password, user.password ); if (!isCorrectPassword) { throw new Error("Invalid email or password"); } return { id: user.id, email: user.email, name: user.name, image: user.image, }; }, }), ], pages: { signIn: "/login", error: "/login", }, callbacks: { async jwt({token, user}) { if (user) { token.id = user.id; token.email = user.email; token.name = user.name; token.picture = user.image; } return token; }, async session({session, token}) { if (token && session.user) { session.user.id = token.id as string; session.user.name = token.name as string; session.user.email = token.email as string; session.user.image = token.picture as string; } return session; }, async redirect({url, baseUrl}) { if (url.startsWith("/")) return `${baseUrl}${url}`; else if (new URL(url).origin === baseUrl) return url; return baseUrl; }, }, secret: process.env.NEXTAUTH_SECRET, debug: process.env.NODE_ENV === "development", } satisfies NextAuthOptions; export const getSession = () => getServerSession(authOptions);