import { createHash } from 'node:crypto' /** * Der Zwischenspeicherschlüssel eines Exports. * * `sha256(Ziel + Stand + Stufe + Vorlagenversion)`, siehe docs/08. Die * **Stufe gehört hinein**: zwei Abrufer verschiedener Stufen bekommen nicht * dasselbe PDF, und ein Treffer im Zwischenspeicher darf niemandem ein * Dokument geben, das für eine höhere Stufe gerendert wurde. * * Der Stand (`updatedAt`) sorgt dafür, dass eine geänderte Akte neu gerendert * wird - ein Export darf nie einen älteren Stand zeigen, als die Akte hat. Bei * einem Dossier ist das der **späteste** Stand über alle enthaltenen Akten, * siehe lib/export/dossier.ts. * * `maxLevel` gehört aus demselben Grund hinein wie die Stufe: zwei Abzüge mit * verschiedenen Deckeln sind verschiedene Dateien, und ein Treffer im * Zwischenspeicher darf keinen ungedeckelten Abzug für einen gedeckelten * ausgeben. */ export function exportCacheKey(input: { kind: string targetId: string updatedAt: Date clearanceLevel: number templateVersion: number | string maxLevel?: number | null }): string { return createHash('sha256') .update( [ input.kind, input.targetId, input.updatedAt.toISOString(), String(input.clearanceLevel), String(input.templateVersion), String(input.maxLevel ?? ''), ].join('|'), ) .digest('hex') }