Der Treff zieht in Team Dogi ein — die dritte Adresse ist wieder weg
Filipe, nachdem er die dritte Wand gesehen hatte: "das soll keine app für sich sein, dass soll in der crew seite adaptiert werden, da rein perfektionniert." WAS VERSCHWINDET: treff.dogfather-universe.com samt Weiche (treff-adresse.js), Zugangswand, Manifest und acht Bühnenbildern. Kein DNS-Eintrag, kein zweiter Caddy-Block, kein zweites App-Symbol. Die Gründe, die DAFÜR sprachen, stehen jetzt als Kommentar in crew-adresse.js statt als Code -- sie gelten weiter, und beim nächsten Mal wird jemand dieselbe Idee haben: eine App je Ursprung, und ein Schloss mehr zwischen der Community und den Daten der Agentur. WAS DER VERZICHT KOSTET, benannt statt übersehen: · Die Community steht vor derselben Wand wie das Team und liest dort die Namen der drei Team-Rollen. Filipes Entscheidung auf die Frage: vierte Kachel "Community" statt gar keiner Kacheln. · Ein Schloss weniger. Was vorher die Adresse getrennt hat, muss jetzt jede einzelne Regel halten -- deshalb prüft pruef-treff-werkzeuge seit heute zehn Dinge mehr (70 statt 60). EINE LÜCKE, DIE DABEI AUFGEFALLEN IST -- und die es schon vorher gab: Ein Mitglied der Community stand in der Auswahl, wen man zu einem Termin einlädt, wem man eine Aufgabe gibt und mit wem man einen Chat anfängt. Für DogFather bedeutet fast jede Liste "alle". Jetzt zu, über eine Hülle (ohneAussen) um die fünf Listen, die von Zusammenarbeit handeln -- damit sie auch für die Listen gilt, die es noch nicht gibt. Die Verwaltungsliste in "Personen & Zugänge" zeigt sie weiterhin, sonst legt er einen Zugang an und der verschwindet im selben Moment. DREI BEFUNDE AUS DEN PRÜFUNGEN, wieder keiner vom Lesen: · Mein eigener Kommentar auf der Wand nannte eine Rolle der Agentur -- in einer Datei, die jedes Community-Mitglied im Quelltext liest. Zum zweiten Mal an einem Tag, und zum zweiten Mal ausgerechnet in einem Kommentar, der erklärt, warum man das nicht tut. · Die Prüfung "der Satz nennt die Modis" durchsuchte den QUELLTEXT und wäre grün geblieben, obwohl der Satz auf dem Bildschirm längst ein anderer ist -- sie fand ihn in einem Kommentar. Sie misst jetzt die sichtbare Unterzeile. · Der erste Entwurf der Adressregel sperrte die Community auch auf localhost aus -- eine Bedingung durch AUSSCHLUSS, zum dritten Mal an einem Tag. Jede Zeile nennt jetzt die Adresse, FÜR DIE sie gilt. Und zwei feste Zahlen weniger: Die Kachelreihe wird nicht mehr gezählt, sondern beim Namen genannt (admin, hand, modi, gast) -- eine Zahl war dort schon zweimal rot, ohne dass etwas kaputt war. Der App-Name wird nicht nur geprüft, sondern der UNTERSCHIED zur Agenturadresse. Die App heißt auf crew. jetzt "DogFather Universe" statt "Team Dogi" -- sie gehört ab heute beiden (Entscheidung Filipe). Geprüft: rollen 312 · crew-adresse 132 · kalender 104 · sicht 84 · modi-verborgen 80 · chat-kanaele 79 · treff-werkzeuge 70 · haus-trennung 62 · treff 58 · chat 48 · treff-seiten 42 · bereiche-lesend 37 · start-ansicht 147 · css-klassen 30 · zwischenspeicher 21 · alle-wege 19 · rechtetafel 19 -- alles grün. Die 58 bei pruef-treff sind elf weniger als gestern: Mit der dritten Adresse fallen ihre 26 Weichen-Prüfungen weg, ersetzt durch 10 für die eine Wand plus die neuen in 7b. Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
@@ -64,9 +64,9 @@ let fehler = 0, geprueft = 0;
|
||||
const melde = (t) => console.log(t);
|
||||
const ok = (b, t) => { geprueft++; console.log((b ? " ok " : " FEHL ") + t); if (!b) fehler++; };
|
||||
|
||||
const TREFF = "treff.dogfather-universe.com";
|
||||
const CREW = "crew.dogfather-universe.com";
|
||||
const HAUS = "workspace.dogfather-universe.com";
|
||||
const HAUPT = "dogfather-universe.com";
|
||||
|
||||
const { DatabaseSync } = await import("node:sqlite");
|
||||
const { scryptSync, randomBytes, createHmac } = await import("node:crypto");
|
||||
@@ -153,8 +153,8 @@ async function anmelden(rolle, code, host) {
|
||||
|
||||
const kDogi = await anmelden("admin", "CODE-DOGI-0001", HAUS);
|
||||
const kModi = await anmelden("modi", "CODE-MODI-0001", CREW);
|
||||
const kKessi = await anmelden("gast", "CODE-GAST-0001", TREFF);
|
||||
const kBo = await anmelden("gast", "CODE-GAST-0002", TREFF);
|
||||
const kKessi = await anmelden("gast", "CODE-GAST-0001", CREW);
|
||||
const kBo = await anmelden("gast", "CODE-GAST-0002", CREW);
|
||||
ok(!!kDogi && !!kModi && !!kKessi && !!kBo, "alle vier sind angemeldet");
|
||||
|
||||
/* =======================================================================
|
||||
@@ -164,24 +164,24 @@ melde("");
|
||||
melde("=== 1. Will ich auch ===");
|
||||
{
|
||||
const weg = `/workspace/api/treff/eintrag/${wunsch1}/willich`;
|
||||
const a = await roh(weg, TREFF, { cookie: kKessi }, {}, "PUT");
|
||||
const a = await roh(weg, CREW, { cookie: kKessi }, {}, "PUT");
|
||||
ok(a.code === 200 && json(a).stimmen === 1, `Kessi stimmt ab (${json(a).stimmen})`);
|
||||
|
||||
/* ZWEIMAL DRUECKEN IST EINMAL. Das ist die eigentliche Regel: Der
|
||||
zusammengesetzte Schluessel laesst gar keine zweite Zeile zu. */
|
||||
const b = await roh(weg, TREFF, { cookie: kKessi }, {}, "PUT");
|
||||
const b = await roh(weg, CREW, { cookie: kKessi }, {}, "PUT");
|
||||
ok(b.code === 200 && json(b).stimmen === 1, `zweimal druecken aendert nichts (${json(b).stimmen})`);
|
||||
|
||||
const c = await roh(weg, TREFF, { cookie: kBo }, {}, "PUT");
|
||||
const c = await roh(weg, CREW, { cookie: kBo }, {}, "PUT");
|
||||
ok(c.code === 200 && json(c).stimmen === 2, `Bo auch (${json(c).stimmen})`);
|
||||
|
||||
const e = await roh(weg, TREFF, { cookie: kKessi }, {}, "DELETE");
|
||||
const e = await roh(weg, CREW, { cookie: kKessi }, {}, "DELETE");
|
||||
ok(e.code === 200 && json(e).stimmen === 1 && json(e).meine === false,
|
||||
`Kessi nimmt sie zurueck (${json(e).stimmen})`);
|
||||
|
||||
/* Und die Zahl kommt am Brett an -- sonst waere sie eine Zahl, die
|
||||
nur die Route kennt. */
|
||||
const brett = await roh("/workspace/api/bereich/wunsch", TREFF, { cookie: kBo });
|
||||
const brett = await roh("/workspace/api/bereich/wunsch", CREW, { cookie: kBo });
|
||||
const zeile = (json(brett).eintraege || []).find((x) => x.id === wunsch1);
|
||||
ok(zeile?.stimmen === 1 && zeile?.meine_stimme === 1,
|
||||
`am Brett steht sie auch (${zeile?.stimmen}, meine ${zeile?.meine_stimme})`);
|
||||
@@ -190,7 +190,7 @@ melde("=== 1. Will ich auch ===");
|
||||
diese Zeile waere "es geht" auch dann gruen, wenn es ueberall
|
||||
ginge -- und dann waere die Wunschliste keine Abstimmung mehr,
|
||||
sondern ein Nebeneffekt. */
|
||||
const f = await roh(`/workspace/api/treff/eintrag/${bosBeitrag}/willich`, TREFF,
|
||||
const f = await roh(`/workspace/api/treff/eintrag/${bosBeitrag}/willich`, CREW,
|
||||
{ cookie: kKessi }, {}, "PUT");
|
||||
ok(f.code === 400, `im Gespraech gibt es kein "Will ich auch" (${f.code})`);
|
||||
}
|
||||
@@ -225,7 +225,7 @@ melde("=== 2. Anheften ===");
|
||||
ok(nochmal.code === 200, `nach dem Abnehmen geht die vierte (${nochmal.code})`);
|
||||
|
||||
/* Und die Community heftet nichts an. */
|
||||
const gast = await roh(`/workspace/api/treff/eintrag/${anschlag[1]}/anheften`, TREFF,
|
||||
const gast = await roh(`/workspace/api/treff/eintrag/${anschlag[1]}/anheften`, CREW,
|
||||
{ cookie: kKessi }, {}, "PUT");
|
||||
ok(gast.code === 404, `ein Mitglied kann nichts anheften (${gast.code})`);
|
||||
|
||||
@@ -241,13 +241,13 @@ melde("");
|
||||
melde("=== 3. Melden ===");
|
||||
{
|
||||
const weg = `/workspace/api/treff/eintrag/${bosBeitrag}/melden`;
|
||||
const ohne = await roh(weg, TREFF, { cookie: kKessi }, { grund: "" });
|
||||
const ohne = await roh(weg, CREW, { cookie: kKessi }, { grund: "" });
|
||||
ok(ohne.code === 400, `ohne Grund geht es nicht (${ohne.code})`);
|
||||
|
||||
const kurz = await roh(weg, TREFF, { cookie: kKessi }, { grund: "doof" });
|
||||
const kurz = await roh(weg, CREW, { cookie: kKessi }, { grund: "doof" });
|
||||
ok(kurz.code === 400, `"doof" ist kein Grund (${kurz.code})`);
|
||||
|
||||
const mit = await roh(weg, TREFF, { cookie: kKessi },
|
||||
const mit = await roh(weg, CREW, { cookie: kKessi },
|
||||
{ grund: "Da steht die Handynummer von jemandem drin." });
|
||||
ok(mit.code === 200, `mit Grund geht es (${mit.code})`);
|
||||
|
||||
@@ -260,7 +260,7 @@ melde("=== 3. Melden ===");
|
||||
|
||||
/* Die Community sieht die Meldungen NICHT -- sonst waere ablesbar,
|
||||
wer wen gemeldet hat. */
|
||||
const gast = await roh("/workspace/api/treff/meldungen", TREFF, { cookie: kBo });
|
||||
const gast = await roh("/workspace/api/treff/meldungen", CREW, { cookie: kBo });
|
||||
ok(gast.code === 404, `ein Mitglied sieht die Liste nicht (${gast.code})`);
|
||||
|
||||
/* Entscheiden braucht ebenfalls einen Satz. */
|
||||
@@ -366,7 +366,7 @@ melde("=== 6. Ausschluss ===");
|
||||
/* "dabei" und nicht "stamm": Kessi ist 40 Tage dabei, hat aber
|
||||
keinen eigenen Beitrag geschrieben. Beide Bedingungen muessen
|
||||
erfuellt sein -- genau das misst diese Zeile nebenbei mit. */
|
||||
const vorher = await roh("/workspace/api/treff/lage", TREFF, { cookie: kKessi });
|
||||
const vorher = await roh("/workspace/api/treff/lage", CREW, { cookie: kKessi });
|
||||
ok(vorher.code === 200 && json(vorher).stufe === "dabei",
|
||||
`Kessi ist drin, Stufe ${json(vorher).stufe}`);
|
||||
|
||||
@@ -378,24 +378,24 @@ melde("=== 6. Ausschluss ===");
|
||||
/* DIE SITZUNG IST WEG, nicht nur das Schreiben. Ein
|
||||
Ausgeschlossener, der weiter mitlesen kann, ist bei Belaestigung
|
||||
genau der Teil, der weh tut. */
|
||||
const lage = await roh("/workspace/api/treff/lage", TREFF, { cookie: kKessi });
|
||||
const lage = await roh("/workspace/api/treff/lage", CREW, { cookie: kKessi });
|
||||
ok(lage.code === 401, `ihre Sitzung gilt nicht mehr (${lage.code})`);
|
||||
|
||||
const brett = await roh("/workspace/api/bereich/treff", TREFF, { cookie: kKessi });
|
||||
const brett = await roh("/workspace/api/bereich/treff", CREW, { cookie: kKessi });
|
||||
ok(brett.code === 401, `und sie liest auch nichts mehr (${brett.code})`);
|
||||
|
||||
/* Und sie kommt auch nicht wieder herein -- gar nicht erst. Ohne
|
||||
diese Zeile waere die Anmeldung gelungen, das Plaetzchen gesetzt,
|
||||
und dahinter eine Seite, auf der nichts geht. Das sieht aus wie
|
||||
ein kaputtes Programm, nicht wie eine Entscheidung. */
|
||||
const neu = await anmelden("gast", "CODE-GAST-0001", TREFF);
|
||||
const neu = await anmelden("gast", "CODE-GAST-0001", CREW);
|
||||
ok(!neu, "und sie kann sich nicht neu anmelden");
|
||||
|
||||
/* GEGENPROBE: Bo hat nur eine PAUSE -- kein Ausschluss. Er darf
|
||||
weiter lesen, aber nicht schreiben. Ohne diese Zeile waeren die
|
||||
vier darueber auch dann gruen, wenn jede Massnahme jeden
|
||||
aussperrt. */
|
||||
const boLage = await roh("/workspace/api/treff/lage", TREFF, { cookie: kBo });
|
||||
const boLage = await roh("/workspace/api/treff/lage", CREW, { cookie: kBo });
|
||||
ok(boLage.code === 200, `Bo liest weiter (${boLage.code})`);
|
||||
ok(json(boLage).sperre?.art === "pause" && !!json(boLage).sperre?.bis,
|
||||
`und sieht seine Pause mit Enddatum (${json(boLage).sperre?.bis?.slice(0, 10)})`);
|
||||
@@ -403,10 +403,10 @@ melde("=== 6. Ausschluss ===");
|
||||
|
||||
/* Und Pim, sieben Tage ausgeschlossen, kommt gar nicht mehr herein
|
||||
-- ein befristeter Ausschluss ist ein Ausschluss, keine Pause. */
|
||||
const pim = await anmelden("gast", "CODE-GAST-0003", TREFF);
|
||||
const pim = await anmelden("gast", "CODE-GAST-0003", CREW);
|
||||
ok(!pim, "ein befristeter Ausschluss sperrt ebenfalls aus");
|
||||
|
||||
const versuch = await roh("/workspace/api/bereich/treff", TREFF, { cookie: kBo },
|
||||
const versuch = await roh("/workspace/api/bereich/treff", CREW, { cookie: kBo },
|
||||
{ art: ersteArt("treff"), titel: "BO-TROTZDEM", text: "Hallo?", datum: heute });
|
||||
ok(versuch.code === 403, `und es geht auch wirklich nicht (${versuch.code})`);
|
||||
}
|
||||
@@ -431,17 +431,89 @@ melde("=== 7. Die Bruecke zu den Talenten ===");
|
||||
|
||||
/* Die Community kommt an die Talente nicht heran -- sonst waere die
|
||||
Bruecke ein Fenster. */
|
||||
const gast = await roh("/workspace/api/bereich/talente", TREFF, { cookie: kBo });
|
||||
const gast = await roh("/workspace/api/bereich/talente", CREW, { cookie: kBo });
|
||||
ok(gast.code === 404, `ein Mitglied sieht die Talente nicht (${gast.code})`);
|
||||
}
|
||||
|
||||
/* =======================================================================
|
||||
7b. DIE COMMUNITY STEHT IN KEINER ARBEITSLISTE — aber in der Verwaltung
|
||||
|
||||
Seit der Treff in Team Dogi eingezogen ist, sind Mitglieder und Team
|
||||
auf derselben Adresse. Was vorher die Adresse getrennt hat, muss
|
||||
jetzt jede einzelne Liste halten.
|
||||
|
||||
DREI LISTEN, ZWEI ANTWORTEN. Einladen und Chatten: nein, und zwar
|
||||
auch für DogFather, der sonst überall "alle" bekommt. Verwaltung: ja
|
||||
— sonst legt er einen Zugang an und der verschwindet im selben
|
||||
Moment aus der Liste.
|
||||
|
||||
MIT GEGENPROBE IN BEIDE RICHTUNGEN: Jede "steht nicht drin"-Zeile
|
||||
steht neben einer, die beweist, dass die Liste überhaupt jemanden
|
||||
enthält. Eine leere Liste erfüllt sonst jede Nein-Bedingung.
|
||||
======================================================================= */
|
||||
melde("");
|
||||
melde("=== 7b. Keine Arbeitsliste, aber die Verwaltung ===");
|
||||
{
|
||||
const namen = (a) => {
|
||||
try {
|
||||
const j = JSON.parse(a.text);
|
||||
const feld = Object.values(j).find(Array.isArray) || [];
|
||||
return feld.map((x) => x?.name).filter(Boolean);
|
||||
} catch { return []; }
|
||||
};
|
||||
|
||||
for (const [was, weg] of [
|
||||
["die Einladungsliste", "/workspace/api/einladbar"],
|
||||
["die Chat-Partner", "/workspace/api/chat/partner"],
|
||||
]) {
|
||||
const a = await roh(weg, HAUS, { cookie: kDogi });
|
||||
const liste = namen(a);
|
||||
/* DIE ZAHL GEHÖRT IN DIE BEDINGUNG: Wäre die Liste leer, wäre
|
||||
"Kessi steht nicht drin" trivial wahr. */
|
||||
ok(a.code === 200 && liste.length > 0,
|
||||
`${was} hat überhaupt Einträge (${liste.length})`);
|
||||
ok(!liste.includes("Kessi") && !liste.includes("Bo"),
|
||||
`${was} enthält niemanden aus der Community${
|
||||
liste.filter((n) => n === "Kessi" || n === "Bo").join(", ")}`);
|
||||
ok(liste.includes("Frida"),
|
||||
`aber den Modi — ${was} filtert nicht einfach alles weg`);
|
||||
}
|
||||
|
||||
/* UND DIE VERWALTUNG ZEIGT SIE. Auf der Team-Adresse, denn dort
|
||||
wohnt der Treff jetzt. */
|
||||
const verwaltung = await roh("/workspace/api/personen", CREW, { cookie: kDogi });
|
||||
const inVerwaltung = namen(verwaltung);
|
||||
ok(verwaltung.code === 200 && inVerwaltung.includes("Kessi"),
|
||||
`in "Personen & Zugänge" auf crew. steht die Community (${inVerwaltung.length} Personen)`);
|
||||
ok(inVerwaltung.includes("Frida"),
|
||||
"und das Team ebenfalls — eine Liste, nicht zwei");
|
||||
|
||||
/* Die Rolle lässt sich dort auch VERGEBEN. Ein Knopf, den es nicht
|
||||
gibt, macht die Liste nutzlos: Ohne ihn kann DogFather nirgends
|
||||
einen Zugang zum Treff anlegen. */
|
||||
const ich = await roh("/workspace/api/ich", CREW, { cookie: kDogi });
|
||||
let darf = [];
|
||||
try { darf = JSON.parse(ich.text).darf_anlegen || []; } catch { /* bleibt leer */ }
|
||||
ok(darf.includes("gast"),
|
||||
`und DogFather darf dort Community-Zugänge anlegen (${darf.join(", ")})`);
|
||||
|
||||
/* GEGENPROBE: Ein Modi darf das nicht — Zugänge vergibt DogFather.
|
||||
Ohne diese Zeile wäre die darüber auch dann grün, wenn es jeder
|
||||
dürfte. */
|
||||
const ichModi = await roh("/workspace/api/ich", CREW, { cookie: kModi });
|
||||
let darfModi = [];
|
||||
try { darfModi = JSON.parse(ichModi.text).darf_anlegen || []; } catch { /* leer */ }
|
||||
ok(!darfModi.includes("gast"),
|
||||
`ein Modi nicht (${darfModi.length ? darfModi.join(", ") : "gar nichts"})`);
|
||||
}
|
||||
|
||||
/* =======================================================================
|
||||
8. DIE REGELN NENNEN DIE ZAHLEN, DIE WIRKLICH GELTEN
|
||||
======================================================================= */
|
||||
melde("");
|
||||
melde("=== 8. Der Regeltext ===");
|
||||
{
|
||||
const a = await roh("/workspace/api/treff/regeln", TREFF, { cookie: kBo });
|
||||
const a = await roh("/workspace/api/treff/regeln", CREW, { cookie: kBo });
|
||||
const r = json(a);
|
||||
ok(a.code === 200 && r.mindestalter === treffModul.MINDESTALTER,
|
||||
`Mindestalter ${r.mindestalter} -- dieselbe Zahl wie im Code`);
|
||||
|
||||
Reference in New Issue
Block a user