import type { ReactNode } from "react"; import Link from "next/link"; import { redirect } from "next/navigation"; import { getClientIp } from "@minecraft-account-manager/network"; import { recordEvent } from "@minecraft-account-manager/database"; import { headers } from "next/headers"; import { getServerSession } from "next-auth"; import { AdminSignOutButton } from "@/components/admin-sign-out-button"; import { adminAuthOptions, requiredAdminRole } from "@/lib/auth/admin-auth"; import { db } from "@/lib/database"; export const dynamic = "force-dynamic"; export default async function AdminConsoleLayout({ children }: { children: ReactNode }) { const session = await getServerSession(adminAuthOptions); if (!session) redirect("/admin/login"); const roles = (session.user as typeof session.user & { roles?: string[] })?.roles ?? []; if (!roles.includes(requiredAdminRole)) redirect("/admin/login?error=forbidden"); const requestHeaders = await headers(); const ipAddress = getClientIp(requestHeaders, process.env.TRUST_PROXY === "true"); await recordEvent(db, { type: "games.minecraft.account-manager.ui.accessed", source: "/web/admin", subject: "admin-console", ipAddress: ipAddress ?? undefined, data: { adminEmail: session.user?.email ?? null }, }); return (
SoMC Portal / Ops
{children}
); }