stadtwerke/innungsapp/apps/admin/app/superadmin/actions.ts

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.' }
}
}