Files
Florian Zumpe 9c4d5f6324
Sonarqube Scanner / Prepare environment (push) Successful in 7s
Sonarqube Scanner / Build and test (push) Successful in 23s
Sonarqube Scanner / SonarQube analysis (push) Successful in 56s
Sonarqube Scanner / Deploy to Server (push) Successful in 8s
editor overhaul
2026-10-18 14:26:25 +02:00

108 lines
6.2 KiB
Markdown

# Erstellerkennung und erneutes Einsenden
Beim App-Start entsteht ein kryptografischer Zufallswert mit 256 Bit über
`crypto.getRandomValues()`. Er liegt als 64-stellige Hexadezimalzeichenfolge
unter `wegwichtel.creator-id.v1` im Local Storage. Keine Zeitzone, Geräteangaben
oder Informationen über den Internetanbieter werden gesammelt. Ein zusätzlicher
Hash würde die Eindeutigkeit des Zufallswerts nicht erhöhen.
Neue Entwürfe bekommen `route.creator_id`; alte lokale Entwürfe bekommen sie
beim nächsten Speichern. Beim Einsenden landet sie in `routes.creator_id`.
Die API liefert das Feld, die Moderations-CLI zeigt die Ersteller-ID. Bereits
zugeordnete Server-Strecken behalten ihren Ersteller bei Änderungen. Strecken
älterer Versionen können beim ersten erneuten Einsenden zugeordnet werden.
## Speicherung und Löschen
Das Ausschalten des Offline-Speichers, Löschen von Fortschritt, Entwürfen oder
Medien löscht die Gerätekennung nicht. Es gibt keine automatische Bereinigung
dieses getrennten Speicherschlüssels. Die gezielte Entwicklerfunktion
`Wegwichtel.LocalRoutes.forgetCreatorId()` entfernt die Kennung ausschließlich
nach ausdrücklich bestätigter Internetbrowser-Abfrage. Es wird kein zusätzlicher
Löschbutton in die Kinderoberfläche eingebaut. Nach bestätigtem Löschen entsteht
beim nächsten Zugriff eine neue Kennung; vorhandene Strecken behalten ihre alte
Erstellerzuordnung. Die App kann das Löschen sämtlicher Website-Daten in den
Einstellungen des Internetbrowsers nicht verhindern. Kopierte Browserdaten
kopieren auch die Identität; das ist keine Hardware-ID.
## Aktualisieren einer eingesandten Strecke
Der lokale Entwurf bleibt erhalten und merkt sich `serverRouteId`,
`serverPoiId`, `serverPictureId` und den Audio-Status. Erneutes Einsenden nutzt
PUT für bestehende Daten und POST für neue Stationen/Bilder. Entfernte lokale
Stationen und Medien werden bei einer erfolgreichen erneuten Übertragung auch
auf dem Server entfernt. Bestätigte Server-IDs werden nach jedem Schritt
lokal gespeichert, damit ein späterer Fehler nicht zum Neuanlegen der Strecke
führt. Der Entwurf bleibt nach Fehlern erneut einsendbar.
Freigegebene Strecken bleiben unveränderlich. Die Prüfung erfolgt vor der
Aktualisierung und zusätzlich in den vorhandenen Server-Schreibprüfungen.
Bei älteren Entwürfen fehlen noch die gespeicherten Stations-/Bild-IDs: Beim
ersten erneuten Einsenden werden neue Stationen samt Medien angelegt und die
alten Stationen anschließend entfernt. Die Strecken-ID bleibt gleich. Deshalb
können sich bei dieser einmaligen Übernahme die Stations-IDs ändern.
Die Übertragung mehrerer Dateien ist keine gemeinsame Transaktion. Bei einem
Abbruch können einzelne Änderungen bereits auf dem Server sein. Bei einem
verlorenen HTTP-Erfolg nach serverseitigem POST ist zusätzlich eine spätere
Idempotenzlösung erforderlich. Parallele Bearbeitung ist noch nicht freigegeben;
die aktuelle Übertragung behandelt den lokalen Entwurf als vollständigen Stand.
## Fehlende Server-Strecke, Papierkorb und lokaler Status
Beim Öffnen der Entwurfsliste werden lokale Strecken sofort angezeigt. Bereits
abgesandte Strecken werden im Hintergrund mit `includeDeleted=true` geprüft.
Liegt die Strecke im Papierkorb, wird lokal „Abgelehnt“ angezeigt. Existiert die
Server-ID auch mit dieser Abfrage nicht mehr (HTTP 404), erscheint „Entfernt“.
Der Status wird auf dem Gerät gespeichert und bleibt ohne Internet sichtbar.
Fehlende Berechtigung, Netzwerk- und Serverfehler verändern ihn nicht.
Eine erfolgreiche Abfrage nach manueller Wiederherstellung entfernt den alten
Ablehnungsstatus. Ungespeicherte Eingaben werden durch die Prüfung nicht ersetzt.
Beim bewussten erneuten Einsenden einer entfernten oder abgelehnten Strecke
werden alte Server-Zuordnungen für Strecke, Stationen, Bilder und Ton entfernt.
Der lokale Inhalt und seine Dateireferenzen bleiben erhalten. Eine neue Strecke
mit neuer ID und derselben Erstellerkennung wird zur Prüfung angelegt. Der alte
Papierkorb-Eintrag wird nicht wiederhergestellt oder verändert. Die neue Strecke
muss erneut freigegeben werden. Bestätigte neue IDs werden auch bei einem späteren
Übertragungsfehler gespeichert; weitere Versuche setzen dort fort.
Nach erfolgreicher neuer Einreichung wird der Status gelöscht und angezeigt:
„Die Strecke wurde neu angelegt und zur Prüfung gesendet.“ Eine vorhandene,
noch nicht freigegebene Strecke wird unter derselben ID aktualisiert und erhält
die normale Erfolgsmeldung. Freigegebene Strecken bleiben gegen Änderungen gesperrt.
Nur eine bestätigte 404-Antwort oder ein bestätigter Papierkorb-Status löst eine
neue Einreichung aus, keine Netzwerk-, Berechtigungs- oder anderen Serverfehler.
## Datenbank und Betrieb
Das Schema und die Startprüfung enthalten die nullable Spalte
`routes.creator_id`. Neue Datenbanken enthalten sie direkt. Es gibt keine
automatische Migration einer vorhandenen Datenbank; `npm run init-db` allein
fügt einer schon bestehenden Tabelle keine Spalte hinzu. Bestehende Strecken
dürfen für diese Änderung nicht gelöscht werden. Für die vorhandene Datenbank
ist vor dem Neustart folgende gezielte Schemaergänzung nötig:
```sql
ALTER TABLE routes ADD COLUMN creator_id TEXT;
```
Die Anwendung vorher anhalten und die Datenbank sichern. Den tatsächlichen
Datenbankpfad aus `DATA_DIR` in `.env` verwenden. Die Anweisung nur einmal
anwenden und anschließend `npm run test:runtime-db` ausführen, dann die App
starten. Nicht die Datenbank oder Streckenverzeichnisse löschen.
## Berechtigungen
`creator_id` ist Metadatum, kein Passwort und kein Eigentumsnachweis. Eine frei
übermittelte Kennung gewährt keine Berechtigung. Bestehende Zugriffsregeln bleiben
wirksam. Abgesicherte Eigentumszuordnung, Einladungen und gemeinsame Bearbeitung
stehen in [TODO-MODERATION.md](agents/TODO-MODERATION.md) weiterhin aus.
Die GPS-Aufzeichnung läuft nur innerhalb einer Bearbeitungssitzung. Schließen,
Abbrechen, Rückkehr zur Liste, Streckenwechsel und Verlassen der Seite beenden
sie; ein Neustart übernimmt keinen aktiven Aufzeichnungszustand. Beim erneuten
Öffnen eines lokalen Entwurfs beginnt eine neue Sitzung mit ausgeschalteter
Aufnahme. Der Schalter „Meinen Weg aufnehmen“ aktiviert sie. Einzelheiten stehen in
[GPX-Aufzeichnung.md](agents/GPX-Aufzeichnung.md).