Files
DogFatherGitandClaude Opus 5 3bab6d9fbf Der Knopf auf der Umzugsseite ist jetzt ein echter Verweis
Hinweis von Filipe: Wenn etwas wie ein Knopf aussieht, muss man auch
draufdruecken koennen. Er hatte recht.

Meine urspruengliche Begruendung - die Adresse solle nur zum Lesen
dastehen, damit niemand versehentlich ein Lesezeichen auf den alten Weg
setzt - traegt nicht: Wer klickt, landet auf der NEUEN Adresse und setzt
sein Lesezeichen genau dort. Ein Element, das wie ein Knopf aussieht und
sich nicht wie einer verhaelt, ist eine Falle.

Der Knopf hat jetzt einen Hover- und einen Tastatur-Fokuszustand, und
beide Bewegungen entfallen bei prefers-reduced-motion.

Die Pruefung geht dabei einen Schritt weiter als vorher: Sie prueft nicht
mehr nur, WELCHE Anfragen zugeordnet werden, sondern ruft die Middleware
wirklich auf und sieht sich die ANTWORT an. Denn die Zuordnung kann
stimmen und die Seite trotzdem kaputt sein:

  - ein Platzhalter, der woertlich in der Seite steht statt eingesetzt zu
    werden
  - ein Knopf ohne Verweis (genau der Fall, den Filipe gemeldet hat)
  - HTML statt JSON fuer /workspace/api/ - ein noch offener Tab wuerde
    sonst die Hinweisseite als Daten zu lesen versuchen
  - und die wichtigste: dass die NEUE Adresse durchgelassen wird

31 Pruefungen, alle gruen. Gegenprobe gemacht: Dreht man den Knopf zurueck
zu einem div ohne Verweis, meldet die Pruefung 2 Fehler - sie haette den
gemeldeten Mangel also selbst gefunden.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-06 16:50:30 +02:00

125 lines
6.3 KiB
JavaScript

/* =====================================================================
Umzug des Creator Workspace auf eine eigene Adresse (06.09.2026)
Der Workspace liegt seit diesem Tag ausschliesslich auf
workspace.dogfather-universe.com
Unter der alten Adresse dogfather-universe.com/workspace/ gibt es ihn
nicht mehr — dort antwortet der Server mit 410 "Gone".
WARUM DER UMZUG: Chrome laesst neben der Hauptseite, deren Bereich "/"
die ganze Domain umfasst, keine zweite App auf derselben Adresse zu.
Unter dem alten Pfad liess sich der Workspace nur als Verknuepfung
ablegen, nie als richtige App installieren -- im Menue stand "Oeffnen in
DOGFATHER UNIVERSE" statt "Seite als App installieren". Das ist kein
Fehler, sondern Absicht (w3c/manifest Nr. 1180: verschachtelte Bereiche
auf einem Ursprung sind "strongly not recommended").
Der PFAD /workspace/ bleibt erhalten und wird weiterhin gebraucht --
allerdings nur noch unter der NEUEN Adresse. An ihm haengen 150
Server-Routen, 107 API-Aufrufe und 26 Server-Dateien; ihn wegzuschneiden
waere ein grosser Umbau ohne Gewinn, denn der Konflikt entstand durch
die gemeinsame ADRESSE, nicht durch den Pfad.
WARUM 410 UND NICHT 404: Beides heisst "gibt es hier nicht". 410 sagt
zusaetzlich "gab es, ist absichtlich weg, kommt nicht wieder" -- genau
der Sachverhalt. Suchmaschinen nehmen die Adresse dadurch schneller
heraus, und in einem Protokoll ist ein 410 sofort als gewollt zu
erkennen, waehrend ein 404 immer nach Versehen aussieht.
WARUM KEINE WEITERLEITUNG (Entscheidung von Filipe, 06.09.2026): Er
gibt den neuen Link selbst an Creator und Scouts weiter. Eine
Weiterleitung haette die alte Adresse auf unbestimmte Zeit am Leben
gehalten. Wichtig zu wissen: Wer die alte Adresse als App installiert
hatte, bekommt ab jetzt diese Hinweisseite -- nicht stillschweigend
nichts.
WARUM DIESE ENTSCHEIDUNG IN EINER EIGENEN DATEI STEHT: Sie hat zwei
Stellen, an denen ein Denkfehler teuer waere, und beide sieht man einer
Bedingung nicht an:
1. DIE NEUE ADRESSE DARF NIE BETROFFEN SEIN. Derselbe Dienst bedient
beide. Wer nicht auf den Hostnamen prueft, sperrt den Workspace
fuer alle aus -- sofort nach dem Neustart und ohne Vorwarnung.
2. "faengt an mit /workspace" trifft auch /workspaceXYZ und
/workspace-alt. Solche Pfade gehoeren nicht dazu.
Als eigene Funktion ist beides pruefbar, ohne den Server zu starten --
siehe pruef-workspace-umzug.mjs.
===================================================================== */
export const NEUE_ADRESSE = "https://workspace.dogfather-universe.com";
/** Die alten Adressen. Bewusst eine feste Liste und kein Muster: Ein
* Muster wie /dogfather-universe\.com$/ wuerde auch auf
* workspace.dogfather-universe.com passen -- und damit genau die neue
* Adresse abschalten, die es zu schuetzen gilt. */
const ALTE_HOSTS = new Set(["dogfather-universe.com", "www.dogfather-universe.com"]);
/**
* Ist das eine Anfrage an den ABGESCHALTETEN alten Ort des Workspace?
* @param {string} hostKopfzeile Inhalt des Host-Kopffeldes, ggf. mit Port
* @param {string} pfad req.path, also ohne Abfrageteil
*/
export function istAlteWorkspaceAdresse(hostKopfzeile, pfad) {
const host = String(hostKopfzeile || "").toLowerCase().split(":")[0];
if (!ALTE_HOSTS.has(host)) return false;
/* Genau "/workspace" oder alles darunter -- aber NICHT /workspaceXYZ. */
return pfad === "/workspace" || pfad.startsWith("/workspace/");
}
/* Kurze Seite statt einer nackten Fehlermeldung. Wer hier landet, hat
einen alten Link oder eine alte Verknuepfung -- er soll erfahren, wohin
der Workspace gezogen ist, statt vor einem leeren Fenster zu sitzen.
Der Knopf ist ein echter Verweis (Korrektur 06.09.2026, Hinweis von
Filipe). Zuerst stand die Adresse nur zum Lesen da, mit der Begruendung,
niemand solle versehentlich ein Lesezeichen auf den alten Weg setzen.
Das Argument traegt nicht: Wer klickt, landet auf der NEUEN Adresse und
setzt sein Lesezeichen genau dort. Etwas, das wie ein Knopf aussieht,
muss sich auch wie einer verhalten -- alles andere ist eine Falle.
Augenschonend dunkel wie der Rest der Seite. */
const HINWEIS = `<!doctype html>
<html lang="de"><head><meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="robots" content="noindex, nofollow">
<title>Umgezogen · Creator Workspace</title>
<style>
body{margin:0;min-height:100vh;display:grid;place-items:center;
background:#0b0d10;color:#e6ecf0;
font-family:system-ui,-apple-system,"Segoe UI",sans-serif;padding:1.5rem}
.kasten{max-width:34rem;text-align:center;line-height:1.7}
h1{font-size:1.5rem;margin:0 0 1rem;font-weight:650}
p{color:#9aa6b2;margin:0 0 1rem}
.adresse{display:inline-block;margin-top:.5rem;padding:.85rem 1.4rem;
background:#0674b9;color:#fff;border-radius:10px;text-decoration:none;
font-weight:600;letter-spacing:.01em;word-break:break-all;
transition:background .15s ease,transform .15s ease}
.adresse:hover,.adresse:focus-visible{background:#0a86d4;transform:translateY(-1px)}
.adresse:focus-visible{outline:3px solid #7fd0ec;outline-offset:3px}
@media (prefers-reduced-motion:reduce){.adresse{transition:none}
.adresse:hover,.adresse:focus-visible{transform:none}}
</style></head>
<body><div class="kasten">
<h1>Der Creator Workspace ist umgezogen</h1>
<p>Diese Adresse gibt es nicht mehr. Der Workspace hat jetzt eine eigene
Adresse — dadurch lässt er sich als richtige App installieren.</p>
<p>Bitte künftig hier anmelden:</p>
<a class="adresse" href="${NEUE_ADRESSE}/workspace/">workspace.dogfather-universe.com</a>
</div></body></html>`;
/** Express-Zwischenschritt: beantwortet die alte Adresse mit 410 Gone. */
export function workspaceUmzug(req, res, next) {
if (istAlteWorkspaceAdresse(req.get("host"), req.path)) {
/* Schnittstellen-Aufrufe bekommen JSON, keine HTML-Seite -- sonst
versucht ein alter, noch offener Browser-Tab die Hinweisseite als
Daten zu lesen und zeigt einen unverstaendlichen Fehler. */
if (req.path.startsWith("/workspace/api/")) {
return res.status(410).json({ fehler: "umgezogen", neueAdresse: NEUE_ADRESSE });
}
return res.status(410).type("html").send(HINWEIS);
}
next();
}