'use server' import { revalidatePath } from 'next/cache' import { z } from 'zod' import { requireUser } from '@/lib/auth/current' import { AccessError } from '@/lib/cases/service' import { ConflictError, saveSection } from '@/lib/cases/sectionService' import { de } from '@/lib/i18n/de' const schema = z.object({ caseNumber: z.string().min(1), fieldKey: z.string().min(1), value: z.unknown(), baseVersion: z.coerce.number().int().min(0), minClearance: z.coerce.number().int().min(0).max(5).optional(), }) export type SaveSectionResult = | { ok: true; version: number } /** Kein stilles Überschreiben: die fremde Fassung kommt mit zurück. */ | { ok: false; conflict: true; current: { value: unknown; version: number } } | { ok: false; conflict: false; error: string } export async function saveSectionAction(input: unknown): Promise { const user = await requireUser() const parsed = schema.safeParse(input) if (!parsed.success) return { ok: false, conflict: false, error: de.case.errors.default! } try { const { version } = await saveSection(user.permissions, parsed.data) revalidatePath(`/faelle/${parsed.data.caseNumber}`) return { ok: true, version } } catch (error) { if (error instanceof ConflictError) { return { ok: false, conflict: true, current: { value: error.current.value, version: error.current.version }, } } if (error instanceof AccessError) { return { ok: false, conflict: false, error: de.case.errors[error.code] ?? de.case.errors.default! } } console.error('[abschnitt] unerwartet', error) return { ok: false, conflict: false, error: de.case.errors.default! } } }