import { asc } from "drizzle-orm"; import { redirect } from "next/navigation"; import { getTranslations } from "next-intl/server"; import { StatusCard } from "@/components/admin/dashboard"; import { Achievements, db } from "@/lib/db"; import { canAccess, getAdminContext, PERMS } from "@/lib/permissions"; type Achievement = { name: string; category: string; level: number; rewardAmount: number; rewardType: number; points: number | null; progressNeeded: number; }; export default async function AdminAchievements() { const { session, permissions } = await getAdminContext(); if (!canAccess(permissions, PERMS.CATALOG_VIEW, session.user.rank)) { redirect("/admin"); } const t = await getTranslations("pages.admin.achievements"); let achievements: Achievement[]; try { achievements = await db .select({ name: Achievements.name, category: Achievements.category, level: Achievements.level, rewardAmount: Achievements.rewardAmount, rewardType: Achievements.rewardType, points: Achievements.points, progressNeeded: Achievements.progressNeeded, }) .from(Achievements) .orderBy( asc(Achievements.category), asc(Achievements.name), asc(Achievements.level), ); } catch { achievements = []; } const groups = new Map(); for (const a of achievements) { const list = groups.get(a.category) ?? []; list.push(a); groups.set(a.category, list); } const distinctNames = new Set(achievements.map((a) => a.name)).size; return (
{groups.size === 0 ? (
{t("noAchievements")}
) : ( [...groups.entries()].map(([category, rows]) => (

{category}{" "} {rows.length}

{rows.map((a) => ( ))}
{t("colName")} {t("colLevel")} {t("colProgress")} {t("colRewardType")} {t("colRewardAmount")} {t("colPoints")}
{a.name} {a.level} {a.progressNeeded} {a.rewardType} {a.rewardAmount} {a.points ?? 0}
)) )}
); }