import { minecraftAccounts, users } from "@minecraft-account-manager/database"; import { and, eq, ilike, isNull, or, sql } from "drizzle-orm"; import Link from "next/link"; import { db } from "@/lib/database"; export const dynamic = "force-dynamic"; export default async function AdminUsersPage({ searchParams, }: { searchParams: Promise<{ q?: string; error?: string }>; }) { const query = await searchParams; const search = query.q?.trim().slice(0, 100) ?? ""; const pattern = `%${search}%`; const where = search ? or( ilike(users.firstName, pattern), ilike(users.discordUsername, pattern), ilike(users.discordGlobalName, pattern), eq(users.discordUserId, search), sql`exists ( select 1 from ${minecraftAccounts} where ${minecraftAccounts.userId} = ${users.id} and ${minecraftAccounts.deletedAt} is null and ( ${minecraftAccounts.username} ilike ${pattern} or ${minecraftAccounts.minecraftUuid} = ${search.toLowerCase()} ) )`, ) : undefined; const results = await db .select({ id: users.id, firstName: users.firstName, discordUsername: users.discordUsername, discordGlobalName: users.discordGlobalName, discordUserId: users.discordUserId, onboardingCompletedAt: users.onboardingCompletedAt, primaryUsername: minecraftAccounts.username, accountCount: sql`( select count(*)::int from ${minecraftAccounts} account_count where account_count.user_id = ${users.id} and account_count.deleted_at is null )`, }) .from(users) .leftJoin( minecraftAccounts, and( eq(minecraftAccounts.userId, users.id), eq(minecraftAccounts.isPrimary, true), isNull(minecraftAccounts.deletedAt), ), ) .where(where) .orderBy(users.firstName, users.discordUsername) .limit(100); return (

Identity registry

Users

{query.error &&

The requested user could not be found.

}
{results.map((user) => ( ))} {!results.length && }
Registered portal users
UserDiscordPrimaryAccountsStatus
{user.firstName ?? "Name needed"}
{user.discordGlobalName ?? user.discordUsername}
@{user.discordUsername}
{user.discordUserId}
{user.primaryUsername ?? "—"} {user.accountCount} {user.onboardingCompletedAt ? "Ready" : "Onboarding"}
No users match that search.

Showing up to 100 users

); }