import { after } from 'next/server' import { headers } from 'next/headers' import { noteOpened } from '@/lib/recent/service' import type { RecentTarget } from '@afis/db' /** * Einen Sprung vormerken, aus einer Seite heraus. * * Zwei Dinge macht diese Schicht, die die Datenschicht nicht machen kann: * * **Vorabrufe zählen nicht.** Next holt die Seiten hinter sichtbaren Links im * Voraus. Ohne diese Prüfung stünde in der Liste, worüber jemand mit der Maus * gefahren ist — die Übersicht allein würde sie mit zehn Akten füllen, die * niemand geöffnet hat. Das wäre nicht nur falsch, es wäre die unangenehmere * Sorte falsch: eine Aufzeichnung von Aufmerksamkeit statt von Handlung. * * **Es kostet die Seite nichts.** Der Schreibvorgang läuft in `after()`, also * nachdem die Antwort raus ist. Eine Merkliste darf keine Akte langsamer * machen; geht sie verloren, ist nichts verloren. */ export async function trackOpen( userId: string, targetType: RecentTarget, targetId: string, ): Promise { if (await istVorabruf()) return after(async () => { try { await noteOpened(userId, targetType, targetId) } catch { // Eine Merkliste ist kein Grund, eine Aktenansicht scheitern zu lassen. } }) } /** * Die Kopfzeilen, mit denen Next und die Browser einen Vorabruf ankündigen. * Lieber eine zu viel geprüft als einen Sprung erfunden. */ async function istVorabruf(): Promise { const kopf = await headers() return ( kopf.get('next-router-prefetch') === '1' || kopf.has('next-router-segment-prefetch') || kopf.get('purpose') === 'prefetch' || kopf.get('x-purpose') === 'prefetch' || kopf.get('x-moz') === 'prefetch' ) }