import Link from "next/link"; import { notFound, redirect } from "next/navigation"; import { getTranslations } from "next-intl/server"; import { disbandGuild } from "@/actions/admin-guilds"; import { Button } from "@/components/ui/button"; import { formatDate } from "@/lib/format-date"; import { canAccess, getAdminContext, PERMS } from "@/lib/permissions"; import { prisma } from "@/lib/prisma"; export default async function AdminGuildDetailPage({ params, }: { params: Promise<{ id: string }>; }) { const { session, permissions } = await getAdminContext(); if (!canAccess(permissions, PERMS.USERS_VIEW, session.user.rank)) { redirect("/admin"); } const canEdit = canAccess(permissions, PERMS.USERS_EDIT, session.user.rank); const t = await getTranslations("pages.admin.guilds"); const { id: rawId } = await params; const id = Number(rawId); if (!Number.isFinite(id) || id <= 0) notFound(); const guild = await prisma.guilds.findUnique({ where: { id }, select: { id: true, name: true, description: true, userId: true, roomId: true, badge: true, dateCreated: true, state: true, forum: true, }, }); if (!guild) notFound(); const [owner, members, memberCount, threadCount] = await Promise.all([ prisma.user .findUnique({ where: { id: guild.userId }, select: { id: true, username: true }, }) .catch(() => null), prisma.guildsMembers .findMany({ where: { guildId: id }, orderBy: [{ levelId: "asc" }, { memberSince: "asc" }], take: 100, select: { userId: true, levelId: true, memberSince: true }, }) .catch(() => []), prisma.guildsMembers.count({ where: { guildId: id } }).catch(() => 0), prisma.guildsForumsThreads.count({ where: { guildId: id } }).catch(() => 0), ]); const memberUserIds = members.map((m) => m.userId).filter((uid) => uid > 0); const memberUsers = memberUserIds.length > 0 ? await prisma.user .findMany({ where: { id: { in: memberUserIds } }, select: { id: true, username: true }, }) .catch(() => []) : []; const usernameById = new Map(memberUsers.map((u) => [u.id, u.username])); return (
{guild.badge ? ( // eslint-disable-next-line @next/next/no-img-element ) : null}

{guild.name || `#${guild.id}`}

#{guild.id}

{canEdit ? (
) : null}
{guild.description ? (

{guild.description}

) : null}
{t("colOwner")}
{owner ? ( {owner.username} ) : ( `#${guild.userId}` )}
{t("colMembers")}
{memberCount}
{t("colThreads")}
{threadCount}
{t("colCreated")}
{formatDate(new Date(guild.dateCreated * 1000))}
{t("colRoom")}
{guild.roomId > 0 ? ( #{guild.roomId} ) : ( "—" )}

{t("members")} ({Math.min(members.length, memberCount)})

{members.length === 0 ? (
{t("noMembers")}
) : (
{members.map((m) => ( ))}
{t("colUser")} {t("colLevel")} {t("colJoined")}
{usernameById.get(m.userId) ?? `#${m.userId}`} {m.levelId} {formatDate(new Date(m.memberSince * 1000))}
)}
); }