"use server"; import { createAdminClient } from "@/lib/supabase/admin"; import { verifySession } from "@/lib/supabase/dal"; import { generatePassword } from "@/lib/generate-password"; import { getAppUrl } from "@/modules/shared/mail/app-url"; import { sendMail } from "@/modules/shared/mail/send-mail"; import { welcomeMail } from "@/modules/shared/mail/templates"; import * as z from "zod"; const CreateClientSchema = z.object({ name: z.string().min(3, {error: "Mindestens drei Zeichen eingeben"}), email: z.email({ error: "Bitte eine gültige Email eingeben." }) }) export type CreateClientState = | { error: string } | { success: true; email: string; password: string; welcomeMailSent: boolean } | undefined; export async function createClient( _prevState: CreateClientState, formData: FormData ): Promise { const session = await verifySession(); if (!session.isAdmin) { return { error: "Keine Berechtigung." } } const validatedFields = CreateClientSchema.safeParse({ name: formData.get("name"), email: formData.get("email") }); if (!validatedFields.success) { const { fieldErrors } = z.flattenError(validatedFields.error); const message = fieldErrors.email?.[0] ?? fieldErrors.name?.[0] ?? "Bitte Name und Email ausfüllen."; return { error: message } } const { name, email } = validatedFields.data; const password = generatePassword(); const supabase = createAdminClient(); const { data, error } = await supabase.auth.admin.createUser({ email, password, email_confirm: true, user_metadata: { name }, }); if (error) { return { error: error.code === "email_exists" ? "Diese Email ist bereits vergeben." : "Client konnte nicht angelegt werden." } } // Der Account existiert bereits: ein Mailfehler darf nicht verhindern, dass das Passwort angezeigt wird. let welcomeMailSent = false; try { const sent = await sendMail({ to: email, ...welcomeMail({ name, email, appUrl: await getAppUrl() }), type: "welcome", idempotencyKey: `welcome-${data.user.id}`, }); welcomeMailSent = sent.ok; } catch (mailError) { console.error("[mail] Willkommensmail fehlgeschlagen:", mailError); } return { success: true, email, password, welcomeMailSent } }