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
375 Vorkommen in 210 Dateien. Betrifft Kommentare, Oberflaechentexte und die README; an keiner Stelle Bedeutung, nur Zeichensetzung.
53 lines
1.6 KiB
TypeScript
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) }
|
|
}
|
|
}
|
|
|
|
|