import { addBlacklist, addWhitelist, deleteBlacklist, deleteWhitelist, } from "@/actions/admin-ip"; import { StatusCard } from "@/components/admin/dashboard"; import { prisma } from "@/lib/prisma"; export const dynamic = "force-dynamic"; type IpRow = { id: bigint; ipAddress: string; asn: string | null; createdAt: Date | null; }; function formatDate(d: Date | null): string { return d ? d.toISOString().slice(0, 16).replace("T", " ") : "—"; } export default async function AdminIp() { let whitelist: IpRow[] = []; let blacklist: IpRow[] = []; try { whitelist = await prisma.websiteIpWhitelist.findMany({ orderBy: { id: "desc" }, take: 200, }); } catch { whitelist = []; } try { blacklist = await prisma.websiteIpBlacklist.findMany({ orderBy: { id: "desc" }, take: 200, }); } catch { blacklist = []; } return (

IP Management

Allow or block IP addresses (and ASNs) at the website edge.

0 ? "ok" : "neutral"} icon="✅" /> 0 ? "danger" : "neutral"} icon="🚫" />
{/* ── Whitelist ──────────────────── */}

Whitelist

{whitelist.length === 0 ? (

No whitelisted IPs.

) : (
{whitelist.map((w) => ( ))}
IP ASN Added
{w.ipAddress} {w.asn ?? "—"} {formatDate(w.createdAt)}
)}
{/* ── Blacklist ──────────────────── */}

Blacklist

{blacklist.length === 0 ? (

No blacklisted IPs.

) : (
{blacklist.map((b) => ( ))}
IP ASN Added
{b.ipAddress} {b.asn ?? "—"} {formatDate(b.createdAt)}
)}
); }