Die Rolle "Spicy Media" -- und drei Fehler, die nur ihre Pruefung fand
DIE PERSONENTABELLE WURDE NEU GEBAUT. Eine Rolle ist ein erlaubter Wert in einer Spalte, und der steckt in einem CHECK -- den kann SQLite nicht aendern. Auf `personen` zeigen ZWEIUNDFUENFZIG Fremdschluessel. Deshalb wird der Bauplan NICHT abgeschrieben, sondern gelesen: Der CREATE-Text kommt aus sqlite_master, darin wird ausschliesslich die Rollenliste ersetzt, und die Kopierliste kommt aus PRAGMA table_info. Die beiden aelteren Umstellungen schreiben ihre Spalten von Hand ab -- `personen` hat seit damals SIEBEN dazubekommen (bild, ueber_mich, tiktok ...). Wer hier abschreibt, verliert alle Profilbilder. ZWEI FRAGEN, DIE MAN AUSEINANDERHALTEN MUSS: siehtAlles() = DogFather ODER Spicy Media -> Listen, Uebersichten istDogFather() = nur DogFather -> loeschen, Rollen, Codes Es waere weniger Arbeit gewesen, istDogFather() um "spicy" zu erweitern -- und genau das waere der Fehler: Spicy Media koennte dann DogFather loeschen. DER CHAT BRAUCHTE NICHTS. Er haengt allein an der Teilnehmerliste und kennt kein "das Management sieht alles". Spicy Media sieht fremde Gespraeche nicht, weil es dafuer keinen Weg gibt -- nicht, weil eine Abfrage es verbietet. DREI ECHTE FEHLER, alle von pruef-spicy gefunden, keiner vorher sichtbar: 1. MEIN EIGENER KOMMENTAR STAND IM BAUPLAN. SQLite hebt den CREATE-Text woertlich auf, samt Kommentaren. Ich hatte "'spicy' steht HIER mit drin" hineingeschrieben -- und die Erkennung suchte genau dieses Wort im ganzen Text. Ergebnis: Die Umstellung hielt die Tabelle fuer erledigt, obwohl die CHECK-Regel noch die alte war. Jetzt wird die Regel herausgeschnitten und NUR darin gesucht; der Kommentar steht ausserhalb des SQL. 2. DER SICHERUNGSNAME HATTE NUR MINUTEN. `VACUUM INTO` weigert sich, eine vorhandene Datei zu ueberschreiben -- zu Recht. Zwei Umstellungen in derselben Minute wollten in dieselbe Datei, die zweite scheiterte, und weil ohne Sicherung nicht umgestellt wird, blieb sie aus. Es sah nach "lief" aus (die Datei lag ja da) und war keine. Jetzt mit Sekunden. 3. EINE FRISCHE DATENBANK LEGTE DIE ALTE ROLLENLISTE AN und stellte beim allerersten Start sofort um -- Tabelle neu bauen, Sicherung schreiben, fuer nichts. Ein Bauplan, der sofort umgebaut werden muss, ist der falsche. Und ein vierter in der Pruefung selbst: Der Chat-Aufbau benutzte einen falschen Weg, das Gespraech entstand gar nicht -- "Spicy Media sieht 0 Gespraeche" war trotzdem gruen, weil es keine gab. Jetzt ist das Anlegen selbst eine Pruefung, und eine Gegenprobe zeigt, dass Max es sehr wohl sieht. DAZU: Manager sehen die Kachel "Personen & Zugaenge" -- die SEITE geht auf, die Schnittstellen nicht. Alles unter /verwaltung haengt weiter an `nurAdmin` und antwortet 404; sie sehen genau den Teil, fuer den es einen Weg gibt. Spicy Media legt Creator UND Manager an (zweite enge Tuer, Rolle steht auch dort nicht im Aufruf; ein Manager kommt durch sie nicht). Der Rollentext des Managers stimmte nicht mehr -- er legt jetzt Creator an. pruef-spicy: 36 Pruefungen, alle gruen. Ausserdem gruen: personen-liste (33), creator-anlegen (29), sicht (48), css-klassen (15), alle-wege (19), haerte (20), manager-sicht (43). Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
@@ -15,10 +15,15 @@
|
||||
/* Reihenfolge und Erklaerung an EINER Stelle. Sie gilt fuer die
|
||||
Rollenwahl im Formular und fuer alles, was sonst Rollen auflistet. */
|
||||
const ROLLEN = [
|
||||
{ wert: 'spicy', name: 'Spicy Media', symbol: 'chili',
|
||||
text: 'Überblick über alle – ohne Automationen, ohne fremde Chats. Legt Leute an.' },
|
||||
{ wert: 'admin', name: 'DogFather', symbol: 'krone',
|
||||
text: 'Alle Rechte, endgültig. Nur DogFather legt DogFather und Manager an.' },
|
||||
text: 'Alle Rechte, endgültig. Nur DogFather legt DogFather, Spicy Media und Manager an.' },
|
||||
/* Der Satz stimmte bis zum 07.09.2026 -- seither legen Manager
|
||||
Creator an, und ein Text, der etwas anderes verspricht als die
|
||||
Oberflaeche tut, ist schlimmer als gar keiner. */
|
||||
{ wert: 'manager', name: 'Manager', symbol: 'stern',
|
||||
text: 'Dieselben Rechte wie DogFather – außer der Personenverwaltung.' },
|
||||
text: 'Dieselben Rechte wie DogFather, ohne Personenverwaltung – legt aber Creator an.' },
|
||||
{ wert: 'scout', name: 'Scout', symbol: 'schutz',
|
||||
text: 'Eigene Pipeline und die Creator, die ihm zugeteilt sind.' },
|
||||
{ wert: 'creator', name: 'Creator', symbol: 'person',
|
||||
@@ -32,7 +37,19 @@
|
||||
/* DogFather und Manager kann nur DogFather vergeben -- der Server
|
||||
lehnt es ohnehin ab, aber ein Knopf, der immer scheitert, gehoert
|
||||
gar nicht erst hin. */
|
||||
for (const r of ROLLEN) {
|
||||
/* WER WELCHE ROLLE VERGEBEN DARF (07.09.2026).
|
||||
|
||||
DogFather: alle. Spicy Media: Manager und Creator. Manager: nur
|
||||
Creator. Der Server setzt dasselbe durch (drei getrennte Wege,
|
||||
siehe workspace-personen.js) -- hier geht es nur darum, niemandem
|
||||
einen Knopf hinzustellen, der eine Absage bringt.
|
||||
|
||||
Aus derselben Liste wie die Beschreibungen, damit die beiden nicht
|
||||
auseinanderlaufen. */
|
||||
const darf = ich?.rolle === 'admin' ? ['spicy', 'admin', 'manager', 'scout', 'creator']
|
||||
: ich?.rolle === 'spicy' ? ['manager', 'creator']
|
||||
: ['creator'];
|
||||
for (const r of ROLLEN.filter((x) => darf.includes(x.wert))) {
|
||||
if ((r.wert === 'admin' || r.wert === 'manager') && ich.rolle !== 'admin') continue;
|
||||
const b = el('button', 'rollenwahl__knopf');
|
||||
b.type = 'button';
|
||||
@@ -627,10 +644,27 @@
|
||||
const knopf = $('neu-speichern');
|
||||
knopf.disabled = true;
|
||||
try {
|
||||
const a = await hole('/workspace/api/verwaltung/personen', {
|
||||
/* DREI TUEREN, EINE AUSWAHL (07.09.2026).
|
||||
|
||||
DogFather geht durch die Verwaltungstuer und kann jede Rolle
|
||||
vergeben. Manager und Spicy Media haben dort nichts zu suchen --
|
||||
fuer sie gibt es zwei enge Tueren, die je genau eine Rolle
|
||||
anlegen und die Rolle gar nicht erst als Feld annehmen.
|
||||
|
||||
Die Zuordnung steht hier und nicht in einer Abfrage im Server:
|
||||
Der Server prueft ohnehin, WER durch welche Tuer darf. Diese
|
||||
Zeilen sorgen nur dafuer, dass niemand gegen eine verschlossene
|
||||
laeuft. */
|
||||
const rolle = gewaehlteRolle();
|
||||
const weg = ich.rolle === 'admin' ? '/workspace/api/verwaltung/personen'
|
||||
: rolle === 'manager' ? '/workspace/api/manager-anlegen'
|
||||
: '/workspace/api/creator-anlegen';
|
||||
const a = await hole(weg, {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ name: $('f-name').value, rolle: gewaehlteRolle() }),
|
||||
body: JSON.stringify(ich.rolle === 'admin'
|
||||
? { name: $('f-name').value, rolle }
|
||||
: { name: $('f-name').value }),
|
||||
});
|
||||
if (!a.ok) {
|
||||
$('neu-fehler').textContent = (await a.json().catch(() => ({}))).fehler || 'Ging nicht.';
|
||||
@@ -653,6 +687,43 @@
|
||||
} catch { return; }
|
||||
if (!LEITUNG.has(ich.rolle)) { location.assign('/workspace/start.html'); return; }
|
||||
window.werZeigen?.(ich);
|
||||
|
||||
/* ===================================================================
|
||||
DIE SEITE HAT ZWEI AUSBAUSTUFEN (07.09.2026)
|
||||
|
||||
Filipe: "die sollen in der kategorie wo die jetzt sehen werden
|
||||
auch noch das mit den hinzufuegen sehen, alles andere auf der
|
||||
seite sollen die weiterhin nicht sehen."
|
||||
|
||||
DogFather bekommt die Seite wie bisher: Liste, Codes, Sperren,
|
||||
Loeschen, Protokoll. Manager und Spicy Media bekommen genau EINEN
|
||||
Teil davon -- das Anlegen.
|
||||
|
||||
DAS VERSTECKEN IST NICHT DIE SICHERUNG. Alles, was hier
|
||||
ausgeblendet wird, haengt am Server an `nurAdmin` und antwortet
|
||||
mit 404. Wuerde diese Zeile fehlen, saehen sie leere Kaesten und
|
||||
Fehlermeldungen -- aber keine Daten. Das Ausblenden erspart ihnen
|
||||
nur den Anblick von Dingen, die es fuer sie nicht gibt.
|
||||
|
||||
Und deshalb wird auch `laden()` NICHT aufgerufen: Es fragt die
|
||||
Verwaltungsschnittstelle ab, und die ist zu. Eine Abfrage, von der
|
||||
man weiss, dass sie 404 gibt, sollte man nicht stellen -- sie
|
||||
fuellt nur das Serverlog. */
|
||||
const nurAnlegen = ich.rolle !== 'admin';
|
||||
if (nurAnlegen) {
|
||||
document.body.dataset.nurAnlegen = 'ja';
|
||||
$('unterzeile') && ($('unterzeile').textContent =
|
||||
'Hier legst du neue Leute an. Codes, Sperren und das Protokoll bleiben bei DogFather.');
|
||||
baueRollenwahl();
|
||||
/* Das Formular steht offen da -- es ist der einzige Grund, warum
|
||||
diese Seite fuer sie ueberhaupt aufgeht. Ein Knopf, der eine
|
||||
leere Seite oeffnet, waere ein Klick ohne Zweck. */
|
||||
$('neu').hidden = false;
|
||||
$('neu-oeffnen').hidden = true;
|
||||
$('neu-abbrechen').hidden = true;
|
||||
return;
|
||||
}
|
||||
|
||||
baueRollenwahl();
|
||||
await laden();
|
||||
})();
|
||||
|
||||
Reference in New Issue
Block a user