import { redirect } from "next/navigation"; import { aktuelleSitzung } from "@/lib/auth"; import { fuerOrganisation } from "@/lib/db"; import { env } from "@/lib/env"; import { AUSWEIS_GUELTIG_SEKUNDEN, ausweisErzeugen } from "@/lib/dienstausweis"; import { qrTextAlsDataUri } from "@/lib/stammdaten/qr"; import { dienstgradText } from "@/lib/stammdaten/texte"; import { AusweisAnzeige } from "@/app/(app)/ausweis/anzeige"; export const metadata = { title: "Dienstausweis" }; export const dynamic = "force-dynamic"; /** * Der digitale Dienstausweis. * * Was ein Ausweis aus Karton kann, kann diese Seite auch: vorzeigen, wer man * ist und zu welcher Wehr man gehört. Der Unterschied ist, dass der Prüfende * den Code scannt und die Angaben von FLORIAN bestätigt bekommt statt von * einem laminierten Stück Papier. * * Der Code wird auf dem Server signiert — mit AUTH_SECRET, das im Browser * nichts zu suchen hat — und gilt fünf Minuten. */ export default async function AusweisSeite() { const sitzung = await aktuelleSitzung(); if (!sitzung) redirect("/anmelden"); const daten = await fuerOrganisation(sitzung.organisationId, async (db) => { const person = await db.person.findUnique({ where: { id: sitzung.personId }, select: { vorname: true, nachname: true, dienstgrad: true, eintrittsdatum: true, organisation: { select: { name: true, kurzname: true } }, qualifikationen: { where: { geloeschtAm: null, OR: [{ gueltigBis: null }, { gueltigBis: { gte: new Date() } }], }, orderBy: { erworbenAm: "desc" }, select: { gueltigBis: true, typ: { select: { name: true, kuerzel: true } } }, }, }, }); return person; }); const code = ausweisErzeugen(sitzung.personId, sitzung.organisationId); const adresse = `${env.APP_URL.replace(/\/+$/, "")}/ausweis/${encodeURIComponent(code)}`; const bild = await qrTextAlsDataUri(adresse, 420); return ( ({ name: eintrag.typ.name, kuerzel: eintrag.typ.kuerzel, gueltigBis: eintrag.gueltigBis, })) ?? []} gueltigSekunden={AUSWEIS_GUELTIG_SEKUNDEN} /> ); }