import type { Metadata } from 'next' import { db } from '@/lib/db' import { requirePermission } from '@/lib/auth/current' import { de } from '@/lib/i18n/de' import { RoleRow } from './RoleRow' import { ClearancePreview } from './ClearancePreview' export const metadata: Metadata = { title: de.roleAdmin.heading } export const dynamic = 'force-dynamic' /** * Reihenfolge der Abschnitte: erst die Ränge, dann die Zugehörigkeit, dann die * Zugangsrollen - so, wie die Abteilung sie selbst aufzählt. Innerhalb eines * Abschnitts entscheidet die Position der Rolle auf dem Discord-Server, oben * die höchste. Damit steht die Hierarchie an einer Stelle, die ohnehin gepflegt * wird, statt in einer zweiten Sortierung in dieser Anwendung. */ const ORDER = ['RANK', 'MEMBERSHIP', 'CLEARANCE', 'UNSORTED'] as const export default async function RoleAdminPage() { // Ohne roles.manage gibt es 404, nicht 403. await requirePermission('roles.manage') const [mappings, levels] = await Promise.all([ db.roleMapping.findMany({ orderBy: [{ sortOrder: 'desc' }, { label: 'asc' }] }), db.clearanceLevelConfig.findMany({ orderBy: { level: 'asc' } }), ]) return (

{de.roleAdmin.heading}

{de.roleAdmin.intro}

{mappings.length === 0 ? (

{de.roleAdmin.empty}

) : ( <> ({ label: m.label, clearanceLevel: m.clearanceLevel, }))} /> {ORDER.map((category) => { const rows = mappings.filter((m) => m.category === category) if (rows.length === 0) return null return (

{de.roleAdmin.categories[category]}

{rows.map((role) => ( ({ level: l.level, name: l.name }))} /> ))}
) })} )}
) }