'use server' import { revalidatePath } from 'next/cache' import { z } from 'zod' import { requireUser } from '@/lib/auth/current' import { AccessError } from '@/lib/errors' import { createEntry, editEntry, retractEntry } from '@/lib/departments/entries' 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('[abteilungsvermerk] unerwartet', error) return de.actionErrors.default! } const createSchema = z.object({ id: z.string().min(1).max(64), departmentKey: z.string().min(1).max(21), body: z.string().min(1).max(20_000), minClearance: z.coerce.number().int().min(0).max(5), }) export async function createEntryAction(input: unknown): Promise { const user = await requireUser() const parsed = createSchema.safeParse(input) if (!parsed.success) return { ok: false, error: de.actionErrors['entry-empty']! } try { await createEntry(user.permissions, parsed.data) revalidatePath(`/abteilungen/${parsed.data.departmentKey}`) return { ok: true } } catch (error) { return { ok: false, error: toMessage(error) } } } const editSchema = z.object({ id: z.string().min(1).max(64), departmentKey: z.string().min(1).max(21), body: z.string().min(1).max(20_000), }) export async function editEntryAction(input: unknown): Promise { const user = await requireUser() const parsed = editSchema.safeParse(input) if (!parsed.success) return { ok: false, error: de.actionErrors['entry-empty']! } try { await editEntry(user.permissions, parsed.data) revalidatePath(`/abteilungen/${parsed.data.departmentKey}`) return { ok: true } } catch (error) { return { ok: false, error: toMessage(error) } } } const retractSchema = z.object({ id: z.string().min(1).max(64), departmentKey: z.string().min(1).max(21), reason: z.string().min(10).max(500), }) export async function retractEntryAction(input: unknown): Promise { const user = await requireUser() const parsed = retractSchema.safeParse(input) if (!parsed.success) return { ok: false, error: de.actionErrors['reason-required']! } try { await retractEntry(user.permissions, parsed.data) revalidatePath(`/abteilungen/${parsed.data.departmentKey}`) return { ok: true } } catch (error) { return { ok: false, error: toMessage(error) } } }