import { and, eq } from 'drizzle-orm'; import { datenbank, schema } from '../db'; import { jetzt } from '../zeit'; /** Fortschritt beim Lesen der Handouts. */ export function gelesenSet(benutzerId: string): Set { const zeilen = datenbank() .select({ handoutId: schema.handoutGelesen.handoutId }) .from(schema.handoutGelesen) .where(eq(schema.handoutGelesen.benutzerId, benutzerId)) .all(); return new Set(zeilen.map((z) => z.handoutId)); } export function gelesenAm(benutzerId: string, handoutId: string): string | null { const zeile = datenbank() .select({ gelesenAm: schema.handoutGelesen.gelesenAm }) .from(schema.handoutGelesen) .where(and(eq(schema.handoutGelesen.benutzerId, benutzerId), eq(schema.handoutGelesen.handoutId, handoutId))) .get(); return zeile?.gelesenAm ?? null; } export function alsGelesenMerken(benutzerId: string, handoutId: string): void { datenbank() .insert(schema.handoutGelesen) .values({ benutzerId, handoutId, gelesenAm: jetzt() }) .onConflictDoNothing() .run(); } export function alsUngelesenMerken(benutzerId: string, handoutId: string): void { datenbank() .delete(schema.handoutGelesen) .where(and(eq(schema.handoutGelesen.benutzerId, benutzerId), eq(schema.handoutGelesen.handoutId, handoutId))) .run(); } /** Anzahl gelesener Handouts – für die Fortschrittsanzeige. */ export function anzahlGelesen(benutzerId: string): number { return gelesenSet(benutzerId).size; }