TypeScript 97.4%
SQL 1%
JavaScript 0.9%
CSS 0.6%
1import "server-only";2import { headers } from "next/headers";3import { redirect } from "next/navigation";4import { auth, type AuthUser } from "@/lib/auth";5import { isAdminEmail } from "@/lib/env";67export async function getSession() {8 return auth.api.getSession({ headers: await headers() });9}1011/** Server components / actions: redirect to login when not authenticated or unverified. */12export async function requireUser(): Promise<AuthUser> {13 const session = await getSession();14 // ?expired=1 lets the proxy clear a stale cookie instead of redirecting straight back to /app.15 if (!session) redirect("/login?expired=1");16 if (!session.user.emailVerified) redirect("/verify-email");17 return session.user;18}1920/** Route handlers: return the user or null (no redirect). */21export async function getUserFromRequest(req: Request): Promise<AuthUser | null> {22 const session = await auth.api.getSession({ headers: req.headers });23 if (!session || !session.user.emailVerified) return null;24 return session.user;25}2627export function isAdmin(user: { email: string; role?: string | null }): boolean {28 return user.role === "admin" || isAdminEmail(user.email);29}3031export async function requireAdmin(): Promise<AuthUser> {32 const user = await requireUser();33 if (!isAdmin(user)) redirect("/app");34 return user;35}36