import { AppShell } from "@/components/app-shell"; import { Avatar } from "@/components/avatar"; import { StatusBadge } from "@/components/status-badge"; import { SYSTEM_PERMISSIONS } from "@/lib/access"; import { prisma } from "@/lib/prisma"; import { requireCurrentUser, userIsAdmin } from "@/lib/session"; import { requireInitialSetup } from "@/lib/setup"; import Link from "next/link"; import { redirect } from "next/navigation"; export default async function AdminPage() { await requireInitialSetup(); const user = await requireCurrentUser(); if (!userIsAdmin(user)) { redirect("/dashboard"); } const [personalRoom, users, rooms, roles] = await Promise.all([ prisma.room.findFirst({ where: { ownerId: user.id }, select: { slug: true } }), prisma.user.findMany({ include: { roles: { include: { role: true } }, _count: { select: { ownedRooms: true, roomMembers: true } } }, orderBy: { createdAt: "asc" } }), prisma.room.findMany({ include: { owner: true, _count: { select: { members: true, mediaSources: true } } }, orderBy: { updatedAt: "desc" } }), prisma.role.findMany({ include: { _count: { select: { users: true, permissions: true } } }, orderBy: { name: "asc" } }) ]); return (

Admin

Manage roles, rooms, permissions, and users.

Admin

Rooms

{rooms.length} total
{rooms.map((room) => ( ))}
Name Owner Access Status
{room.name} {room.owner?.displayName || room.owner?.username || "Unassigned"} {room.visibility} {room._count.members + 1} users / {room._count.mediaSources} media

Users

{users.length} accounts
{users.map((account) => (
{account.displayName || account.username} @{account.username} ยท {account._count.ownedRooms + account._count.roomMembers} rooms
{account.roles.map((userRole) => ( {userRole.role.name} ))} {account.roles.length === 0 ? user : null}
))}

Roles

{roles.length} defined
{roles.map((role) => (
{role.name} {role.description || `${role.scope.toLowerCase()} role`}
{role._count.users} users / {role._count.permissions} permissions
))}

Permissions

System
{SYSTEM_PERMISSIONS.map((permission) => (
{permission} Assignable to roles
Enabled
))}
); }