Workspace: Rolle "Management" heisst jetzt "DogFather"

Auf Wunsch von Filipe. Betrifft ausschliesslich die Anzeige.

Der Rollenschluessel bleibt "admin". Er steckt in der CHECK-Regel der
Datenbank, in jeder bestehenden Sitzung und in jeder Rechteabfrage --
ihn umzubenennen haette alle drei gebrochen, und bestehende Anmeldungen
waeren ungueltig geworden. Umbenannt wird nur, was man LIEST.

Der Anzeigename steht jetzt an EINER Stelle (ROLLEN_NAME in
workspace.js) und kommt ueber /workspace/api/ich als rolle_name mit.
Stand er in elf Dateien, waere er beim naechsten Mal in zehn davon
geaendert.

Dabei aufgefallen: In der Kopfleiste stand auf JEDER Seite der rohe
Rollenschluessel -- "Chef · admin". Das war schon vorher unschoen, faellt
aber jetzt erst richtig auf. Alle elf Seiten zeigen jetzt "Chef ·
DogFather". Geprueft: kein rohes "admin" mehr in der Oberflaeche.

Geaendert: Rollenkachel und Untertitel auf der Anmeldeseite, Kopfleiste
aller Seiten, Rollentext auf dem Dashboard, Rollenmarken und Auswahl in
der Personenverwaltung, die Betreuungs-Auswahl ("nur DogFather"), der
Hinweis auf der Dateienseite, die Erklaerung zur internen Notiz im
Profil, die Hinweise fuer Scouts ohne Zuteilung -- und vier
Fehlermeldungen vom Server.

Schreibweise "DogFather" wie von Filipe geschrieben; das ist auch auf
der oeffentlichen Website die haeufigste Form (717 von 1216).

In den Code-Kommentaren der Fachmodule heisst die Rolle weiterhin "das
Management". Das bleibt bewusst so -- eine Massenaenderung an vierzig
Kommentaren waere reines Risiko ohne sichtbaren Nutzen. Ein Hinweis an
der ROLLEN_NAME-Zuordnung erklaert den Zusammenhang.
This commit is contained in:
2026-08-28 11:55:05 +02:00
parent 55450aa83f
commit 1c3e642f12
20 changed files with 54 additions and 36 deletions
+4 -4
View File
@@ -129,7 +129,7 @@ function nameAusKopf(req) {
function darfHochladen(req, res, next) {
if (!DARF_HOCHLADEN.has(req.person.rolle)) {
return res.status(403).json({
fehler: "Dateien legen das Management und die Scouts ab.",
fehler: "Dateien legen DogFather und die Scouts ab.",
});
}
next();
@@ -263,10 +263,10 @@ dateienRouter.patch("/workspace/api/dateien/:id", gleicheHerkunft, (req, res) =>
/* "freigegeben" ist eine Abnahme -- die trifft laut Konzept das
Management, nicht der, der die Datei hochgeladen hat. */
if (req.body.status === "freigegeben" && req.person.rolle !== "admin") {
return res.status(403).json({ fehler: "Freigeben darf nur das Management." });
return res.status(403).json({ fehler: "Freigeben darf nur DogFather." });
}
if (datei.status === "freigegeben" && req.person.rolle !== "admin") {
return res.status(403).json({ fehler: "Freigegebene Dateien ändert nur das Management." });
return res.status(403).json({ fehler: "Freigegebene Dateien ändert nur DogFather." });
}
setz.push("status = ?"); daten.push(req.body.status);
}
@@ -309,7 +309,7 @@ dateienRouter.delete("/workspace/api/dateien/:id", gleicheHerkunft, (req, res) =
return res.status(403).json({ fehler: "nicht_erlaubt" });
}
if (datei.status === "freigegeben") {
return res.status(403).json({ fehler: "Freigegebene Dateien löscht nur das Management." });
return res.status(403).json({ fehler: "Freigegebene Dateien löscht nur DogFather." });
}
}
+1 -1
View File
@@ -180,7 +180,7 @@ personenRouter.patch("/workspace/api/verwaltung/personen/:id", gleicheHerkunft,
if (!aktiv && person.rolle === "admin") {
const { n } = db().prepare(
"SELECT COUNT(*) AS n FROM personen WHERE rolle = 'admin' AND aktiv = 1").get();
if (n <= 1) return res.status(400).json({ fehler: "Das ist das letzte aktive Management." });
if (n <= 1) return res.status(400).json({ fehler: "Das ist der letzte aktive DogFather-Zugang." });
}
personSperren(id, aktiv, { ...req.person, ip: echteIp(req) });
}
+1 -1
View File
@@ -227,7 +227,7 @@ scoutRouter.delete("/workspace/api/leads/:id", gleicheHerkunft, (req, res) => {
/* Ein übergebener Lead ist Teil der Betreuungsgeschichte -- den
räumt nur das Management weg. */
if (req.person.rolle !== "admin" && lead.status === "uebergeben") {
return res.status(403).json({ fehler: "Übergebene Leads löscht nur das Management." });
return res.status(403).json({ fehler: "Übergebene Leads löscht nur DogFather." });
}
db().prepare("DELETE FROM leads WHERE id = ?").run(id);
protokolliere("lead_geloescht", {
+19 -1
View File
@@ -54,6 +54,21 @@ const VERSUCHE_MAX = 8; // pro IP
const VERSUCHE_FENSTER_MIN = 10;
const ROLLEN = new Set(["admin", "creator", "scout"]);
/* Der Rollenschluessel bleibt "admin" -- er steckt in der CHECK-Regel der
Datenbank, in jeder Sitzung und in jeder Rechteabfrage. Umbenannt wird
nur, was man LIEST. Diese Zuordnung ist die einzige Stelle dafuer:
Stand der Anzeigename in elf Dateien, waere er beim naechsten Mal in
zehn davon geaendert.
Hinweis fuer spaeter: In den Kommentaren der Fachmodule heisst die
Rolle "admin" weiterhin "das Management". Gemeint ist dieselbe Rolle,
die in der Oberflaeche "DogFather" heisst. */
export const ROLLEN_NAME = {
admin: "DogFather",
creator: "Creator",
scout: "Scout",
};
/* scrypt-Parameter. N=2^15 braucht auf diesem Server rund 150 ms — spürbar
genug, um Rateversuche auszubremsen, und unauffällig für einen echten
Anmeldevorgang. Die Werte werden je Datensatz mitgespeichert, damit sie
@@ -529,7 +544,10 @@ workspaceRouter.get("/workspace/api/ich", (req, res) => {
erkennen, welcher Eintrag der eigene ist (etwa "das bin ich" in der
Personenliste), und das eigene Profil liesse sich gar nicht aufrufen.
Ein Geheimnis ist sie nicht -- sie beschreibt nur den Angemeldeten. */
res.json({ id: person.id, name: person.name, rolle: person.rolle });
res.json({
id: person.id, name: person.name, rolle: person.rolle,
rolle_name: ROLLEN_NAME[person.rolle] ?? person.rolle,
});
});
/* ---------- Verwaltung (nur über die Kommandozeile) --------------------