Nach dem HANSETRANS Brandbook (2025/10): Grün #68B022 als Akzent,
HANSETRANS Grau als Wortmarken-Farbe, Überschriften gemischt geschrieben
mit negativer Laufweite, Bildmarke (Achteck mit Fahrbahn-Schwung) als
SVG angenähert. Umschalter in der Kopfzeile neben dem Verbindungsstatus,
per data-brand am Wurzelelement; Wahl samt Favicon und Titel bleibt über
Neustarts erhalten.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Der Adressdaten-Bereich verliert den Neu-laden-Knopf samt
Telefonbuch-Abgleich und Wartedialog – die Ablage hält sich über
Cache-Push und die Abfragen der Suche aktuell. Anrufen erscheint nur
noch bei bestehender Verbindung zur Tray-App, eine Suche ohne Treffer
zeigt nichts weiter an. Erklärtexte in Adressdaten und Tabs entfernt,
ebenso das Rohnachricht-Formular im Diagnose-Bereich.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Bei einer Methodenreferenz wird der Empfänger zum Parameter des
funktionalen Interfaces, dessen @NonNull-Annotation die Eclipse-Analyse
nicht zusichern kann; als Lambda übernimmt der Parameter die Annotation.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Die Sammlung addresses führt für alle Quellen (Webhooks Kunden/Kuriere,
SwyxTray-Telefonbuch) nur noch Rufnummer, Name und Beschreibung; alte
Felder receivedAt/source werden beim Upsert entfernt. GET /api/addresses
sucht mit ?q= als Teilzeichenkette in allen drei Feldern. Der Bereich
"Adressdaten" hält keinen Bestand mehr im Browser: Jede Eingabe fragt
entprellt die Datenbank ab, das Suchfeld startet leer.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Die zuletzt erfolgreich verbundene SwyxTray-Adresse landet im localStorage;
beim Laden der Seite wird damit sofort wieder verbunden, manuelles Trennen
vergisst sie. Untertitel, Backend-Hinweis und Webhook-Erklärtexte entfernt.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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>
Die feste Adresse 192.168.180.135 der SwyxTray-App wird überall durch
127.0.0.1 ersetzt: Die App läuft auf dem Arbeitsplatz des Anwenders, die
Verbindung bleibt damit auf dem Rechner und braucht keine Firewall-Freigabe.
Scheitert der Verbindungsaufbau, weil eine über HTTPS ausgelieferte Seite
kein unverschlüsseltes ws:// öffnen darf, meldet der Browser nur "The
operation is insecure." – describeConnectFailure() benennt stattdessen den
Grund und den Ausweg (wss:// oder Loopback).
node_modules/ wird nun auf jeder Ebene ignoriert, nicht nur unter frontend/.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Drei Stränge, die sich über dieselben Dateien ziehen (HomePage, index.css,
README, application.properties) und deshalb nicht getrennt committet werden
können, ohne einen nicht übersetzbaren Zwischenstand zu hinterlassen:
Adressdaten: Der Bereich zeigt den gesamten Bestand des globalen Telefon-
buchs - zuerst aus dem Adress-Cache der App (Protokoll 8), sonst über das
Kommando "addresses" und ersatzweise aus rund 110 Einzelabfragen hinter
einem Wartedialog. Der Mock gibt denselben Bestand heraus und lässt sich
über /api/mock/address-cache leeren, um die Rückfallebene zu prüfen.
Mock hinter dem Profil "mock": Seine Bohnen (/ws und /api/mock/**) hängen
jetzt an @Profile, sind ohne das Profil also nicht vorhanden. Damit kann
der Mock nicht versehentlich in einer Produktivumgebung mitlaufen; das
Container-Image setzt das Profil nicht. Je ein Test hält beide Richtungen
fest.
Webhook: POST /api/webhook nimmt beliebiges JSON eines fremden Systems an
und reicht es über Server-Sent Events an die offenen Browser weiter, wo es
der neue Bereich "Webhook" unverändert anzeigt. Der WebSocket kam dafür
nicht in Frage - er gehört der SwyxTray-App. Das Backend hält die letzten
50 Nachrichten vor und liefert sie beim Wiederverbinden anhand der
Last-Event-ID nach; ein Heartbeat und X-Accel-Buffering: no halten die
Verbindung durch Reverse Proxys hindurch offen. Ein Token (app.webhook.token)
ist vorgesehen, aber nicht voreingestellt.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Der Tag des Images soll bewusst gesetzt werden, nicht aus der pom.xml
hergeleitet. Ohne Argument bricht das Skript mit der Kurzhilfe ab.
Damit entfällt die Auswertung der pom.xml über den Maven-Wrapper - das
Skript braucht backend/mvnw nicht mehr und startet ohne Maven-Lauf. Das
Format ist wieder strikt x.y.z; die Ausnahme fuer -SNAPSHOT gab es nur,
weil die pom.xml als Vorgabe diente.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Ein Container liefert Startseite und REST-API über Port 8080 aus: Das
Dockerfile baut das Frontend mit Node, legt das Ergebnis in die statischen
Ressourcen des Backends und packt beides mit Maven zum Jar; die Laufzeit-
stufe enthält nur ein JRE und das Jar, ausgeführt als Benutzer swyx.
Die beiden Build-Stufen laufen auf $BUILDPLATFORM, also nativ auf dem
bauenden Rechner - JS-Bundle und Jar sind architekturunabhängig. Nur das
Laufzeit-Image wird für die Zielarchitektur gezogen, was beim Bauen für
linux/amd64 auf einem ARM-Mac die Emulation spart.
docker_push.sh liest die Version aus backend/pom.xml, baut für linux/amd64
und pusht in die Registry.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Die README beschreibt die Compound-Konfiguration "SwyxWeb starten
(Backend + Frontend)" als Weg, das Projekt zu starten – dann muss sie
auch im Repo liegen. Persönliche Einstellungen (.vscode/settings.json)
bleiben ausgeschlossen.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>