Anrufer- und Webhook-Verarbeitung verbessern

This commit is contained in:
Sven committed 2026-11-02 15:58:53 +01:00
1 parent 7b3c187985
commit 9e71fe3a11
18 files changed
+1283 -111

No files matched your search

+20 -4
View File
@@ -32,6 +32,11 @@ Kartenadresse. Bestehende Jobs ohne Kartenadresse bleiben lesbar; zum Ergänzen
die vollständigen Jobdaten mit `map_url` erneut senden. Eine Schema-Migration ist
nicht erforderlich.
Der Telefonbuchimport über `POST /api/addresses` aktualisiert Name und Beschreibung,
erhält aber vorhandene Rollen, Kundenkennungen, Job-Zuordnungen und Sprungadressen.
Diese Felder werden nur durch vollständige Adressdaten über die Webhooks ersetzt;
so können dort beispielsweise mit `job_ids: []` alte Job-Zuordnungen entfernt werden.
```
SwyxWeb/
├── backend/ Spring Boot 4.1 (Java 21, Maven Wrapper)
@@ -339,14 +344,21 @@ Die Quittung nennt die vergebene Nummer und die Eingangszeit:
{ "id": 1, "receivedAt": "2026-08-24T12:38:01.563742294Z" }
```
**Angenommen wird beliebiges JSON** – Objekt wie Liste. Das aufrufende System muss sich an kein
Schema halten; die Startseite zeigt die Nutzlast unverändert. Nur die Kopfzeile eines Eintrags
Der generische Webhook nimmt **beliebiges JSON** an – Objekt wie Liste. Ausnahme:
`"type":"job"` und `POST /api/webhook/jobs` verlangen ein einzelnes Job-Objekt mit
positiver ganzzahliger `id` im Java-Long-Wertebereich und passenden Feldtypen.
Ungültige Jobs ergeben **HTTP 400**, werden nicht archiviert und erscheinen nicht im
Verlauf oder Ereignisstrom. Die Quittung gültiger Daten bestätigt die Annahme;
die MongoDB-Speicherung läuft weiterhin asynchron.
Die Startseite zeigt angenommene Nutzlasten unverändert. Nur die Kopfzeile eines Eintrags
fasst `name` und `number` zusammen, wenn es sie gibt, und zählt sonst Felder bzw. Einträge
([summarize](frontend/src/webhook.ts)).
| Endpunkt | Zweck |
|---|---|
| `POST /api/webhook` | Nachricht abliefern. `415` bei falschem Content-Type, `400` bei kaputtem JSON, `413` über der Größengrenze, `401` bei falschem Token |
| `POST /api/webhook/jobs` | Einen Job abliefern. Zusätzlich `400` bei fehlender/ungültiger `id` oder unpassenden Feldtypen; gilt auch für `"type":"job"` am generischen Webhook |
| `GET /api/webhook/events` | Strom für die Startseite (Server-Sent Events) |
| `GET /api/webhook/history` | Verlauf, damit ein später geöffneter Bereich die vorigen Nachrichten sieht |
| `DELETE /api/webhook/history` | Verlauf leeren – das macht der Knopf „Leeren" |
@@ -362,7 +374,9 @@ Zwei Vorkehrungen, damit dabei nichts verloren geht:
- Das Backend hält die letzten **50 Nachrichten** im Speicher ([WebhookService](backend/src/main/java/de/appcreation/swyxweb/webhook/WebhookService.java)).
Beim Wiederverbinden schickt der Browser die `Last-Event-ID` mit, und alles Jüngere wird
nachgeliefert. Über einen **Neustart hinaus wird nichts aufgehoben**.
nachgeliefert. Nachlieferung und Anmeldung am laufenden Strom sind gegen gleichzeitige
POSTs abgesichert; Ereignisse bleiben dabei in Id-Reihenfolge.
Über einen **Neustart hinaus wird nichts aufgehoben**.
- Alle 25 Sekunden geht ein Kommentar (`:ping`) durch die Leitung, damit ein Reverse Proxy die
ruhende Verbindung nicht kappt.
@@ -570,7 +584,9 @@ docker compose up -d --build
```
Die lokale `.env` enthält die interne Worker-Adresse, `WHISPER_THREADS`
(Standard: 4), die LLM-Einstellungen, den SwyxWeb-Port und die SwyxTray-Adresse. Compose liest sie
(Standard: 4), die LLM-Einstellungen, den SwyxWeb-Port und die SwyxTray-Adresse
einschließlich `APP_WEBSOCKET_PATH` und `APP_WEBSOCKET_SECURE`. Auch `APP_WEBHOOK_TOKEN`
und `SPRING_MONGODB_URI` werden an den Container weitergereicht. Compose liest sie
automatisch; auch die beiden VS-Code-
Backend-Startkonfigurationen laden diese Datei. `.env` ist aus Git und
Docker-Build-Kontext ausgeschlossen; [.env.example](.env.example) enthält