import { desc } from "drizzle-orm"; import { redirect } from "next/navigation"; import { getTranslations } from "next-intl/server"; import { addBlacklist, addWhitelist, deleteBlacklist, deleteWhitelist, } from "@/actions/admin-ip"; import { StatusCard } from "@/components/admin/dashboard"; import { Button } from "@/components/ui/button"; import { db, WebsiteIpBlacklist, WebsiteIpWhitelist } from "@/lib/db"; import { formatDate } from "@/lib/format-date"; import { canAccess, getAdminContext, PERMS } from "@/lib/permissions"; type IpRow = { id: bigint; ipAddress: string; asn: string | null; createdAt: Date | null; }; export default async function AdminIp() { const { session, permissions } = await getAdminContext(); if (!canAccess(permissions, PERMS.SETTINGS_VIEW, session.user.rank)) { redirect("/admin"); } const t = await getTranslations("pages.admin.ip"); let whitelist: IpRow[] = []; let blacklist: IpRow[] = []; try { whitelist = await db .select() .from(WebsiteIpWhitelist) .orderBy(desc(WebsiteIpWhitelist.id)) .limit(200); } catch { whitelist = []; } try { blacklist = await db .select() .from(WebsiteIpBlacklist) .orderBy(desc(WebsiteIpBlacklist.id)) .limit(200); } catch { blacklist = []; } return (
0 ? "ok" : "neutral"} icon="✅" /> 0 ? "danger" : "neutral"} icon="🚫" />
{/* ── Whitelist ──────────────────── */}

{t("whitelist")}

{whitelist.length === 0 ? (
{t("noWhitelistedIps")}
) : (
{whitelist.map((w) => ( ))}
{t("colIp")} {t("colAsn")} {t("colAdded")}
{w.ipAddress} {w.asn ?? "—"} {formatDate(w.createdAt, "datetime", "—")}
)}
{/* ── Blacklist ──────────────────── */}

{t("blacklist")}

{blacklist.length === 0 ? (
{t("noBlacklistedIps")}
) : (
{blacklist.map((b) => ( ))}
{t("colIp")} {t("colAsn")} {t("colAdded")}
{b.ipAddress} {b.asn ?? "—"} {formatDate(b.createdAt, "datetime", "—")}
)}
); }