stammtisch-hersbruck/backend/pb_hooks/directory_lib.js
Daniel Michelberger 279796111c wip: Der abgebrochene Kurbeler-Umbau, wie er hier liegengeblieben ist
Kein fertiger Stand, sondern ein Zwischenstand: Hier wurde im September 2026
angefangen, die App auf „Kurbeler" umzubenennen — Wortmarke, Icons, brand.ts,
Benachrichtigungen, das Benutzerverzeichnis. Weitergegangen ist es dann im
eigenen Repo `~/Dokumente/Projekte/kurbeler`, das die vollständige Historie
dieses Repos mitgenommen hat.

Committet wird das hier nicht, weil es gebraucht würde, sondern damit es nicht
als Haufen unversionierter Dateien im Arbeitsverzeichnis verrottet. Wer in
zwei Jahren nachsieht, findet so eine Geschichte statt eines Rätsels — und das
Stammtisch-Wappen, das nur hier je existiert hat.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LTw6xVYgjMy9AQtfs1Gdyu
2026-09-11 15:42:33 +02:00

78 lines
2.1 KiB
JavaScript

/// <reference path="../pb_data/types.d.ts" />
// Gemeinsamer Code der Verzeichnis-Route.
//
// Eigene Datei aus demselben Grund wie bei den Einladungen: PocketBase führt
// jeden Route-Handler in einer eigenen JS-Laufzeit aus. Was neben routerAdd
// steht, sieht der Handler nicht — er holt sich seine Helfer per require().
const USERS = 'users'
const TEAMS = 'teams'
/**
* Die IDs einer Relation als gewöhnliches Array.
*
* `getStringSlice` und nicht `get`: Es liefert bei Einzel- wie
* Mehrfachrelation dieselbe Form und kommt auch mit dem leeren Feld zurecht.
* `get` gäbe je nach Feld einen String oder eine Go-Slice zurück — zwei
* Formen, die der Aufrufer auseinanderhalten müsste.
*/
function idsOf(record, field) {
const raw = record.getStringSlice(field) || []
const out = []
for (let i = 0; i < raw.length; i++) {
if (raw[i]) {
out.push(raw[i])
}
}
return out
}
/** Wem gehört das Team? Leerer String, wenn der Owner fehlt. */
function ownerId(team) {
const ids = idsOf(team, 'owner')
return ids.length > 0 ? ids[0] : ''
}
/** Ist die Person Mitglied (oder Owner) dieses Teams? */
function isMember(team, userId) {
if (ownerId(team) === userId) {
return true
}
return idsOf(team, 'users').indexOf(userId) !== -1
}
/**
* Superadmin ist eine appweite Rolle auf dem eigenen users-Datensatz, kein
* PocketBase-Superuser. Gelesen wird sie frisch aus der Datenbank und nicht
* aus dem mitgeschickten Auth-Record: Der Token hält den Stand von der
* Anmeldung fest, eine entzogene Rolle wirkte sonst bis zum Ablauf nicht.
*/
function isSuperadmin(app, user) {
if (!user) {
return false
}
try {
return app.findRecordById(USERS, user.id).getBool('superadmin')
} catch (err) {
return false
}
}
/** Alle Teams — für die Zuordnung im Superadmin-Verzeichnis. */
function allTeams(app) {
return app.findAllRecords(TEAMS)
}
module.exports = {
USERS: USERS,
idsOf: idsOf,
ownerId: ownerId,
isMember: isMember,
isSuperadmin: isSuperadmin,
allTeams: allTeams,
}