mirror of
https://github.com/Since-3/since3-portal.git
synced 2026-10-12 20:51:17 +00:00
73 lines
No EOL
2.4 KiB
TypeScript
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 }
|
|
} |