import { desc, inArray } from "drizzle-orm"; import { redirect } from "next/navigation"; import { getTranslations } from "next-intl/server"; import { dismissApplication } from "@/actions/admin-applications"; import { StatusCard } from "@/components/admin/dashboard"; import Link from "@/components/link"; import { Button } from "@/components/ui/button"; import { db, User, WebsiteStaffApplications } from "@/lib/db"; import { formatDate } from "@/lib/format-date"; import { canAccess, getAdminContext, PERMS } from "@/lib/permissions"; type ApplicationRow = { id: bigint; userId: number; rankId: number; content: string; createdAt: Date | null; }; export default async function AdminApplications() { const { session, permissions } = await getAdminContext(); if (!canAccess(permissions, PERMS.USERS_VIEW, session.user.rank)) { redirect("/admin"); } const t = await getTranslations("pages.admin.applications"); let applications: ApplicationRow[]; try { applications = await db .select() .from(WebsiteStaffApplications) .orderBy(desc(WebsiteStaffApplications.createdAt)) .limit(100); } catch { applications = []; } // Resolve applicant usernames (no relation defined on the model). const userMap = new Map(); if (applications.length > 0) { try { const ids = Array.from(new Set(applications.map((a) => a.userId))); const users = await db .select({ id: User.id, username: User.username }) .from(User) .where(inArray(User.id, ids)); for (const u of users) userMap.set(u.id, u.username); } catch { // no DB — fall back to raw ids } } return (
0 ? "warn" : "ok"} icon="📨" />

{t("applicationsTitle", { count: applications.length })}

{applications.length === 0 ? (
{t("noApplications")}
) : (
{applications.map((a) => { const username = userMap.get(a.userId); return (

{username ? ( {username} ) : ( t("userNumber", { id: a.userId }) )}

{t("rankLabel", { rank: a.rankId })}

{formatDate(a.createdAt, "datetime", "—")}

{a.content}

); })}
)}
); }