stammtisch-hersbruck/backend/pb_migrations/1754500900_users_superadmin.js
Daniel Michelberger 27d34ad0d3 feat: Superadmin-Rolle und Standard-Flags fuer neue Teams
Die Rolle superadmin kommt als Feld an users, der erste ist
stammtisch@dne.name. Vergeben wird sie nur in PocketBase: Die updateRule
schliesst das Feld ueber @request.body.superadmin:isset = false aus, sonst
koennte sich jeder selbst befoerdern - jeder darf schliesslich seinen
eigenen Datensatz aendern. Besondere Rechte in der App haengen noch nicht
daran.

Flag-Typen bleiben ausdruecklich Sache der Teams. Ein neues Team bekommt
beim Anlegen den hartkodierten Standardsatz aus der App und kann ihn danach
frei aendern; eine appweite Verwaltung entfaellt damit. Ein Team ohne
Flag-Typen koennte zwar Marker aufnehmen, aber nichts einordnen.

Im Kopf stehen Avatar und Name links, Design-Umschalter und Logout rechts.

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

47 lines
1.6 KiB
JavaScript

/// <reference path="../pb_data/types.d.ts" />
// Superadmin als appweite Rolle, über allen Teams.
//
// Wichtig ist die Ergänzung der updateRule: Jeder darf seinen eigenen
// Datensatz ändern — ohne `@request.body.superadmin:isset = false` könnte
// sich damit jeder selbst befördern. Vergeben wird die Rolle deshalb nur
// direkt in PocketBase oder durch eine Migration wie diese.
//
// Der erste Superadmin ist stammtisch@dne.name. Existiert das Konto (noch)
// nicht, passiert hier nichts weiter — die Rolle lässt sich jederzeit im
// Admin-UI nachziehen.
//
// Flag-Typen bleiben ausdrücklich Sache der Teams: Jedes Team verwaltet
// seine eigenen und bekommt beim Anlegen den Standardsatz aus der App.
// Superadmin hat damit im Alltag nichts zu tun.
const FIRST_SUPERADMIN = 'stammtisch@dne.name'
migrate((app) => {
const users = app.findCollectionByNameOrId('users')
if (!users.fields.getByName('superadmin')) {
users.fields.add(new Field({
id: 'bool_user_superadmin',
name: 'superadmin',
type: 'bool',
}))
}
users.updateRule = 'id = @request.auth.id && @request.body.superadmin:isset = false'
app.save(users)
try {
const first = app.findAuthRecordByEmail('users', FIRST_SUPERADMIN)
first.set('superadmin', true)
app.save(first)
} catch {
// Konto noch nicht angelegt — die Rolle wird dann von Hand vergeben.
}
}, (app) => {
const users = app.findCollectionByNameOrId('users')
users.fields.removeByName('superadmin')
users.updateRule = 'id = @request.auth.id'
app.save(users)
})