108 lines
6.2 KiB
Markdown
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).
|