/// // 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, }