- Der Service-Worker-Cache wurde nie invalidiert: die letzte Runde hat
offline.html in allen vier Zielen ersetzt, sw.js aber nicht angefasst.
Ein Browser installiert einen Service Worker nur neu, wenn sich sw.js
selbst aendert — bestehende Installationen haetten die alte, englische,
ungestaltete Offline-Seite dauerhaft behalten. CACHE_NAME hochgezaehlt.
Dabei faengt der Install jetzt einen fehlgeschlagenen Abruf ab; vorher
wurde bei einem Fehler der ganze Service Worker nicht aktiv.
- Die Leaflet-Marker kamen von cdnjs.cloudflare.com — in einer PWA, die im
Wald ohne Empfang benutzt wird, waren sie damit kaputt, und die IP jedes
Besuchers ging an ein fremdes CDN. Verwiesen wurde ausserdem auf Leaflet
1.7.1 bei installiertem 1.9.4. Die Bilder liegen im Paket und werden jetzt
gebuendelt; Vite bettet sie als data:-URI ein (zusammen ~4 KB).
- Die Adress-Autovervollstaendigung im Benutzerformular rief Nominatim
weiterhin direkt aus dem Browser auf, obwohl d9fecb6 dafuer einen Proxy
eingefuehrt hat — nur die PLZ-Suche nutzte ihn. Neu: searchAddresses() in
utils/geocode.js (teilt Wartezeit und Cache mit geocodeAddress) plus
GET /api/public/geocode/search unter demselben geocodeLimiter. Die Antwort
ist auf die Felder beschraenkt, die das Formular liest. Der Debounce steigt
von 400 auf 600 ms, weil die Anfragen jetzt durch die serverseitige
Mindestwartezeit laufen.
Geprueft: im Bundle kein cdnjs und kein nominatim mehr; der neue Endpunkt
liefert Treffer mit den erwarteten Feldern, zu kurze Begriffe 400.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- UserCard.js ließ sich nicht übersetzen: die öffnende Hälfte des Ternary
um den GPS-Bereich ({isEditingGPS ? () fehlte, während das ") : (" und
das ")}" stehen geblieben waren. isEditingGPS wurde dadurch nur noch
gesetzt, nie gelesen. Da die Datei in allen drei Apps identisch ist,
scheiterte überall der Build.
- Der Einladungs-Flow aus 8384ad9 war nur zur Hälfte da: Backend und
Login-Formular verlangen einen Invite-Token, aber kein Frontend hat
/invite-token je aufgerufen – der Admin konnte gar keinen erzeugen und
ein Führer ohne Passwort kam nicht ins System. Die Benutzerkarte hat
jetzt einen Button dafür (nur bei hinterlegter E-Mail), verdrahtet über
UserList und AdminPanel.
- api.js: bei einem Fehler ohne Request-Config lief der Retry-Zweig in
"config.retry = 2" auf undefined und verdeckte den echten Fehler.
- useUsers: "mehr laden" hat die aktiven Filter verworfen und die
ungefilterte zweite Seite angehängt. Mit dem serverseitigen Typfilter
aus d9fecb6 fällt das jetzt deutlich stärker auf.
- Die öffentliche Liste zeigte statt des Telefon-Emojis ein kaputtes
Ersatzzeichen.
- Der Logo-Upload nannte SVG als erlaubtes Format, das Backend lehnt es
bewusst ab.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- Docker: bind all backend/frontend ports to 127.0.0.1 only (was 0.0.0.0)
- Docker: add shared jagd-network; portal uses container names instead of host ports
- Fix: set-password endpoints now require valid invite token (drohnenfuehrer, stoeberhunde)
- Fix: auth cookie secure flag enabled in production
- Fix: password reset token no longer logged in production
- Add: inviteLimiter (10/15min) on set-password routes in all three apps
- Add: importUsers capped at 500 entries to prevent DoS
- Refactor: rename handler -> drohnenfuehrer/stoeberhundefuehrer across all apps