import { redirect } from "next/navigation"; import { headers } from "next/headers"; import { auth } from "@/lib/auth/server"; import { db, users, eq } from "@epicure/db"; export type StaffRole = "admin" | "moderator"; /** Server-component equivalent of requireAdmin/lib/api-auth.ts — used by * admin/layout.tsx to gate entry to the whole /admin tree (admin AND * moderator both pass) and by individual page components that need to * additionally restrict themselves to admin only. Always re-queries the * role fresh, same reasoning as requireAdmin: session.user.role comes from * a 5-minute cookieCache. */ export async function getStaffRole(): Promise { const session = await auth.api.getSession({ headers: await headers() }); if (!session) return null; const [dbUser] = await db.select({ role: users.role }).from(users).where(eq(users.id, session.user.id)).limit(1); if (dbUser?.role === "admin" || dbUser?.role === "moderator") return dbUser.role; return null; } /** Redirects moderators to /admin/reports (their only allowed landing area) * and non-staff to /recipes. Call at the top of any admin page that should * stay admin-only. */ export async function requireFullAdminPage(): Promise { const role = await getStaffRole(); if (role === "moderator") redirect("/admin/reports"); if (role !== "admin") redirect("/recipes"); }