Add non-destructive dev seed on startup
This commit is contained in:
@@ -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 {};
|
||||
}
|
||||
Reference in New Issue
Block a user