Add non-destructive dev seed on startup

This commit is contained in:
t.indorf
2026-05-06 22:31:07 +02:00
parent 9f452fccac
commit b686e714ff
77 changed files with 10862 additions and 87 deletions
+63
View File
@@ -0,0 +1,63 @@
"use server";
import { AuthError } from "next-auth";
import { z } from "zod";
import { signIn } from "@/auth";
// =====================================================================
// /login · Server Action
// ---------------------------------------------------------------------
// Wir kapseln `signIn("credentials", …)` damit:
// • das Formular `useActionState` mit typisiertem Fehler-State nutzen kann
// • der Redirect-Trigger (NEXT_REDIRECT) sauber durchgereicht wird
// • generische Fehler ("Login fehlgeschlagen") weder Username-Existenz
// noch Lockout-Status leaken (kein User-Enumeration).
// =====================================================================
const loginSchema = z.object({
email: z.string().email("Bitte eine gültige E-Mail-Adresse angeben.").toLowerCase().trim(),
password: z.string().min(1, "Passwort fehlt."),
});
export type LoginState = {
errors?: {
email?: string[];
password?: string[];
_form?: string[];
};
};
export async function loginAction(
_prev: LoginState,
formData: FormData,
): Promise<LoginState> {
const parsed = loginSchema.safeParse(Object.fromEntries(formData));
if (!parsed.success) {
return { errors: parsed.error.flatten().fieldErrors };
}
const { email, password } = parsed.data;
try {
await signIn("credentials", {
email,
password,
// Auth-Utils entscheiden im Folge-Render, ob /onboarding oder /dashboard.
// Wir landen aus Sicherheitsgründen erstmal generisch auf der Wurzel.
// Der Proxy (proxy.ts) übernimmt das Routing:
// → /onboarding wenn kein kitaId, → /dashboard wenn vorhanden.
redirectTo: "/",
});
} catch (err) {
// signIn wirft NEXT_REDIRECT bei Erfolg → das müssen wir bewusst
// weiterwerfen, sonst wird der Redirect verschluckt.
if (err instanceof AuthError) {
return {
errors: { _form: ["E-Mail oder Passwort ist nicht korrekt."] },
};
}
throw err;
}
return {};
}