MongoDB-Ablage für Adressen, Anrufe und Jobs; Webhook-URLs je Datenart

Adress-, Anruf- und Jobdaten landen dauerhaft in der MongoDB
(ArchiveService, best-effort auf eigenem Thread): Die Startseite meldet
Adress-Cache und Anruf-Ereignisse an POST /api/addresses bzw. /api/calls,
der Webhook legt seine Nutzlasten selbst ab. Adressen tragen eine
generierte Kennung, die Rufnummer erkennt per Upsert die Dublette.

Der Webhook bekommt je Datenart eine eigene URL – /api/webhook/kunden,
/api/webhook/kuriere, /api/webhook/jobs –, die URL bestimmt die Ablage,
ein Kennzeichen in der Nutzlast ist nicht mehr nötig. Die Herkunft steht
als channel am Ereignis. Der generische POST /api/webhook bleibt.

Die Controller-Tests ersetzen den ArchiveService (MockitoBean) und
laufen damit ohne MongoDB. Markenrot laut Styleguide in beiden Farbmodi.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
SvenandClaude Fable 5 committed 2026-08-27 10:24:53 +02:00
1 parent 1598852785
commit 97c3778180
21 files changed
+1011 -26

No files matched your search

+22
View File
@@ -0,0 +1,22 @@
import type { CallEvent } from './swyx/protocol'
/**
* Meldet Anruf-Ereignisse an das Backend, das sie in der MongoDB ablegt.
*
* Die Ereignisse entstehen nur hier im Browser (aus dem Vergleich zweier
* SwyxTray-Snapshots); das Backend sieht die WebSocket-Verbindung nicht.
* Fire-and-forget: Ist das Backend nicht erreichbar, läuft die Anzeige
* unverändert weiter – die Speicherung ist Beiwerk, nicht Voraussetzung.
*/
export function reportCallEvents(events: CallEvent[]): void {
if (events.length === 0) return
void fetch('/api/calls', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(events),
// Auch beim Schließen des Tabs noch absetzen, z. B. das "ended" beim Auflegen.
keepalive: true,
}).catch((e: unknown) => {
console.warn('Anrufdaten nicht an das Backend gemeldet:', e)
})
}