since3-portal/modules/admin/actions/client.ts
2026-10-01 13:59:20 +02:00

73 lines
No EOL
2.4 KiB
TypeScript

"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<CreateClientState> {
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 }
}