import { db } from '@/lib/db' import { visibleCaseWhere } from '@/lib/access/caseFilter' import { AccessError } from '@/lib/errors' import { loadVisibleCase } from '@/lib/cases/service' import type { EffectivePermissions } from '@/lib/auth/permissions' /** * Beobachtungsliste. * * Wer eine Akte beobachtet, sieht sie auf der Übersicht und bekommt ihre * Meldungen, auch ohne beteiligt zu sein. **Zugriff verschafft das nicht**: * beobachten kann man nur, was man ohnehin sehen darf, und fällt die Akte * später über die eigene Stufe, verschwindet sie auch aus der Liste — die * Abfrage läuft durch dieselbe Sichtbarkeitsprüfung wie die Fallliste. */ export async function listWatched(p: EffectivePermissions, take = 20) { return db.case.findMany({ where: { AND: [visibleCaseWhere(p), { watches: { some: { userId: p.userId } } }] }, orderBy: [{ updatedAt: 'desc' }], take, select: { id: true, caseNumber: true, title: true, status: true, classification: true, updatedAt: true, }, }) } export async function isWatching(p: EffectivePermissions, caseId: string): Promise { const eintrag = await db.watch.findUnique({ where: { userId_caseId: { userId: p.userId, caseId } }, select: { userId: true }, }) return eintrag !== null } /** Umschalten. Gibt zurück, ob danach beobachtet wird. */ export async function toggleWatch( p: EffectivePermissions, caseNumber: string, ): Promise<{ watching: boolean }> { const akte = await loadVisibleCase(p, caseNumber) if (!akte) throw new AccessError('not-found') const vorhanden = await isWatching(p, akte.id) if (vorhanden) { await db.watch.delete({ where: { userId_caseId: { userId: p.userId, caseId: akte.id } } }) return { watching: false } } await db.watch.create({ data: { userId: p.userId, caseId: akte.id } }) return { watching: true } }