50 lines
1.7 KiB
TypeScript
50 lines
1.7 KiB
TypeScript
'use server'
|
|
|
|
import { prisma } from '@innungsapp/shared'
|
|
import { revalidatePath } from 'next/cache'
|
|
import { z } from 'zod'
|
|
|
|
const createOrgSchema = z.object({
|
|
name: z.string().min(2, 'Name muss mindestens 2 Zeichen lang sein'),
|
|
slug: z.string().min(2, 'Slug muss mindestens 2 Zeichen lang sein').regex(/^[a-z0-9-]+$/, 'Slug darf nur Kleinbuchstaben, Zahlen und Bindestriche enthalten'),
|
|
contactEmail: z.string().email('Ungültige E-Mail Adresse').optional().or(z.literal('')),
|
|
})
|
|
|
|
export async function createOrganization(prevState: any, formData: FormData) {
|
|
try {
|
|
const rawData = {
|
|
name: formData.get('name') as string,
|
|
slug: (formData.get('slug') as string).toLowerCase(),
|
|
contactEmail: formData.get('contactEmail') as string,
|
|
}
|
|
|
|
const validatedData = createOrgSchema.parse(rawData)
|
|
|
|
// Check if slug exists
|
|
const existingOrg = await prisma.organization.findUnique({
|
|
where: { slug: validatedData.slug }
|
|
})
|
|
|
|
if (existingOrg) {
|
|
return { success: false, error: 'Diese Kurzbezeichnung (Slug) existiert bereits.' }
|
|
}
|
|
|
|
await prisma.organization.create({
|
|
data: {
|
|
name: validatedData.name,
|
|
slug: validatedData.slug,
|
|
contactEmail: validatedData.contactEmail || null,
|
|
plan: 'pilot',
|
|
}
|
|
})
|
|
|
|
revalidatePath('/superadmin')
|
|
return { success: true, error: '' }
|
|
} catch (error) {
|
|
if (error instanceof z.ZodError) {
|
|
return { success: false, error: error.errors[0].message }
|
|
}
|
|
return { success: false, error: 'Ein unerwarteter Fehler ist aufgetreten.' }
|
|
}
|
|
}
|