Files

109 lines
5.3 KiB
Markdown

---
phase: quick
plan: 260923-ku6
type: quick
autonomous: true
requirements: []
---
# Quick Task 260923-ku6: Drei Nachbesserungen aus dem Browser-Rundgang (Proxmox-Modul)
## Objective
Drei im Browser-Rundgang zu Quick-Task 260923-dhh gefundene Fehler beheben, ohne den
Funktionsumfang sonst zu veraendern:
1. „Verbindung testen" prueft den gespeicherten Stand statt der Formularwerte.
2. Ein frisch angelegter, noch nie abgefragter Server zeigt faelschlich die Sammelmeldung
„Ein unerwarteter Fehler ist aufgetreten" statt eines ruhigen „noch keine Abfrage"-Zustands.
3. Die CSS-Klasse `uppercase` faerbt in der Modulseiten-Zeile die ganze Zeile (inkl. Adresse)
gross statt nur das Produktkuerzel.
## Context
- Quelle: menschlicher Browser-Rundgang zu `.planning/quick/260923-dhh-proxmox-modul-pve-pbs-und-pmg-anbinden-n/260923-dhh-PLAN.md`.
- Betroffene Dateien: `apps/api/src/proxmox/proxmox.controller.ts`, `apps/api/src/proxmox/proxmox.service.ts`,
`apps/api/src/proxmox/dto/proxmox-server.dto.ts`, `apps/web/src/lib/proxmox-api.ts`,
`apps/web/src/app/(portal)/modules/proxmox/settings/components/ServerForm.tsx`,
`apps/web/src/app/(portal)/modules/proxmox/components/ServerCard.tsx`,
`apps/web/src/messages/de.json`, `apps/web/src/messages/en.json`.
## Tasks
### Task 1: Verbindungstest prueft Formularwerte statt gespeicherten Stand (Befund 1)
<task type="auto">
<files>
apps/api/src/proxmox/dto/proxmox-server.dto.ts
apps/api/src/proxmox/proxmox.service.ts
apps/api/src/proxmox/proxmox.controller.ts
apps/api/src/proxmox/proxmox.service.spec.ts
apps/web/src/lib/proxmox-api.ts
apps/web/src/app/(portal)/modules/proxmox/settings/components/ServerForm.tsx
apps/web/src/app/(portal)/modules/proxmox/settings/components/ServerForm.test.tsx
</files>
<action>
Backend: neues `TestProxmoxServerDto` (alle Felder optional, wie `UpdateProxmoxServerDto`).
`POST servers/:id/test` nimmt diesen Body entgegen und mischt ihn mit dem gespeicherten
Server: pro Feld gilt „im Formular gesendet und nicht leer -> Formularwert, sonst
gespeicherter Wert" (Geheimnisfelder: nicht gesendet/leer -> gespeicherter, verschluesselter
Wert bleibt bestehen und wird wie ueblich entschluesselt). Neue Route `POST servers/test`
(ohne `:id`) fuer die Neuanlage — testet ausschliesslich mit den Formularwerten, ohne
gespeicherten Fallback. Beide Routen rufen denselben privaten Merge-Baustein auf; dieser
wird per Unit-Test abgedeckt (leeres Geheimnisfeld -> gespeicherter Wert bleibt; gefuelltes
Geheimnisfeld -> neuer Wert greift; abgeschaltete Zertifikatspruefung im Formular wird
uebernommen). Zugangsdaten weiterhin nicht in Log/Antwort (bestehende Riegel unveraendert).
Frontend: `testServer`/neue `testDraftServer`-Funktion senden immer den vollstaendigen
aktuellen Formularstand. `ServerForm` zeigt den Testen-Knopf immer (nicht nur nach dem
Speichern) und waehlt je nach `savedServer` die passende Funktion.
</action>
<verify>cd apps/api && pnpm vitest run src/proxmox/proxmox.service.spec.ts && cd ../web && pnpm vitest run src/app/\(portal\)/modules/proxmox/settings/components/ServerForm.test.tsx</verify>
<done>Ein Test zeigt: gespeicherter Server mit im Formular abgeschalteter Zertifikatspruefung
-> Testergebnis beruecksichtigt die abgeschaltete Pruefung (nicht mehr `zertifikat`-Fehler).
Ein zweiter Test zeigt: leer gelassenes Geheimnisfeld nutzt weiterhin den gespeicherten Wert.
Der Testen-Knopf funktioniert auch ohne gespeicherten Server.</done>
</task>
### Task 2: Ruhiger Zustand fuer "noch nie abgefragt" (Befund 2)
<task type="auto">
<files>
apps/web/src/app/(portal)/modules/proxmox/components/ServerCard.tsx
apps/web/src/app/(portal)/modules/proxmox/components/ServerCard.test.tsx
apps/web/src/messages/de.json
apps/web/src/messages/en.json
</files>
<action>
Neuer Uebersetzungsschluessel `proxmox.card.notPolledYet` (DE/EN), der auf den Knopf
„Jetzt aktualisieren" verweist. In `ServerCard`: wenn `status.lastPolledAt === null` (noch
keine Abfrage gelaufen), erscheint dieser ruhige Hinweis statt des Fehlerblocks — auch wenn
`status.reachable` false ist (Zustand direkt nach dem Anlegen). Die bestehenden
Fehlermeldungen (inkl. `unbekannt`) bleiben fuer den Fall `lastPolledAt !== null &&
!reachable` unveraendert.
</action>
<verify>cd apps/web && pnpm vitest run src/app/\(portal\)/modules/proxmox/components/ServerCard.test.tsx</verify>
<done>Ein Test zeigt: Status mit `lastPolledAt: null, reachable: false, errorKind: null`
zeigt den ruhigen Hinweistext und NICHT die Meldung "Ein unerwarteter Fehler ist
aufgetreten". Bestehende Fehlermeldungs-Tests bleiben gruen.</done>
</task>
### Task 3: uppercase nur auf Produktkuerzel (Befund 3)
<task type="auto">
<files>
apps/web/src/app/(portal)/modules/proxmox/components/ServerCard.tsx
</files>
<action>
`uppercase` von der Zeile auf ein `<span>` um `server.productType` verschieben; die Adresse
bleibt unveraendert dargestellt.
</action>
<verify>cd apps/web && pnpm vitest run src/app/\(portal\)/modules/proxmox/components/ServerCard.test.tsx</verify>
<done>Adresse erscheint in der Modulseiten-Zeile nicht mehr grossgeschrieben, Produktkuerzel weiterhin schon.</done>
</task>
## Gesamtverifikation
Nach allen drei Aufgaben: `pnpm --filter api test`, `pnpm --filter web test`,
`pnpm type-check`, `pnpm lint`, `pnpm --filter web exec biome check .` (Warnungszahl exakt
53) muessen unveraendert/gruen sein, keine Container-Neubauten, keine Browser-Pruefung.