import Link from "next/link"; import { redirect } from "next/navigation"; import { getTranslations } from "next-intl/server"; import { AdminSimplePager } from "@/components/admin/admin-simple-pager"; import { StatusCard } from "@/components/admin/dashboard"; import { calcPagination, parseListParams } from "@/lib/admin-helpers"; import { canAccess, getAdminContext, PERMS } from "@/lib/permissions"; import { prisma } from "@/lib/prisma"; export const dynamic = "force-dynamic"; function fmt(ts: number): string { if (!ts) return "—"; return new Date(ts * 1000).toISOString().slice(0, 10); } export default async function AdminGuildsPage({ searchParams, }: { searchParams: Promise>; }) { const { session, permissions } = await getAdminContext(); if (!canAccess(permissions, PERMS.USERS_VIEW, session.user.rank)) { redirect("/admin"); } const t = await getTranslations("pages.admin.guilds"); const raw = await searchParams; const parsed = parseListParams(new URLSearchParams(raw)); const q = parsed.search.trim(); let total = 0; let rows: Array<{ id: number; name: string; description: string; userId: number; badge: string; dateCreated: number; roomId: number; }> = []; let loadError = false; try { const where = q ? { OR: [ { name: { contains: q } }, { description: { contains: q } }, ...(Number.isFinite(Number(q)) && Number(q) > 0 ? [{ id: Number(q) }] : []), ], } : {}; total = await prisma.guilds.count({ where }); const pagination = calcPagination(total, parsed.page, parsed.perPage); rows = await prisma.guilds.findMany({ where, select: { id: true, name: true, description: true, userId: true, badge: true, dateCreated: true, roomId: true, }, orderBy: { id: "desc" }, skip: pagination.offset, take: pagination.perPage, }); } catch { loadError = true; } const pagination = calcPagination(total, parsed.page, parsed.perPage); const ownerIds = [ ...new Set(rows.map((r) => r.userId).filter((id) => id > 0)), ]; const guildIds = rows.map((r) => r.id); const [owners, memberGroups] = await Promise.all([ ownerIds.length ? prisma.user .findMany({ where: { id: { in: ownerIds } }, select: { id: true, username: true }, }) .catch(() => []) : Promise.resolve([]), guildIds.length ? prisma.guildsMembers .groupBy({ by: ["guildId"], where: { guildId: { in: guildIds } }, _count: { _all: true }, }) .catch(() => []) : Promise.resolve([]), ]); const ownerById = new Map(owners.map((u) => [u.id, u.username])); const membersByGuild = new Map( memberGroups.map((g) => [g.guildId, g._count._all]), ); return (
{loadError ? (
{t("loadError")}
) : null}

{t("title")} ({total})

{rows.length === 0 ? (
{t("empty")}
) : (
{rows.map((g) => ( ))}
{t("colId")} {t("colBadge")} {t("colName")} {t("colOwner")} {t("colMembers")} {t("colCreated")}
{g.id} {g.badge ? ( // eslint-disable-next-line @next/next/no-img-element ) : ( — )} {g.name || `#${g.id}`} {g.description ? (
{g.description}
) : null}
{ownerById.get(g.userId) ?? `#${g.userId}`} {membersByGuild.get(g.id) ?? 0} {fmt(g.dateCreated)}
)}
); }