'use server' import { revalidatePath } from 'next/cache' import { z } from 'zod' import { requireUser } from '@/lib/auth/current' import { AccessError } from '@/lib/errors' import { createDepartment, updateDepartment } from '@/lib/departments/service' import { de } from '@/lib/i18n/de' export type ActionResult = { ok: true } | { ok: false; error: string } function toMessage(error: unknown): string { if (error instanceof AccessError) { return de.actionErrors[error.code] ?? de.actionErrors.default! } console.error('[abteilungen] unerwartet', error) return de.actionErrors.default! } const createSchema = z.object({ key: z.string().min(1).max(21), name: z.string().min(1).max(120), description: z.string().max(500).optional(), minClearance: z.coerce.number().int().min(0).max(5), }) export async function createDepartmentAction( _prev: ActionResult | null, formData: FormData, ): Promise { const user = await requireUser() const parsed = createSchema.safeParse(Object.fromEntries(formData)) if (!parsed.success) return { ok: false, error: de.actionErrors.default! } try { await createDepartment(user.permissions, parsed.data) revalidatePath('/admin/abteilungen') revalidatePath('/abteilungen') return { ok: true } } catch (error) { return { ok: false, error: toMessage(error) } } } const updateSchema = z.object({ id: z.string().min(1), name: z.string().min(1).max(120), description: z.string().max(500).optional(), minClearance: z.coerce.number().int().min(0).max(5), isArchived: z.union([z.literal('on'), z.undefined()]).transform((wert) => wert === 'on'), }) export async function updateDepartmentAction( _prev: ActionResult | null, formData: FormData, ): Promise { const user = await requireUser() const parsed = updateSchema.safeParse(Object.fromEntries(formData)) if (!parsed.success) return { ok: false, error: de.actionErrors.default! } try { await updateDepartment(user.permissions, parsed.data) revalidatePath('/admin/abteilungen') revalidatePath('/abteilungen') return { ok: true } } catch (error) { return { ok: false, error: toMessage(error) } } }