import { DrizzleAdapter } from "@auth/drizzle-adapter"; import NextAuth, { type DefaultSession } from "next-auth"; import { db } from "@/lib/db"; import { accounts, sessions, users, verificationTokens } from "@/modules/_core/schema"; declare module "next-auth" { interface Session { user: { id: string } & DefaultSession["user"]; } } export const { handlers, auth, signIn, signOut } = NextAuth({ adapter: DrizzleAdapter(db, { usersTable: users, accountsTable: accounts, sessionsTable: sessions, verificationTokensTable: verificationTokens, }), session: { strategy: "database" }, providers: [ { id: "authentik", name: "Authentik", type: "oidc", issuer: process.env.AUTH_OIDC_ISSUER, clientId: process.env.AUTH_OIDC_CLIENT_ID, clientSecret: process.env.AUTH_OIDC_CLIENT_SECRET, }, ], pages: { signIn: "/login", }, callbacks: { session({ session, user }) { session.user.id = user.id; return session; }, authorized({ auth: session, request: { nextUrl } }) { const isLoggedIn = !!session?.user; const { pathname } = nextUrl; if ( pathname.startsWith("/s/") || pathname.startsWith("/api/auth/") || pathname === "/login" ) { return true; } return isLoggedIn; }, }, }); export async function getCurrentUser() { const session = await auth(); if (!session?.user?.id) return null; const user = await db.query.users.findFirst({ where: (u, { eq }) => eq(u.id, session.user.id), }); return user ?? null; }