From 5e7fa9be05d54d7c196f727af00a1b132637d5e6 Mon Sep 17 00:00:00 2001 From: desfoto automation Date: Fri, 25 Sep 2026 20:08:25 +0200 Subject: [PATCH] fix: recover old GTIN service worker caches --- .ocauto/verify | 5 ++++- AGENTS.md | 3 ++- README.md | 2 ++ nginx.conf | 1 + scripts/build-site.py | 1 + site/gtin/aktualisieren/index.html | 31 ++++++++++++++++++++++++++++ site/gtin/js/aktualisieren.js | 33 ++++++++++++++++++++++++++++++ site/gtin/sw.js | 2 +- src/gtin/aktualisieren/index.html | 31 ++++++++++++++++++++++++++++ src/gtin/js/aktualisieren.js | 33 ++++++++++++++++++++++++++++++ tests/test_site.py | 1 + 11 files changed, 140 insertions(+), 3 deletions(-) create mode 100644 site/gtin/aktualisieren/index.html create mode 100644 site/gtin/js/aktualisieren.js create mode 100644 src/gtin/aktualisieren/index.html create mode 100644 src/gtin/js/aktualisieren.js diff --git a/.ocauto/verify b/.ocauto/verify index 01cb85e..093ab38 100755 --- a/.ocauto/verify +++ b/.ocauto/verify @@ -92,12 +92,13 @@ fi printf '\n== routes\n' for route in / /fotografie/ /businessfotografie/ /portrait-und-model/ /familie/ \ /minishootings/ /video/ /musik-und-buehne/ /social-media/ /projekte/ /ueber/ /kontakt/ /impressum/ /datenschutz/ \ - /gtin/ /gtin/impressum/ /gtin/datenschutz/; do + /gtin/ /gtin/impressum/ /gtin/datenschutz/ /gtin/aktualisieren/; do check_status "$base$route" 200 done check_redirect "$base/gtin" "$base/gtin/" check_redirect "$base/gtin/impressum" "$base/gtin/impressum/" check_redirect "$base/gtin/datenschutz" "$base/gtin/datenschutz/" +check_redirect "$base/gtin/aktualisieren" "$base/gtin/aktualisieren/" # The retired photo URL must keep working: it is the umbrella page now. check_redirect "$base/shootings" "$base/fotografie/" @@ -156,6 +157,8 @@ check_contains "$base/gtin/datenschutz/" "Cache API" check_contains "$base/gtin/datenschutz/" "nicht an einen Server übertragen" check_contains "$base/gtin/datenschutz/" 'name="robots" content="noindex, nofollow"' check_contains "$base/gtin/impressum/" 'name="robots" content="noindex, nofollow"' +check_contains "$base/gtin/aktualisieren/" 'name="robots" content="noindex, nofollow"' +check_status "$base/gtin/js/aktualisieren.js" 200 for route in / /fotografie/ /businessfotografie/ /portrait-und-model/ /familie/ \ /minishootings/ /video/ /musik-und-buehne/ /social-media/ /projekte/ /ueber/ \ /kontakt/ /impressum/ /datenschutz/; do diff --git a/AGENTS.md b/AGENTS.md index 00f194e..10715ec 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -95,7 +95,8 @@ them is a defect, not a style question: to a server. Its `/gtin/impressum/` and `/gtin/datenschutz/` pages are standalone, unlisted legal pages. The tool stays unlisted: no main-site navigation or page links, no sitemap entry, and `noindex,nofollow`; only the - tool links to its own legal pages, which never link back to the main site; + GTIN area links to its own legal pages, which never link back to the main site. + The unlisted `/gtin/aktualisieren/` page repairs old redirected app caches; - `access_log off` in `nginx.conf` — never enable request logging; - `error_log /dev/null crit;` in `nginx.conf` — never write an error-log file either; - fonts, scripts, styles and images are served from this origin only; diff --git a/README.md b/README.md index a87ddd1..eb11802 100644 --- a/README.md +++ b/README.md @@ -71,6 +71,8 @@ Werkzeug selbst verlinkt auf seine eigenständigen Rechtstexte unter `/gtin/impr `/gtin/` ohne Weiterleitung; jede Änderung am Werkzeug erhält eine neue Cache-Version. Die eigenständige Datenschutzerklärung liegt unter `/gtin/datenschutz/`; die Rechtstexte sind nicht mit denen des Hauptauftritts verknüpft. + Der unverlinkte Pfad `/gtin/aktualisieren/` entfernt eine fehlerhafte + Startantwort aus älteren Browser-Caches und öffnet das Werkzeug danach erneut. ## Herkunft der Inhalte diff --git a/nginx.conf b/nginx.conf index 167af91..cda6e76 100644 --- a/nginx.conf +++ b/nginx.conf @@ -67,6 +67,7 @@ server { location = /gtin { return 301 /gtin/; } location = /gtin/impressum { return 301 /gtin/impressum/; } location = /gtin/datenschutz { return 301 /gtin/datenschutz/; } + location = /gtin/aktualisieren { return 301 /gtin/aktualisieren/; } location = /gtin/manifest.webmanifest { default_type application/manifest+json; try_files $uri =404; diff --git a/scripts/build-site.py b/scripts/build-site.py index 1827eb9..481bdb3 100755 --- a/scripts/build-site.py +++ b/scripts/build-site.py @@ -45,6 +45,7 @@ UNLISTED_HTML = [ "gtin/index.html", "gtin/impressum/index.html", "gtin/datenschutz/index.html", + "gtin/aktualisieren/index.html", ] INK = (23, 20, 15) diff --git a/site/gtin/aktualisieren/index.html b/site/gtin/aktualisieren/index.html new file mode 100644 index 0000000..20d10d8 --- /dev/null +++ b/site/gtin/aktualisieren/index.html @@ -0,0 +1,31 @@ + + + + + + GTIN aktualisieren + + + + + + + +
+

GTIN aktualisieren

+

Das Werkzeug wird aktualisiert. Du wirst gleich weitergeleitet.

+

GTIN-Werkzeug öffnen

+
+ + + diff --git a/site/gtin/js/aktualisieren.js b/site/gtin/js/aktualisieren.js new file mode 100644 index 0000000..0a10688 --- /dev/null +++ b/site/gtin/js/aktualisieren.js @@ -0,0 +1,33 @@ +/* Entfernt die umgeleitete Startantwort aus frueheren GTIN-Caches. */ + +const status = document.querySelector('#status'); +const appUrl = new URL('../', window.location.href); +const alterIndex = new URL('index.html', appUrl).href; + +async function aktualisiereWerkzeug() { + if ('caches' in window) { + const namen = await caches.keys(); + for (const name of namen) { + if (!name.startsWith('desfoto-gtin-generator-')) continue; + const cache = await caches.open(name); + const antwort = await cache.match(alterIndex); + if (antwort?.redirected) await cache.delete(alterIndex); + } + } + + if ('serviceWorker' in navigator) { + const registrierung = await navigator.serviceWorker.getRegistration(appUrl.href); + if (registrierung) { + await Promise.race([ + registrierung.update().catch(() => undefined), + new Promise((resolve) => window.setTimeout(resolve, 5000)), + ]); + } + } + + window.location.replace(appUrl.href); +} + +aktualisiereWerkzeug().catch(() => { + status.textContent = 'Die Aktualisierung ist fehlgeschlagen. Bitte lösche die Website-Daten für desfoto.de in deinem Browser und öffne das Werkzeug erneut.'; +}); diff --git a/site/gtin/sw.js b/site/gtin/sw.js index 6811cfb..58daf42 100644 --- a/site/gtin/sw.js +++ b/site/gtin/sw.js @@ -10,7 +10,7 @@ const sw = /** @type {ServiceWorkerGlobalScope} */ (/** @type {unknown} */ (self)); -const CACHE_VERSION = '403b5842d1cd'; +const CACHE_VERSION = '76462b4916fd'; const CACHE_PREFIX = 'desfoto-gtin-generator-'; const CACHE_NAME = `${CACHE_PREFIX}${CACHE_VERSION}`; diff --git a/src/gtin/aktualisieren/index.html b/src/gtin/aktualisieren/index.html new file mode 100644 index 0000000..20d10d8 --- /dev/null +++ b/src/gtin/aktualisieren/index.html @@ -0,0 +1,31 @@ + + + + + + GTIN aktualisieren + + + + + + + +
+

GTIN aktualisieren

+

Das Werkzeug wird aktualisiert. Du wirst gleich weitergeleitet.

+

GTIN-Werkzeug öffnen

+
+ + + diff --git a/src/gtin/js/aktualisieren.js b/src/gtin/js/aktualisieren.js new file mode 100644 index 0000000..0a10688 --- /dev/null +++ b/src/gtin/js/aktualisieren.js @@ -0,0 +1,33 @@ +/* Entfernt die umgeleitete Startantwort aus frueheren GTIN-Caches. */ + +const status = document.querySelector('#status'); +const appUrl = new URL('../', window.location.href); +const alterIndex = new URL('index.html', appUrl).href; + +async function aktualisiereWerkzeug() { + if ('caches' in window) { + const namen = await caches.keys(); + for (const name of namen) { + if (!name.startsWith('desfoto-gtin-generator-')) continue; + const cache = await caches.open(name); + const antwort = await cache.match(alterIndex); + if (antwort?.redirected) await cache.delete(alterIndex); + } + } + + if ('serviceWorker' in navigator) { + const registrierung = await navigator.serviceWorker.getRegistration(appUrl.href); + if (registrierung) { + await Promise.race([ + registrierung.update().catch(() => undefined), + new Promise((resolve) => window.setTimeout(resolve, 5000)), + ]); + } + } + + window.location.replace(appUrl.href); +} + +aktualisiereWerkzeug().catch(() => { + status.textContent = 'Die Aktualisierung ist fehlgeschlagen. Bitte lösche die Website-Daten für desfoto.de in deinem Browser und öffne das Werkzeug erneut.'; +}); diff --git a/tests/test_site.py b/tests/test_site.py index fa70b5c..fb7d429 100644 --- a/tests/test_site.py +++ b/tests/test_site.py @@ -56,6 +56,7 @@ class BuildLayout(unittest.TestCase): "gtin/index.html", "gtin/impressum/index.html", "gtin/datenschutz/index.html", + "gtin/aktualisieren/index.html", } actual = {str(f.relative_to(SITE)) for f in SITE.rglob("*.html")} self.assertEqual(expected, actual)