import Link from "next/link"; import { ContentHeader } from "@/components/layout/ContentHeader"; import { TokenFormular } from "@/components/tokens/TokenFormular"; import { Badge } from "@/components/ui/Badges"; import { Card } from "@/components/ui/Card"; import { formatDatum, formatDatumZeit } from "@/lib/format"; import { prisma } from "@/lib/db"; import { enrollmentTokenWiderrufen, hostTokenWiderrufen } from "@/server/actions/tokens"; export const metadata = { title: "Agent-Tokens" }; export default async function TokensSeite() { const dashboardUrl = (process.env.APP_URL ?? "https://dashboard.example.de").replace(/\/$/, ""); const [kunden, enrollmentTokens, hostTokens] = await Promise.all([ prisma.kunde.findMany({ orderBy: { name: "asc" }, select: { id: true, name: true } }), prisma.enrollmentToken.findMany({ orderBy: { erstelltAm: "desc" }, include: { kunde: { select: { name: true } } }, }), prisma.agentToken.findMany({ orderBy: { erstelltAm: "desc" }, include: { host: { select: { id: true, hostname: true } } }, }), ]); const jetzt = new Date(); function zustand(token: { widerrufenAm: Date | null; gueltigBis: Date | null; maxNutzungen: number | null; nutzungen: number; }) { if (token.widerrufenAm) return { text: "Widerrufen", farbe: "neutral" as const }; if (token.gueltigBis && token.gueltigBis < jetzt) return { text: "Abgelaufen", farbe: "danger" as const }; if (token.maxNutzungen !== null && token.nutzungen >= token.maxNutzungen) return { text: "Aufgebraucht", farbe: "warning" as const }; return { text: "Gültig", farbe: "success" as const }; } return ( <>

Mit einem Enrollment-Token registriert sich ein Agent einmalig und erhält dabei seinen eigenen Host-Token. Ist ein Kunde hinterlegt, sind neue Hosts sofort zugeordnet und tauchen nicht unter{" "} Nicht zugeordnet auf.

{enrollmentTokens.map((token) => { const status = zustand(token); return ( ); })} {enrollmentTokens.length === 0 ? ( ) : null}
Bezeichnung Anfang Kunde Gültig bis Nutzungen Zustand Aktion
{token.bezeichnung ?? "–"} {token.praefix}… {token.kunde?.name ?? "–"} {formatDatum(token.gueltigBis)} {token.nutzungen} {token.maxNutzungen !== null ? ` / ${token.maxNutzungen}` : ""} {status.text} {token.widerrufenAm ? null : (
)}
Noch kein Enrollment-Token erzeugt.
{hostTokens.map((token) => ( ))} {hostTokens.length === 0 ? ( ) : null}
Host Anfang Erstellt Zuletzt benutzt Zustand Aktion
{token.host.hostname} {token.praefix}… {formatDatum(token.erstelltAm)} {formatDatumZeit(token.letzteNutzungAm)} {token.widerrufenAm ? ( Widerrufen ) : ( Aktiv )} {token.widerrufenAm ? null : (
)}
Noch kein Host registriert.
); }