diff --git a/server/pruef-anleitung.mjs b/server/pruef-anleitung.mjs index 2a41291f..761ca90c 100644 --- a/server/pruef-anleitung.mjs +++ b/server/pruef-anleitung.mjs @@ -1359,6 +1359,58 @@ melde("\n=== Die Pflege auf der Crew-Adresse (Kapitel 11) ==="); + `(pflegen ${vj?.darf_pflegen}, abhaken ${vj?.darf_abhaken})`); } +/* ===================================================================== + JEDE CREW-ROLLE ERKLAERT GENAU IHRE EIGENEN KACHELN + --------------------------------------------------------------------- + Dieselbe Frage, die weiter oben fuer die Agentur beantwortet wird -- + dort gegen die Kachelliste aus dem Browser, hier gegen die Liste, + die der SERVER schickt. Zwei Haeuser, zwei Quellen (siehe den Kopf + dieser Datei), eine Frage. + + DIE ABNAHME NENNT SIE AUSDRUECKLICH: „Community: ... keine Karte zu + Team-Kacheln." Eine einzelne Karte zu einer Seite, die ein Mitglied + nie oeffnet, waere schlimmer als eine fehlende: Sie erklaert jemandem + eine Arbeit, die nicht seine ist, mit einem Knopf, der ihn gegen eine + Tuer schickt. + + IN BEIDE RICHTUNGEN, und das ist der Punkt: „fehlt" faengt die + vergessene Karte zu einer neuen Kachel, „zuviel" die + stehengebliebene zu einer entfernten. Mit nur einer Richtung waere + immer die andere offen. */ +melde("\n=== Jede Crew-Rolle erklaert genau ihre eigenen Kacheln ==="); +for (const rolle of ["gast", "modi", "linke", "hand"]) { + const ich = await roh("/workspace/api/ich", CREW_HOST, null, kekse[rolle]); + let kacheln = []; + try { kacheln = JSON.parse(ich.text)?.bereiche || []; } catch { /* bleibt leer */ } + const soll = new Set(kacheln.map((k) => B.schluesselVonZiel(k.ziel)).filter(Boolean)); + /* Die Seite erklaert sich nicht selbst. */ + soll.delete("anleitung"); + const ist = new Set(((await holen(rolle, CREW_HOST)).j?.karten || []).map((k) => k.kachel)); + const fehlt = [...soll].filter((x) => !ist.has(x)); + const zuviel = [...ist].filter((x) => !soll.has(x)); + ok(soll.size > 0 && fehlt.length === 0 && zuviel.length === 0, + fehlt.length || zuviel.length + ? `${rolle.padEnd(6)} stimmt nicht -- ohne Karte: ${fehlt.join(", ") || "nichts"}; ` + + `ohne Kachel: ${zuviel.join(", ") || "nichts"}` + : `${rolle.padEnd(6)} erklaert genau seine ${soll.size} Kacheln`); + /* GEGENPROBE, EINMAL: Dieselbe Rechnung mit der FALSCHEN Kachelliste + muss anschlagen. Ohne sie waeren die vier Zeilen darueber auch + dann gruen, wenn `soll` und `ist` versehentlich aus derselben + Quelle kaemen -- und dann verglichen sie etwas mit sich selbst. */ + if (rolle === "gast") { + const ichHand = await roh("/workspace/api/ich", CREW_HOST, null, kekse.hand); + let fremd = []; + try { fremd = JSON.parse(ichHand.text)?.bereiche || []; } catch { /* leer */ } + const sollFremd = new Set(fremd.map((k) => B.schluesselVonZiel(k.ziel)).filter(Boolean)); + sollFremd.delete("anleitung"); + const abweichung = [...sollFremd].filter((x) => !ist.has(x)).length + + [...ist].filter((x) => !sollFremd.has(x)).length; + ok(abweichung > 0, + `Gegenprobe: an der Kachelliste der rechten Hand gemessen passt es ` + + `NICHT (${abweichung} Unterschiede)`); + } +} + /* ---------- Abschluss ------------------------------------------------ */ try { rmSync(ordner, { recursive: true, force: true }); } catch { /* egal */ } console.log(`\n${fehler ? "FEHLER: " + fehler : "Alles in Ordnung"} — ${geprueft} Prüfungen`);