import { sql } from "drizzle-orm"; import { redirect } from "next/navigation"; import { getTranslations } from "next-intl/server"; import Link from "@/components/link"; import { isDynamicSuperAdmin } from "@/lib/admin/authorization-policy"; import { previewRoleAccess } from "@/lib/admin/permission-preview"; import { queryRows } from "@/lib/db"; import { canAccess, getAdminContext, PERMS } from "@/lib/permissions"; export default async function PermissionPreview({ searchParams, }: { searchParams: Promise<{ role?: string }>; }) { const { session, permissions } = await getAdminContext(); if (!canAccess(permissions, PERMS.PERMISSIONS_MANAGE, session.user.rank)) redirect("/admin"); const t = await getTranslations("pages.admin.permissionPreview"); const nav = await getTranslations("pages.admin.nav"); const roles = await queryRows<{ id: number; slug: string; title: string; }>(sql`SELECT id, slug, title FROM acl_roles ORDER BY title, id`); const params = await searchParams; const selected = roles.find((r) => String(r.id) === params.role) ?? (params.role ? undefined : roles[0]); let preview: ReturnType | undefined; let superAdmin = false; let permissionTitles: Record = {}; if (selected) { const grants = await queryRows<{ slug: string; title: string }>( sql`SELECT p.slug, p.title FROM acl_model_permissions mp JOIN acl_permissions p ON p.id = mp.permission_id WHERE mp.model_type = 'Role' AND mp.model_id = ${selected.id}`, ); const highest = ( await queryRows<{ highest_rank: number | null }>( sql`SELECT COALESCE((SELECT MAX(u.\`rank\`) FROM users u INNER JOIN permission_ranks pr ON pr.id = u.\`rank\`), (SELECT MAX(id) FROM permission_ranks)) AS highest_rank`, ) )[0]?.highest_rank; const rankMatch = /^rank_([1-9]\d*)$/.exec(selected.slug); superAdmin = !!rankMatch && isDynamicSuperAdmin( Number(rankMatch[1]), highest == null ? null : Number(highest), ); preview = previewRoleAccess( grants.map((g) => g.slug), superAdmin, ); const allRows = await queryRows<{ slug: string; title: string }>( sql`SELECT slug, title FROM acl_permissions ORDER BY slug`, ); permissionTitles = Object.fromEntries( allRows.map((p) => [p.slug, p.title]), ); } return (

{t("title")}

{t("description")}

{t("back")}
{!preview ? (

{t("missing")}

) : ( <>

{t(preview.canEnter ? "entryAllowed" : "entryDenied")}

{superAdmin &&

{t("superAdmin")}

}

{t("scope")}

{t("sections")}

{preview.sections.map((item) => (
{nav(item.labelKey)} {t(item.allowed ? "allowed" : "denied")}

{item.href}

))}
{t("actions")}

{t("actionScope")}

    {preview.actions.map((item) => (
  • {permissionTitles[item.slug] || item.slug}

    {item.slug}
    {t(item.granted ? "granted" : "notGranted")}
  • ))}
)}
); }