group editor implemented
Sonarqube Scanner / Prepare environment (push) Successful in 6s
Sonarqube Scanner / Build and test (push) Successful in 27s
Sonarqube Scanner / Deploy to Server (push) Failing after 7s
Sonarqube Scanner / SonarQube analysis (push) Failing after 1m14s

This commit is contained in:
Florian Zumpe
2026-10-18 16:33:12 +02:00
parent 9c4d5f6324
commit 31768ae907
28 changed files with 2361 additions and 55 deletions
+47
View File
@@ -864,3 +864,50 @@ Die Dateinamen und relativen Pfade unter `storage/` bleiben ausschließlich inte
Unter `tools/python/` liegen interaktive Skripte für Anlegen, Ändern, Erweitern, Wiederherstellen und Löschen von Routen, POIs, Bildern und Audio. Sie verwenden ausschließlich die Python-Standardbibliothek. Fehlende Parameter werden abgefragt. Antwortet ein vorgeschalteter Webserver mit HTTP 401, fragt die gemeinsame Request-Schicht Benutzername und Passwort ab und wiederholt den ursprünglichen Request.
Details und Aufrufbeispiele stehen in [`Python-Werkzeuge.md`](Python-Werkzeuge.md).
## Gruppenbearbeitung
Siehe [Gruppenbearbeitung.md](Gruppenbearbeitung.md). Alle Gruppenantworten sind
`no-store`. POST/DELETE prüfen einen übermittelten Origin gegen den Host.
| Methode und Pfad | Zweck |
| --- | --- |
| GET /api/groups | Gruppen der Sitzung auflisten; ohne Sitzung leere Liste |
| POST /api/groups | Mit routeId und creator_id eine unabhängige Kopie öffnen |
| POST /api/groups/join | Mit code (Array aus acht Unicode-Symbolen) und creator_id beitreten |
| POST /api/groups/:id/code | Als Besitzer neuen Einladungscode erzeugen |
| DELETE /api/groups/:id | Als Besitzer Einladung und Mitbearbeiterzugänge widerrufen |
Der Server setzt `wegwichtel_group_session` als geschütztes Cookie auf `/api`.
Nur Hashes werden gespeichert. Die creator_id allein erteilt keine Gruppenrechte.
Gruppenantworten enthalten id, route, role, active und revision; nur das Erzeugen
oder Erneuern liefert den Klartextcode und expiresAt (Unixsekunden).
Die bisherigen `/api/routes/:id/...`-Endpunkte prüfen auch den Gruppenzugang,
einschließlich GPX, Bilder und Audio. Unveröffentlichte Gruppenkopien sind nicht
öffentlich gelistet. GET liefert `X-Group-Route` und `X-Group-Revision`; Änderungen
müssen die geladene Revision als `If-Match` senden. Überlappende oder veraltete
Änderungen ergeben 409. Erfolgreiche Änderungen erhöhen die Revision. API-Clients
müssen Cookies beibehalten; Gruppenmedien können damit auch als normale Bild- und
Audio-Ressourcen abgerufen werden. Freigegebene Strecken bleiben schreibgeschützt.
### Stationssperren für gemeinsame Entwürfe
`POST /api/groups/routes/:routeId/pois/:poiId/lock` verwendet die berechtigte
Gruppensitzung. `{}` beansprucht eine freie Station. Antwort: `token`, `version`,
`mediaVersion`, `poi`. Eine vorhandene Bearbeitung ergibt 423 mit
`details.code=point-locked` und `details.replace`. Nach einer bestätigten Rückfrage
mit `{ "replace": "<angezeigter Schlüssel>" }` erneut senden. Eine inzwischen
veränderte Sperre braucht eine neue Bestätigung. `{ "token": "<eigener Schlüssel>" }`
aktualisiert den eigenen Inhaltsstand; `{ "release": true, "token": "…" }` gibt
nur die eigene Sperre frei. Fremde creator_id-Angaben werden nicht übernommen.
Laufende Schreibanfragen ergeben `point-busy` (423), ein verlorener Zugang zur
Bearbeitung `point-lost` (423), ein veränderter Stationsinhalt `point-changed` (409).
Für Schreibzugriffe auf `/api/routes/:id/pois/:poiId` und dessen Bild-/Tonpfade
sind `X-Poi-Lock: <token>` und `If-Poi-Match: <version>` erforderlich. Anstelle
von If-Match wird dort der Stationsinhalt geprüft. Erfolgreiche Antworten liefern
`X-Poi-Id` und `X-Poi-Version`, solange die Station existiert. Diese Version bei
mehreren Dateioperationen jeweils weiterverwenden. Eine neue Station wird über
den bisherigen POST angelegt und vor den weiteren Dateioperationen gesperrt.
Die Versionsabdrücke berücksichtigen Dateibytes, nicht bloß URLs oder Metadaten.