- /setup fuehrt beim ersten Aufruf durch das Anlegen des Administratorkontos und die Wahl der Betriebsart. Der Endpunkt funktioniert nur, solange es keinen Benutzer gibt; danach kann sich niemand mehr nachtraeglich ein Adminkonto erschleichen. Vorhandene Projekte ohne Besitzer werden dabei uebernommen und im Formular vorher angekuendigt. - /login mit Passwort oder Passkey. Der Passkey-Knopf entfaellt, wenn APP_URL keinen sicheren Kontext ergibt - mit Hinweis, woran es liegt. Das Ziel nach der Anmeldung wird auf relative Pfade begrenzt, sonst waere der weiter-Parameter ein offener Redirect. - /register nur im Mehrbenutzerbetrieb und nur, wenn ein Administrator die Selbstregistrierung freigegeben hat. - Kopfzeile mit Benutzermenue: eigenes Konto, Admin-Einstellungen, Abmelden. Ohne Anmeldung bleibt sie auf das Logo reduziert. - Layout liest Titel und Namen ueber generateMetadata, damit APP_NAME zur Laufzeit greift statt beim Build eingefroren zu werden. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
45 lines
1.4 KiB
TypeScript
45 lines
1.4 KiB
TypeScript
import type { Metadata } from "next";
|
|
import { redirect } from "next/navigation";
|
|
import { AuthShell } from "@/components/auth/AuthShell";
|
|
import { SetupForm } from "@/components/auth/SetupForm";
|
|
import { getInstanceState } from "@/lib/auth/settings";
|
|
import { APP_NAME } from "@/lib/config";
|
|
import { prisma } from "@/lib/db";
|
|
|
|
export const dynamic = "force-dynamic";
|
|
|
|
export async function generateMetadata(): Promise<Metadata> {
|
|
return { title: "Einrichtung" };
|
|
}
|
|
|
|
export default async function SetupPage() {
|
|
const state = await getInstanceState();
|
|
|
|
// Nach der Einrichtung ist diese Seite verschlossen.
|
|
if (!state.needsSetup) redirect("/login");
|
|
|
|
// Bestandsdaten anzeigen, damit klar ist, was das neue Konto uebernimmt.
|
|
const [orphanProjects, orphanConnections] = await Promise.all([
|
|
prisma.project.count({ where: { ownerId: null } }),
|
|
prisma.gitConnection.count({ where: { ownerId: null } }),
|
|
]);
|
|
|
|
return (
|
|
<AuthShell
|
|
appName={APP_NAME}
|
|
title="Erste Einrichtung"
|
|
subtitle="Lege das Administratorkonto an. Danach ist diese Seite gesperrt."
|
|
footer={
|
|
orphanProjects + orphanConnections > 0 ? (
|
|
<>
|
|
{orphanProjects} vorhandene Projekte und {orphanConnections} Git-Verbindungen
|
|
werden diesem Konto zugeordnet.
|
|
</>
|
|
) : null
|
|
}
|
|
>
|
|
<SetupForm />
|
|
</AuthShell>
|
|
);
|
|
}
|