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>
87 lines
2.7 KiB
JSON
87 lines
2.7 KiB
JSON
{
|
||
// Gesamtsystem starten: im Debug-Panel "SwyxWeb starten (Backend + Frontend)" wählen.
|
||
"version": "0.2.0",
|
||
"configurations": [
|
||
{
|
||
"type": "java",
|
||
"name": "Backend (Spring Boot)",
|
||
"request": "launch",
|
||
"mainClass": "de.appcreation.swyxweb.BackendApplication",
|
||
"projectName": "backend",
|
||
"cwd": "${workspaceFolder}/backend",
|
||
"console": "internalConsole"
|
||
},
|
||
{
|
||
// Wie oben, aber der eingebaute SwyxTray-Mock wird über das Profil "mock"
|
||
// eingeschaltet (ohne das Profil gibt es ihn nicht) und /api/config zeigt
|
||
// auf ihn statt auf 192.168.180.135:17654 – so lässt sich die Startseite
|
||
// ohne echte Telefonanlage ausprobieren (eingehenden Anruf auslösen:
|
||
// siehe README).
|
||
"type": "java",
|
||
"name": "Backend (lokaler Test gegen SwyxTray-Mock)",
|
||
"request": "launch",
|
||
"mainClass": "de.appcreation.swyxweb.BackendApplication",
|
||
"projectName": "backend",
|
||
"cwd": "${workspaceFolder}/backend",
|
||
"console": "internalConsole",
|
||
"args": [
|
||
"--spring.profiles.active=mock",
|
||
"--app.websocket.host=localhost",
|
||
"--app.websocket.port=8080"
|
||
]
|
||
},
|
||
{
|
||
"type": "node-terminal",
|
||
"name": "Frontend (Vite + Chrome)",
|
||
"request": "launch",
|
||
"command": "npm run dev",
|
||
"cwd": "${workspaceFolder}/frontend",
|
||
// Wartet auf die von Vite ausgegebene URL und öffnet dann Chrome mit Debugger.
|
||
// Bewusst ohne "Local:"-Präfix im Muster: im Terminal steht dazwischen ANSI-Farbcode.
|
||
"serverReadyAction": {
|
||
"pattern": "(https?://localhost:[0-9]+)",
|
||
"uriFormat": "%s",
|
||
"action": "debugWithChrome",
|
||
"webRoot": "${workspaceFolder}/frontend"
|
||
}
|
||
},
|
||
{
|
||
"type": "node-terminal",
|
||
"name": "Frontend (nur Vite-Dev-Server)",
|
||
"request": "launch",
|
||
"command": "npm run dev",
|
||
"cwd": "${workspaceFolder}/frontend"
|
||
},
|
||
{
|
||
"type": "chrome",
|
||
"name": "Browser an laufenden Dev-Server hängen",
|
||
"request": "launch",
|
||
"url": "http://localhost:5173",
|
||
"webRoot": "${workspaceFolder}/frontend"
|
||
}
|
||
],
|
||
"compounds": [
|
||
{
|
||
"name": "SwyxWeb starten (Backend + Frontend)",
|
||
"configurations": ["Backend (Spring Boot)", "Frontend (Vite + Chrome)"],
|
||
"stopAll": true,
|
||
"presentation": {
|
||
"group": "swyxweb",
|
||
"order": 1
|
||
}
|
||
},
|
||
{
|
||
"name": "SwyxWeb starten (lokaler Test gegen SwyxTray-Mock)",
|
||
"configurations": [
|
||
"Backend (lokaler Test gegen SwyxTray-Mock)",
|
||
"Frontend (Vite + Chrome)"
|
||
],
|
||
"stopAll": true,
|
||
"presentation": {
|
||
"group": "swyxweb",
|
||
"order": 2
|
||
}
|
||
}
|
||
]
|
||
}
|