Haustrennung: kein Eintrag mehr aus dem anderen Haus
Filipe, 24.09.2026: "wenn ich bei der einen was mache soll nichts bei
der anderen passieren." -- und heute: "ja los".
GEMESSEN, BEVOR ETWAS ANGEFASST WURDE (jedes Brett x beide Adressen x
vier Rollen):
AGENTUR-Adresse DogFather 18 Bretter
Manager 6 Bretter
Creator 6 Bretter
Modi kommt nicht rein (401)
CREW-Adresse DogFather 18 Bretter
Modi 13 Bretter
Manager kommt nicht rein (401)
Creator kommt nicht rein (401)
Die Anmeldung war also dicht. Durch griff genau EINE Rolle: DogFather.
Er wohnt in beiden Haeusern, und die Riegel in sichtbarEintrag()
fragten nach der ROLLE, nicht nach der Adresse. Auf der Crew-Adresse
stand damit das Brett der Agentur samt Inhalt.
Nachgemessen ist der Durchgriff AELTER als der gestrige Eventkarten-
Umbau -- zweimal gemessen, mit und ohne ihn, gleiches Ergebnis.
RIEGEL 0 in sichtbarEintrag(): Wer auf einer Adresse angemeldet ist,
sieht nur Eintraege dieses Hauses. Er haengt den uebrigen Riegeln
UM, statt in jeden Ausgang geschrieben zu werden -- die Funktion hat
drei Rueckgabepunkte, und der naechste waere sonst wieder offen.
Nachher, dieselbe Messung: DogFather sieht auf der Agenturadresse nur
Agentur-Eintraege, auf der Crew-Adresse nur die des Rudels. Manager,
Creator und Modi unveraendert.
WAS DABEI SCHIEFGING UND WIE ES AUFFIEL
1. Die erste Fassung liess bei `haus IS NULL` den BEREICH entscheiden.
pruef-haus-trennung.mjs wurde sofort rot: "Lunas Live vom Montag"
verschwand von der Agenturadresse. `live`, `technik` und
`community` tragen BEIDES -- die Kacheln von Team Dogi und die
Creator-Akten. Eine Regel, die jedem Brett genau ein Haus zuweist,
kann das nicht. Jetzt bleibt ein Eintrag ohne Haus sichtbar: ein
Eintrag zu viel faellt auf, ein fehlender nicht.
2. Damit NULL kein Dauerloch ist: FUENF von ACHT Stellen, die
Eintraege anlegen, setzten `haus` gar nicht (workspace-video.js,
-content.js, -bewerbung.js, -treff.js, -vorlagen.js). Nachgetragen.
3. Und `person.haus` war dafuer der falsche Massstab: Legt DogFather
ueber die Agenturadresse ein Highlight an, gehoert es trotzdem dem
Rudel -- sonst sieht die Community es nie. pruef-treff.mjs hat das
gefunden (2 Fehler). Neu: hausFuerNeuenEintrag() -- bei den sieben
Brettern des Rudels entscheidet das BRETT, sonst die Adresse.
NEU: pruef-haus-luecke.mjs (12 Pruefungen). Sie sucht die
Einfuege-Stellen im Quelltext und wird rot, sobald eine neunte
dazukommt, die `haus` vergisst -- mit Gegenprobe, dass das Suchmuster
eine solche Stelle auch wirklich erkennt. Ein Kommentar daneben haette
es nicht verhindert; das steht so schon im Projektgedaechtnis.
NEBENBEI: In bereich.js stand seit gestern `|| "Agentur-Events"` als
Rueckfall fuer das Etikett der Vorschau. pruef-treff.mjs verbietet
das zu Recht -- wie ein Brett heisst, haengt am Haus, und der Server
sagt es. Der Rueckfall ist weg; fehlt die Angabe, steht lieber kein
Etikett da als ein falsches.
pruef-treff.mjs nachgezogen (85 -> 86 Pruefungen, nicht weniger): Die
Zusage "DogFather sieht den Beitrag" wird jetzt auf der Crew-Adresse
geprueft, mit Gegenprobe fuer die Agenturadresse.
GEPRUEFT, alle gruen:
pruef-haus-luecke 12 pruef-haus-trennung 100
pruef-crew-adresse 169 pruef-treff 86
pruef-eventkarte 77 pruef-agentur 62
pruef-haus-seiten 38 pruef-eintrag-bild 24
pruef-vorlagen 24 pruef-video, -content, -bewerbung,
-bereiche-lesend: in Ordnung
Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
@@ -86,6 +86,7 @@ import {
|
||||
heuteLokal,
|
||||
gehoertAufDieseAdresse,
|
||||
bereicheFuer, kanaeleFuer, KANAELE,
|
||||
hausFuerNeuenEintrag,
|
||||
} from "./workspace.js";
|
||||
import { nachrichtSchicken } from "./workspace-chat.js";
|
||||
import {
|
||||
@@ -1282,7 +1283,119 @@ function ohneVertrauliche(regel, person, praefix) {
|
||||
auch Fragen zu Aufgaben, Dateien und Terminen; ein Bereichsname hat
|
||||
dort nichts zu suchen. Der Kommentar eine Bildschirmseite weiter oben
|
||||
warnt woertlich davor. */
|
||||
|
||||
/* =====================================================================
|
||||
RIEGEL 0: DAS HAUS DER ADRESSE (03.10.2026)
|
||||
|
||||
Filipe, 24.09.2026: "bevor du das aber machst will ich dass du
|
||||
zuerst die komplette site vn der workspace seite trennst. da soll
|
||||
nichts verknuepft sein. ... vermerk dass ab jetzt jeder umbau immer
|
||||
getrennt abgefuehrt wird auf den zwei seiten."
|
||||
|
||||
WAS GEMESSEN WURDE (03.10.2026, server/_mess-haeuser.mjs, jedes
|
||||
Brett x beide Adressen x vier Rollen):
|
||||
|
||||
AGENTUR-Adresse DogFather 18 Bretter
|
||||
Manager 6 Bretter
|
||||
Creator 6 Bretter
|
||||
Modi kommt nicht rein (401)
|
||||
CREW-Adresse DogFather 18 Bretter
|
||||
Modi 13 Bretter
|
||||
Manager kommt nicht rein (401)
|
||||
Creator kommt nicht rein (401)
|
||||
|
||||
Die Anmeldung ist also dicht -- eine Agenturrolle kommt nicht auf
|
||||
die Crew-Adresse und umgekehrt. Durch greift genau EINE Rolle:
|
||||
DogFather. Er ist die einzige in BEIDE_HAEUSER_ROLLEN, und die
|
||||
Riegel darunter fragen nach der ROLLE, nicht nach der Adresse.
|
||||
Auf der Crew-Adresse stand damit das Brett der Agentur samt Inhalt.
|
||||
|
||||
WARUM ES BISHER NICHT GRIFF, obwohl es die Spalte `eintraege.haus`
|
||||
seit dem 24.09. gibt: Sie wird beim ANLEGEN gefuellt und beim LESEN
|
||||
nie gefragt. Gefiltert wurde ausschliesslich ueber die ROLLEN der
|
||||
beteiligten Personen (ohneTeamDogi / ohneAgentur) -- und ein Eintrag,
|
||||
an dem nur DogFather haengt, faellt durch beide Netze, weil er in
|
||||
beiden Haeusern wohnt. Bei 20 von 26 Eintraegen ist er der Ersteller.
|
||||
|
||||
DER RIEGEL STEHT GANZ VORNE, vor der Aussenrolle: Er gilt damit fuer
|
||||
JEDEN Rueckgabeweg dieser Funktion, auch fuer den, den jemand als
|
||||
naechstes einbaut. Dieselbe Ueberlegung wie bei "WARUM DER KLICK
|
||||
GLEICH HIER DRANHAENGT" in bereich.js -- eine Funktion mit drei
|
||||
Ausgaengen braucht ihre Regel am Eingang, nicht an jedem Ausgang.
|
||||
|
||||
OHNE ADRESSE KEINE EINSCHRAENKUNG. `person.haus` setzt sitzungLesen()
|
||||
aus dem Host-Kopf; bei einer Pruefung auf 127.0.0.1 steht dort
|
||||
nichts. Dann greift dieser Riegel nicht -- sonst waeren alle
|
||||
Pruefungen des Hauses still gruen und blind, genau die Falle, vor der
|
||||
crew-adresse.js dreimal warnt.
|
||||
|
||||
UND NULL IST KEIN LOCH. Fuenf von acht Stellen, die Eintraege
|
||||
anlegen, setzen `haus` gar nicht (gemessen: workspace-video.js,
|
||||
workspace-content.js, workspace-bewerbung.js, workspace-treff.js,
|
||||
workspace-vorlagen.js). Ein Filter, der nur `haus = ?` prueft,
|
||||
wuerde deren Eintraege fuer BEIDE Haeuser verbergen -- Daten
|
||||
verschwinden still, der schlimmere Ausgang. Deshalb entscheidet bei
|
||||
NULL der BEREICH, und zwar nach genau derselben Regel, nach der der
|
||||
naechtliche Nachtrag ihn setzt (eintraegeNachHaus in workspace.js).
|
||||
Zwei Fassungen derselben Regel waeren die, die auslaeuft.
|
||||
===================================================================== */
|
||||
|
||||
/** Die Bedingung "nur Eintraege dieses Hauses" -- oder null, wenn die
|
||||
* Frage sich nicht stellt (keine Adresse, also keine Haustrennung).
|
||||
*
|
||||
* ==== WARUM NULL SICHTBAR BLEIBT (03.10.2026) =======================
|
||||
*
|
||||
* Die erste Fassung hat bei `haus IS NULL` den BEREICH entscheiden
|
||||
* lassen -- nach derselben Regel, nach der eintraegeNachHaus() das
|
||||
* Haus nachtraegt (MODI_BEREICHE_ERLAUBT). Das war falsch, und
|
||||
* pruef-haus-trennung.mjs hat es sofort gefunden:
|
||||
*
|
||||
* FEHL auf workspace. steht der Eintrag da
|
||||
*
|
||||
* Es ging um "Lunas Live vom Montag" auf dem Brett `live`. Die
|
||||
* Ableitung stuft `live` als Crew-Brett ein (Team Dogi hat eine
|
||||
* Kachel darauf) -- aber dasselbe Brett traegt auch die
|
||||
* Creator-Akten der Agentur. `live`, `technik` und `community`
|
||||
* gehoeren BEIDEN Haeusern, und eine Regel, die jedem Brett genau
|
||||
* ein Haus zuweist, kann das nicht abbilden.
|
||||
*
|
||||
* Sie ist als VERTEILREGEL trotzdem richtig: Wenn ein neuer Eintrag
|
||||
* ein Haus braucht, ist "wer hat die Kachel" die beste Auskunft, die
|
||||
* es gibt. Als AUSSCHLUSSREGEL beim Lesen ist sie es nicht -- dort
|
||||
* nimmt sie etwas weg, statt etwas zuzuordnen, und ein Irrtum kostet
|
||||
* Sichtbarkeit statt nur Ordnung.
|
||||
*
|
||||
* Deshalb: Wer ein Haus hat, wird danach gefiltert. Wer keins hat,
|
||||
* bleibt sichtbar. Das ist die sichere Richtung -- ein Eintrag zu
|
||||
* viel faellt auf, ein fehlender nicht.
|
||||
*
|
||||
* DAMIT DARAUS KEIN DAUERLOCH WIRD, zwei Dinge: Die fuenf Stellen,
|
||||
* die `haus` bisher nicht gesetzt haben, tun es jetzt (gemessen am
|
||||
* 03.10.2026: workspace-video.js, workspace-content.js,
|
||||
* workspace-bewerbung.js, workspace-treff.js, workspace-vorlagen.js),
|
||||
* und pruef-haus-luecke.mjs wird rot, sobald eine sechste dazukommt,
|
||||
* die es vergisst. Was trotzdem ohne Haus entsteht, traegt
|
||||
* eintraegeNachHaus() beim naechsten Start nach. */
|
||||
function nurDiesesHaus(person, praefix = "e") {
|
||||
const haus = person?.haus;
|
||||
if (haus !== "crew" && haus !== "agentur") return null;
|
||||
return {
|
||||
wo: `(${praefix}.haus = ? OR ${praefix}.haus IS NULL)`,
|
||||
werte: [haus],
|
||||
};
|
||||
}
|
||||
|
||||
export function sichtbarEintrag(person, praefix = "e") {
|
||||
/* RIEGEL 0 -- das Haus der Adresse. Begruendung direkt darueber.
|
||||
Er wird den uebrigen Riegeln UMGEHANGEN statt in jeden Ausgang
|
||||
geschrieben: Diese Funktion hat drei Rueckgabepunkte, und der
|
||||
naechste, den jemand einbaut, waere sonst wieder offen. */
|
||||
const haus = nurDiesesHaus(person, praefix);
|
||||
const mitHaus = (r) => {
|
||||
if (!r || !haus) return r;
|
||||
return { wo: `(${r.wo}) AND ${haus.wo}`, werte: [...r.werte, ...haus.werte] };
|
||||
};
|
||||
|
||||
/* RIEGEL 1 -- die Aussenrolle. Eine eigene, vollstaendige Regel:
|
||||
genau die Bretter des Treffs, sonst nichts. */
|
||||
if (AUSSEN_ROLLEN.has(person?.rolle)) {
|
||||
@@ -1298,19 +1411,19 @@ export function sichtbarEintrag(person, praefix = "e") {
|
||||
weiterhin geliefert. Genau so ist am 10.09. ein Modi-Eintrag
|
||||
durch die Suche gekommen, obwohl das Brett zu war. */
|
||||
const frei = freigabeBedingung(person, praefix);
|
||||
if (!frei) return grund;
|
||||
return { wo: `(${grund.wo}) AND ${frei.wo}`, werte: [...grund.werte, ...frei.werte] };
|
||||
if (!frei) return mitHaus(grund);
|
||||
return mitHaus({ wo: `(${grund.wo}) AND ${frei.wo}`, werte: [...grund.werte, ...frei.werte] });
|
||||
}
|
||||
const regel = sichtbarRoh2(person, praefix);
|
||||
/* RIEGEL 2 -- wer nicht zum Treff gehoert, sieht seine Bretter nicht.
|
||||
Auch DogFather geht hier durch; er steht in TREFF_ROLLEN und faellt
|
||||
deshalb nicht heraus. */
|
||||
if (!regel || TREFF_ROLLEN.has(person?.rolle)) return regel;
|
||||
if (!regel || TREFF_ROLLEN.has(person?.rolle)) return mitHaus(regel);
|
||||
const platz = TREFF_BRETTER.map(() => "?").join(", ");
|
||||
return {
|
||||
return mitHaus({
|
||||
wo: `(${regel.wo}) AND ${praefix}.bereich NOT IN (${platz})`,
|
||||
werte: [...regel.werte, ...TREFF_BRETTER],
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
function sichtbarRoh2(person, praefix = "e") {
|
||||
@@ -2289,7 +2402,8 @@ bereicheRouter.post("/workspace/api/bereich/:bereich/start", gleicheHerkunft, (r
|
||||
/* Der TAG in Ortszeit, der ZEITSTEMPEL in UTC -- das ist kein
|
||||
Widerspruch: Ein Zeitpunkt ist ueberall derselbe, ein
|
||||
Kalendertag nicht. */
|
||||
heuteLokal(), jetzt(), req.person.id, req.person.haus || null);
|
||||
heuteLokal(), jetzt(), req.person.id,
|
||||
hausFuerNeuenEintrag(req.person, bereich));
|
||||
|
||||
/* UND SOFORT FREIGEBEN (17.09.2026) -- der Fehler, den Filipe
|
||||
auf seinem Bildschirm gesehen hat.
|
||||
@@ -2410,7 +2524,7 @@ bereicheRouter.post("/workspace/api/bereich/:bereich/:id/daraus",
|
||||
„Vorbei" und war zugeklappt -- waehrend beim Wunsch
|
||||
„Daraus wurde ein Termin" zu lesen war. */
|
||||
heuteLokal(), jetzt(), req.person.id, quelle.id,
|
||||
req.person.haus || null);
|
||||
hausFuerNeuenEintrag(req.person, nach));
|
||||
|
||||
protokolliere("bereich_daraus", {
|
||||
personId: req.person.id, rolle: req.person.rolle, ip: echteIp(req),
|
||||
@@ -2683,7 +2797,7 @@ bereicheRouter.post("/workspace/api/bereich/:bereich", gleicheHerkunft, (req, re
|
||||
Fall, und der soll der Normalfall sein. */
|
||||
aus.nur_leitung ?? 0,
|
||||
/* Das Haus aus der Adresse -- letzte Spalte, letzter Wert. */
|
||||
req.person.haus || null);
|
||||
hausFuerNeuenEintrag(req.person, bereich));
|
||||
|
||||
/* DASSELBE VON HAND WIE ÜBER DEN VIDEOWEG (30.09.2026). Wer ein
|
||||
Highlight selbst anlegt und es auch freigeben dürfte, braucht
|
||||
|
||||
Reference in New Issue
Block a user