| 1 | import { env } from "@/env"; |
| 2 | import { db } from "@/server/db"; |
| 3 | import { PrismaAdapter } from "@auth/prisma-adapter"; |
| 4 | import NextAuth, { type DefaultSession, type Session } from "next-auth"; |
| 5 | import { type Adapter } from "next-auth/adapters"; |
| 6 | import GoogleProvider from "next-auth/providers/google"; |
| 7 | declare module "next-auth" { |
| 8 | interface Session extends DefaultSession { |
| 9 | user: { |
| 10 | id: string; |
| 11 | hasAccess: boolean; |
| 12 | location?: string; |
| 13 | role: string; |
| 14 | isAdmin: boolean; |
| 15 | } & DefaultSession["user"]; |
| 16 | } |
| 17 | |
| 18 | interface User { |
| 19 | hasAccess: boolean; |
| 20 | role: string; |
| 21 | } |
| 22 | } |
| 23 | |
| 24 | export const { auth, handlers, signIn, signOut } = NextAuth({ |
| 25 | trustHost: true, |
| 26 | session: { |
| 27 | strategy: "jwt", |
| 28 | }, |
| 29 | callbacks: { |
| 30 | async jwt({ token, user, trigger, session }) { |
| 31 | if (user) { |
| 32 | token.id = user.id; |
| 33 | token.hasAccess = user.hasAccess; |
| 34 | token.name = user.name; |
| 35 | token.image = user.image; |
| 36 | token.picture = user.image; |
| 37 | token.location = (user as Session["user"]).location; |
| 38 | token.role = user.role; |
| 39 | token.isAdmin = user.role === "ADMIN"; |
| 40 | } |
| 41 | |
| 42 | // Handle updates |
| 43 | if (trigger === "update" && (session as Session)?.user) { |
| 44 | const user = await db.user.findUnique({ |
| 45 | where: { id: token.id as string }, |
| 46 | }); |
| 47 | console.log("Session", session, user); |
| 48 | if (session) { |
| 49 | token.name = (session as Session).user.name; |
| 50 | token.image = (session as Session).user.image; |
| 51 | token.picture = (session as Session).user.image; |
| 52 | token.location = (session as Session).user.location; |
| 53 | token.role = (session as Session).user.role; |
| 54 | token.isAdmin = (session as Session).user.role === "ADMIN"; |
| 55 | } |
| 56 | if (user) { |
| 57 | token.hasAccess = user?.hasAccess ?? false; |
| 58 | token.role = user.role; |
| 59 | token.isAdmin = user.role === "ADMIN"; |
| 60 | } |
| 61 | } |
| 62 | |
| 63 | return token; |
| 64 | }, |
| 65 | async session({ session, token }) { |
| 66 | session.user.id = token.id as string; |
| 67 | session.user.hasAccess = token.hasAccess as boolean; |
| 68 | session.user.location = token.location as string; |
| 69 | session.user.role = token.role as string; |
| 70 | session.user.isAdmin = token.role === "ADMIN"; |
| 71 | return session; |
| 72 | }, |
| 73 | async signIn({ user, account }) { |
| 74 | if (account?.provider === "google") { |
| 75 | const dbUser = await db.user.findUnique({ |
| 76 | where: { email: user.email! }, |
| 77 | select: { id: true, hasAccess: true, role: true }, |
| 78 | }); |
| 79 | |
| 80 | if (dbUser) { |
| 81 | user.hasAccess = dbUser.hasAccess; |
| 82 | user.role = dbUser.role; |
| 83 | } else { |
| 84 | user.hasAccess = false; |
| 85 | user.role = "USER"; |
| 86 | } |
| 87 | } |
| 88 | |
| 89 | return true; |
| 90 | }, |
| 91 | }, |
| 92 | |
| 93 | adapter: PrismaAdapter(db) as Adapter, |
| 94 | providers: [ |
| 95 | GoogleProvider({ |
| 96 | clientId: env.GOOGLE_CLIENT_ID, |
| 97 | clientSecret: env.GOOGLE_CLIENT_SECRET, |
| 98 | }), |
| 99 | ], |
| 100 | }); |
| 101 |