Files
Harlekin e0b03ea336
Prüfung / Lint, Typen, Tests (push) Canceled after 0s
Prüfung / Images bauen (pdf) (push) Canceled after 0s
Prüfung / Images bauen (web) (push) Canceled after 0s
Prüfung / Images bauen (worker) (push) Canceled after 0s
Images / bauen (pdf, docker/pdf.Dockerfile) (push) Canceled after 0s
Images / bauen (web, docker/web.Dockerfile) (push) Canceled after 0s
Images / bauen (worker, docker/worker.Dockerfile) (push) Canceled after 0s
Gedankenstriche durch Bindestriche ersetzt
375 Vorkommen in 210 Dateien. Betrifft Kommentare, Oberflaechentexte und die
README; an keiner Stelle Bedeutung, nur Zeichensetzung.
2026-09-04 08:54:52 +02:00

57 lines
1.9 KiB
TypeScript

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<boolean> {
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 }
}