import { NextResponse } from 'next/server' import { erfordereZugang, ZugriffVerweigert } from '@/lib/auth/sitzung' import { briefDocxErzeugen } from '@/lib/schreiben/docx' import { dateinameFuerSchreiben, istSchreibenArt } from '@/lib/schreiben/arten' import { heuteAlsTag } from '@/lib/fristen/datum' import { tagAusText } from '@/lib/finanzen/datum' /** * Das Schreiben als Word-Datei herunterladen. * * Warum eine Route und keine Server Action? Eine Action kann keinen * Download ausloesen - sie muesste die Datei kodiert zurueckgeben und der * Browser sie nachbauen. Eine Route liefert sie unmittelbar aus, mit * richtigem Namen und Typ. Denselben Weg geht schon der Vollexport. * * POST und nicht GET, weil der bearbeitete Brieftext mitkommt und in eine * Adresszeile weder hineinpasst noch hineingehoert: Er stuende sonst im * Verlauf des Browsers und in jedem Zwischenspeicher. */ export const dynamic = 'force-dynamic' const MIME_DOCX = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' export async function POST(anfrage: Request): Promise { let formular: FormData try { formular = await anfrage.formData() } catch { return NextResponse.json({ fehler: 'Ungültige Anfrage.' }, { status: 400 }) } const betreuteId = String(formular.get('betreuteId') ?? '') const rohArt = String(formular.get('art') ?? '') const text = String(formular.get('text') ?? '') const empfaenger = String(formular.get('empfaengerName') ?? '').trim() const versandRoh = String(formular.get('versandAm') ?? '').trim() if (!betreuteId || !istSchreibenArt(rohArt) || text.trim().length < 30) { return NextResponse.json({ fehler: 'Unvollständige Angaben.' }, { status: 400 }) } try { // Zugriff wird hier geprueft und nicht nur auf der Seite davor: Eine // Route laesst sich unmittelbar aufrufen. await erfordereZugang(betreuteId, 'DOKUMENTE', 'lesen') } catch (ausnahme) { if (ausnahme instanceof ZugriffVerweigert) { return NextResponse.json({ fehler: ausnahme.message }, { status: 403 }) } throw ausnahme } const datum = tagAusText(versandRoh) ?? heuteAlsTag() const datei = await briefDocxErzeugen(text) const dateiname = dateinameFuerSchreiben(rohArt, empfaenger || null, datum, 'docx') return new NextResponse(new Uint8Array(datei), { headers: { 'Content-Type': MIME_DOCX, 'Content-Disposition': `attachment; filename="${dateiname}"`, 'Content-Length': String(datei.length), // Ein Schreiben aus einer Betreuungsakte gehoert in keinen // Zwischenspeicher. 'Cache-Control': 'no-store, must-revalidate', }, }) }