Files
dogfather-universe/server/workspace-draussen.js
T
DogFatherGitandClaude Opus 5 eca9aed279 Der Treff sagt jetzt, ob gerade gestreamt wird
Filipe zu dieser Seite: "mach was anderes daraus oder mach es viel
krass und geiler ... erstell was was mich von den socken schmeisst. es
soll wirklich sogar ein wow effekt fuer die community ergeben." Dazu
die eine Auflage: die Kachel bleibt.

WAS SIE WAR: zwei Karten mit zwei Adressen. Sauber gebaut, richtig
beschriftet -- und niemand kam ein zweites Mal wieder. Wer im Treff
ist, kennt die Website. Den Rabattcode merkt man sich beim ersten Mal.

DIE FRAGE, DIE WIRKLICH JEMAND HAT, IST EINE ANDERE: Laeuft er
gerade? Und wenn nicht -- wie lange noch? Die Antwort kennt das Haus
seit dem 20.08.: postfach.dogfather-universe.com/live-status, derselbe
Dienst, von dem der oeffentliche Streamplan lebt. Im Treff gab es sie
bisher nicht.

Jetzt steht oben ein Puls: ein Ring, der sich ueber den Tag bis zur
naechsten Sendezeit fuellt, darin der Countdown auf die Sekunde. Sendet
er, wird die Karte rot, atmet im Ruhepuls und traegt den Titel des
Streams plus einen Weg hin. Darunter die drei Accounts und -- wenn die
Verwaltung eines eintraegt -- das besondere Event mit eigener Uhr.

DREI AUSGAENGE, NICHT ZWEI. Das ist der eigentliche Unterschied zur
oeffentlichen Seite: streamplan.js faengt dort jeden Fehler ab und
setzt `istLive = false`. Aus "wir konnten nicht fragen" wird "er sendet
nicht" -- und wer das liest, macht die Seite zu und verpasst den
Stream. Der Dienst liefert `autoHealthy` sogar mit; gelesen wird es
draussen nicht. Hier schon: Bei einer Stoerung steht "Konnten wir
gerade nicht nachsehen", dazu der Hinweis, dass das NICHT heisst, dass
kein Stream laeuft. Der Countdown laeuft dabei weiter -- er braucht
kein Netz.

NICHTS IST ABGESCHRIEBEN. Die drei Accounts kommen ueber
/workspace/api/draussen aus derselben KANAELE-Liste, an der die
Aufgabenverteilung haengt; die Adressen baut der Steckbrief. Die
Sendezeit steht im Server, und pruef-draussen haelt sie gegen
FIX_STUNDE in streamplan.js -- verschiebt jemand den Termin und aendert
nur einen Ort, wird die Pruefung rot.

Gemessen, bevor gebaut wurde: der Dienst antwortet und meldet sich
gesund, CORS steht auf *, und `connect-src` der Treff-Seiten fuehrt
postfach bereits. Ohne das Letzte waere der Abruf still blockiert
worden und haette ausgesehen wie ein toter Dienst.

Die Kachel heisst jetzt "Draussen" statt "Unsere Seiten" -- drei Dinge
statt zwei Adressen. Ziel und Datei bleiben gleich.
pruef-wege-nach-draussen schreibt den Namen nicht mehr ab, sondern
verlangt, dass Kachel und Seitenueberschrift uebereinstimmen. Zwei
Namen fuer denselben Ort waren schon einmal ein echter Fehler.

Nebenbefund, dort gleich behoben: Dieselbe Pruefung verlangte, dass
die Community-Kacheln restlos in Dreierreihen aufgehen -- obwohl ihr
eigener Kommentar sagt, eine freie Zelle am Ende sei erlaubt. Sie war
rot bei einwandfreiem Raster. Gemessen wird jetzt, was wirklich
schiefgeht: eine doppelt breite Kachel, die in der letzten Spalte
beginnt und die Zelle davor leer laesst. Mit Gegenprobe.

pruef-draussen: 39 Pruefungen, alle vier Lagen im echten Browser --
die Stoerung wird dafuer absichtlich hergestellt.
pruef-wege-nach-draussen: 67 statt 66, keine Fehler mehr.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-21 12:06:23 +02:00

122 lines
5.5 KiB
JavaScript

/* =====================================================================
DRAUSSEN (21.09.2026) — was die Community-Seite "Unsere Seiten"
braucht, damit sie nichts abschreiben muss.
Filipe: "mach was anderes aus dieser seite oder mach es viel krass
und geiler ... lass dir was uebelst geiles einfallen und ueberrasch
mich ... erstell was was mich von den socken schmeisst. es soll
wirklich sogar ein wow effekt fuer die community ergeben."
---------------------------------------------------------------------
WAS DIESE SEITE VORHER WAR UND WAS DARAN FEHLTE
Zwei Karten mit zwei Adressen. Sauber gebaut, richtig beschriftet --
und trotzdem beantwortete sie keine Frage, die jemand wirklich hat.
Wer im Treff ist, kennt die Website. Der Rabattcode war das Einzige,
wofuer man wiederkam, und den merkt man sich beim ersten Mal.
DIE FRAGE, DIE DIE COMMUNITY WIRKLICH HAT, IST EINE ANDERE: Laeuft
er gerade? Und wenn nicht -- wie lange noch?
Auf die Antwort gibt es bereits einen Dienst im Haus:
postfach.dogfather-universe.com/live-status, derselbe, von dem der
oeffentliche Streamplan lebt. Er wird hier NICHT nachgebaut und auch
nicht durchgereicht -- der Browser fragt ihn direkt, so wie draussen
auch. Nachgemessen, bevor darauf gebaut wurde:
- der Dienst antwortet und meldet sich selbst als gesund
("autoHealthy": true, zuletzt geprueft vor drei Minuten)
- "access-control-allow-origin: *", die Treff-Adresse darf fragen
- die Inhaltsrichtlinie der Treff-Seiten fuehrt postfach bereits
in `connect-src` -- der Abruf waere sonst still blockiert worden
und haette ausgesehen wie ein toter Dienst
---------------------------------------------------------------------
WAS HIER BLEIBT: DIE KANAELE
Die drei TikTok-Accounts stehen als KANAELE in workspace.js -- sie
sind dort die eine Liste, an der die Aufgabenverteilung haengt. Die
Community-Seite bekommt sie von dort und schreibt sie NICHT ab.
Warum das keine Kleinigkeit ist: Am selben Tag stand in dieser Liste
"@hasidog00804" statt "@hasidog0804" -- eine Null zu viel. Zwei
Pruefungen hatten denselben Tippfehler abgeschrieben und waren
deshalb gruen. Eine dritte Abschrift auf einer Seite, die
Zuschauerinnen sehen, waere ein toter Link gewesen, den niemand
meldet, weil niemand weiss, dass er falsch ist.
DIE ADRESSE WIRD EBENFALLS ABGELEITET, nicht zusammengesetzt: Der
Steckbrief weiss bereits, wie eine TikTok-Adresse aus einem Handle
entsteht (KANAELE.tiktok.adresse). Stuende das Muster hier ein
zweites Mal, gaebe es zwei Stellen, die sich bei einer Aenderung
widersprechen koennen.
---------------------------------------------------------------------
WER DAS SEHEN DARF
Jede angemeldete Person. Nicht weil es egal waere, sondern weil hier
nichts steht, was nicht ohnehin oeffentlich ist: Dieselben drei
Accounts sind von dogfather-universe.com aus verlinkt, fuer alle.
Das ist BEWUSST ANDERS als `kanaeleFuer` in workspace-bereiche.js,
wo die Community die Kanalliste ausdruecklich NICHT bekommt. Dort
geht es um die Frage "wohin soll diese Arbeit" -- eine interne
Entscheidung, und wer sie nicht treffen darf, soll auch nicht die
Auswahl sehen. Hier geht es um "wo finde ich ihn". Dieselben Daten,
zwei verschiedene Fragen; deshalb zwei Wege und nicht einer, der
beides halb macht.
===================================================================== */
import express from "express";
import { sitzungLesen, KANAELE } from "./workspace.js";
import { KANAELE as KANAL_ARTEN } from "./workspace-steckbrief.js";
/* DIE FESTE SENDEZEIT.
Sie steht auch in assets/js/streamplan.js der oeffentlichen Seite
(`FIX_STUNDE`). Zwei Zahlen, die dasselbe bedeuten, laufen
irgendwann auseinander -- und es faellt niemandem auf, weil beide
fuer sich plausibel aussehen. Deshalb haelt pruef-draussen die
beiden Orte gegeneinander; verschiebt jemand den Termin und aendert
nur einen, wird die Pruefung rot und sagt, welche Datei fehlt.
WARUM SIE NICHT IN DER VERWALTUNG STEHT: Sie hat sich seit dem
20.08.2026 nicht geaendert. Eine Oberflaeche fuer eine Zahl, die man
einmal im Jahr anfasst, ist mehr Pflege als Nutzen -- und ein Feld,
das niemand benutzt, steht irgendwann falsch. Sobald sich der
Termin oefter bewegt, gehoert er dorthin.
Fuer eine ABWEICHUNG ist sie ohnehin nicht zustaendig: Sendet er
einmal frueher, sagt das der Live-Status, und der kommt vom Dienst,
nicht von dieser Zahl. */
export const SENDEZEIT_STUNDE = 20;
export const draussenRouter = express.Router();
draussenRouter.get("/workspace/api/draussen", (req, res) => {
const person = sitzungLesen(req);
if (!person) return res.status(401).json({ fehler: "nicht_angemeldet" });
try {
const kanaele = KANAELE.map((k) => {
const ohneAt = k.handle.replace(/^@/, "");
return {
wert: k.wert,
name: k.name,
handle: k.handle,
adresse: KANAL_ARTEN.tiktok.adresse(ohneAt),
satz: k.fuerDraussen || k.text,
};
});
/* KEIN ZWISCHENSPEICHER MIT LAUFZEIT. Die Liste aendert sich nur,
wenn jemand den Quelltext aendert -- dann startet der Dienst neu,
und ein Stempel waere ohnehin hinfaellig. Eine Laufzeit wuerde
hier nur eine Frage beantworten, die niemand stellt. */
res.json({ kanaele, sendeStunde: SENDEZEIT_STUNDE });
} catch (fehler) {
console.error("[workspace] Draussen:", fehler.message);
res.status(500).json({ fehler: "nicht_verfuegbar" });
}
});