'use server' import { revalidatePath } from 'next/cache' import { z } from 'zod' import { db } from '@/lib/db' import { requirePermissionForAction } from '@/lib/auth/current' import { writeAudit } from '@/lib/audit/write' import { templateFieldsSchema } from '@/lib/templates/schema' import { de } from '@/lib/i18n/de' const schema = z.object({ key: z.string().regex(/^[a-z][a-z0-9_-]*$/), name: z.string().trim().min(1).max(200), description: z.string().trim().max(500).optional(), numberPrefix: z.string().regex(/^[A-Za-z][A-Za-z0-9-]*$/).max(20), numberPadding: z.coerce.number().int().min(1).max(8), fields: templateFieldsSchema, }) export type TemplateResult = | { ok: true; version: number } | { ok: false; error: string } /** * Speichert eine Vorlage als **neue Version**. * * Bestehende Akten bleiben unberührt: sie merken sich ihre `templateId`. Eine * Änderung gilt erst für Akten, die danach angelegt werden. Siehe * docs/05-akten-und-vorlagen.md. */ export async function saveTemplate(input: unknown): Promise { const user = await requirePermissionForAction('template.manage') const parsed = schema.safeParse(input) if (!parsed.success) { const erste = parsed.error.issues[0] return { ok: false, error: erste ? `${erste.path.join('.')}: ${erste.message}` : de.actionErrors.default!, } } const { key, fields, ...rest } = parsed.data const neueste = await db.documentTemplate.findFirst({ where: { key }, orderBy: { version: 'desc' }, select: { version: true }, }) const version = (neueste?.version ?? 0) + 1 await db.$transaction(async (tx) => { // Ältere Versionen bleiben stehen, aber nur die neueste ist auswählbar. await tx.documentTemplate.updateMany({ where: { key }, data: { isActive: false } }) await tx.documentTemplate.create({ data: { key, version, ...rest, description: rest.description || null, fields, isActive: true, createdById: user.id, }, }) await writeAudit(tx, { actorId: user.id, action: 'template.update', targetType: 'DocumentTemplate', targetId: `${key}:${version}`, clearanceAtTime: user.permissions.clearanceLevel, meta: { key, version, fieldCount: fields.length }, }) }) revalidatePath('/admin/vorlagen') return { ok: true, version } }