import { groups, userGroupMemberships, users } from "@minecraft-account-manager/database"; import { asc, eq } from "drizzle-orm"; import Link from "next/link"; import { notFound } from "next/navigation"; import { db } from "@/lib/database"; import { addGroupMember, assignDefaultGroup, deleteGroup, removeGroupMember, setGroupAccess, setGroupAnonymizedNetworkAccess } from "../actions"; const savedMessages: Record = { created: "Group created with access disabled.", access: "Group access policy updated.", "network-access": "Group VPN, proxy, and Tor policy updated.", "member-added": "User assigned to the group.", "member-removed": "User returned to the default group.", }; export const dynamic = "force-dynamic"; export default async function GroupPage({ params, searchParams, }: { params: Promise<{ groupId: string }>; searchParams: Promise<{ saved?: string }>; }) { const { groupId } = await params; const query = await searchParams; const [group] = await db.select().from(groups).where(eq(groups.id, groupId)).limit(1); if (!group) notFound(); const [allUsers, memberships] = await Promise.all([ db.select({ id: users.id, firstName: users.firstName, discordUsername: users.discordUsername, discordGlobalName: users.discordGlobalName, discordUserId: users.discordUserId, }).from(users).orderBy(asc(users.discordUsername)), db.select({ userId: userGroupMemberships.userId, groupId: userGroupMemberships.groupId, groupName: groups.name, }).from(userGroupMemberships).innerJoin(groups, eq(groups.id, userGroupMemberships.groupId)), ]); const assignmentByUser = new Map(memberships.map((membership) => [membership.userId, membership])); const memberCount = group.isDefault ? allUsers.length - assignmentByUser.size : memberships.filter((membership) => membership.groupId === group.id).length; return (
← All groups

Access group

{group.name}

{group.isDefault && Default}

{group.description ?? "No description."}

Minecraft admission

{group.accessEnabled ? "Allowed" : "Denied"}

VPN / proxy / Tor

{group.anonymizedNetworksAllowed ? "Allowed" : "Denied"}

{query.saved &&

{savedMessages[query.saved] ?? "Group updated."}

}

Membership

Registered users

{memberCount} members
{group.isDefault &&

Users belong to everyone only while they have no explicit group assignment.

}
{allUsers.map((user) => { const assignment = assignmentByUser.get(user.id); const isMember = group.isDefault ? !assignment : assignment?.groupId === group.id; return (
{user.firstName ?? user.discordGlobalName ?? user.discordUsername}

@{user.discordUsername} · {user.discordUserId}

{!isMember && assignment &&

Currently assigned to {assignment.groupName}

}
{isMember ? ( group.isDefault ? Default assignment : (
) ) : (
)}
); })} {!allUsers.length &&

No registered users yet.

}
{!group.isDefault && (

Danger zone

Delete {group.name}

Deleting this group returns its {memberCount} {memberCount === 1 ? "member" : "members"} to the protected default group. This cannot be undone.

Review deletion
Members will use everyone immediately.
)}
); }