Files
AfiS-Aktensystem/web/app/(app)/export/actions.ts
T
Harlekin e0b03ea336
Prüfung / Lint, Typen, Tests (push) Canceled after 0s
Prüfung / Images bauen (pdf) (push) Canceled after 0s
Prüfung / Images bauen (web) (push) Canceled after 0s
Prüfung / Images bauen (worker) (push) Canceled after 0s
Images / bauen (pdf, docker/pdf.Dockerfile) (push) Canceled after 0s
Images / bauen (web, docker/web.Dockerfile) (push) Canceled after 0s
Images / bauen (worker, docker/worker.Dockerfile) (push) Canceled after 0s
Gedankenstriche durch Bindestriche ersetzt
375 Vorkommen in 210 Dateien. Betrifft Kommentare, Oberflaechentexte und die
README; an keiner Stelle Bedeutung, nur Zeichensetzung.
2026-09-04 08:54:52 +02:00

53 lines
1.6 KiB
TypeScript

'use server'
import { z } from 'zod'
import { requireUser } from '@/lib/auth/current'
import { AccessError } from '@/lib/errors'
import {
requestExport,
runExport,
type ExportTarget,
} from '@/lib/export/service'
import { de } from '@/lib/i18n/de'
export type ExportState = { jobId?: string; status?: string; error?: string }
function toMessage(error: unknown): string {
if (error instanceof AccessError) {
return de.actionErrors[error.code] ?? de.actionErrors.default!
}
console.error('[export] unerwartet', error)
return de.actionErrors.default!
}
const requestSchema = z.union([
z.object({ kind: z.literal('CASE'), caseNumber: z.string().min(1) }),
z.object({ kind: z.literal('DOCUMENT'), documentNumber: z.string().min(1) }),
])
/**
* Export anfordern.
*
* Der Auftrag läuft im Hintergrund weiter, nachdem die Antwort raus ist - das
* Rendern dauert, und niemand soll auf einen Fortschrittsbalken starren, der
* auf Playwright wartet. Siehe docs/09-performance-und-ux.md.
*/
export async function requestExportAction(
_prev: ExportState | null,
formData: FormData,
): Promise<ExportState> {
const user = await requireUser()
const parsed = requestSchema.safeParse(Object.fromEntries(formData))
if (!parsed.success) return { error: de.actionErrors.default! }
try {
const auftrag = await requestExport(user.permissions, parsed.data as ExportTarget)
if (auftrag.status === 'QUEUED') void runExport(auftrag.jobId)
return { jobId: auftrag.jobId, status: auftrag.status }
} catch (error) {
return { error: toMessage(error) }
}
}