feat(backend): Taiga-Proxy — vier schmale Endpunkte, Ziel-URL aus der Server-Konfiguration (D91, #trk.create.proxy)
API First: /taiga/auth, /taiga/projects, /taiga/userstories, /taiga/tasks in der OpenAPI-Spec; TaigaClient/TaigaProperties in de.werkbaum.integration.taiga. Die API-URL kommt aus WERKBAUM_TAIGA_API_URL (nie Request-Parameter — SSRF), das Token je Aufruf im Header X-Taiga-Token (Authorization muessen OpenAPI-Werkzeuge als Header-Parameter ignorieren) und geht als Bearer hinaus; der Server speichert nichts und loggt keine Request-Bodies. Taiga-4xx werden samt _error_message durchgereicht, 5xx/Netz sind 502, unkonfiguriert 503 — und GET /info meldet das Feature (taiga). Tests gegen aufgezeichnete Antwortformen auf einem JDK-HttpServer-Stub (statt WireMock: keine neue Test-Abhaengigkeit, dieselbe Zusicherung); Gegenprobe: ohne den type-Durchreich faellt genau der benannte Test. check gruen, 93 % Coverage. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
5a18505571
commit
fd0e730656
+16
-2
@@ -17,6 +17,18 @@ geplante Owner-Passwort binden (`#col.live.owner` im Plan) — Endpunkte so
|
||||
schneiden, dass die Berechtigungsprüfung dazukommen kann, ohne die Signatur
|
||||
zu brechen.
|
||||
|
||||
**Taiga-Proxy (D91):** schmale, benannte Endpunkte unter `/api/v1/taiga/*`
|
||||
(auth, projects, userstories, tasks) in `de.werkbaum.integration.taiga`
|
||||
(`TaigaClient` + `TaigaProperties`), Controller in `api`. Die Basis-URL der
|
||||
Taiga-**API** ist Server-Konfiguration (`werkbaum.taiga.api-url` bzw.
|
||||
`WERKBAUM_TAIGA_API_URL`), **nie** Request-Parameter — die SSRF-Falle
|
||||
naiver Proxies. Das Token kommt je Aufruf im Header `X-Taiga-Token`
|
||||
(eigener Name: `Authorization` müssen OpenAPI-Werkzeuge als Header-Parameter
|
||||
ignorieren, und er kollidierte mit dem Master-Passwort) und geht als
|
||||
`Authorization: Bearer …` hinaus; der Server speichert nichts und **loggt
|
||||
keine Request-Bodies** — der Auth-Endpunkt sieht das Passwort nur im
|
||||
Durchflug. Unkonfiguriert: 503, und `GET /info` meldet `taiga: false`.
|
||||
|
||||
## Konventionen
|
||||
- Kotlin, **Spring Boot 4**, Gradle (Kotlin DSL), JDK 21.
|
||||
- Paketwurzel `de.werkbaum`; Schichten: `api` (Controller), `domain`,
|
||||
@@ -28,8 +40,10 @@ zu brechen.
|
||||
- Tests mit JUnit 5 als Runner + **Kotest-Assertions** (`shouldBe`,
|
||||
`shouldContain`, `shouldThrow`) und MockK; Verhalten per Cucumber gegen die
|
||||
laufende Anwendung (`RestTestClient`, nicht TestRestTemplate — das ist in
|
||||
Boot 4 Auslaufmodell). Taiga-Client gegen aufgezeichnete Antworten
|
||||
(WireMock), nie gegen Live-Instanzen.
|
||||
Boot 4 Auslaufmodell). Taiga-Client gegen aufgezeichnete Antworten,
|
||||
nie gegen Live-Instanzen — umgesetzt mit dem JDK-eigenen `HttpServer`
|
||||
als Stub (`TaigaClientTest`/`TaigaApiTest`) statt WireMock: keine neue
|
||||
Test-Abhängigkeit, dieselbe Zusicherung.
|
||||
- Konfiguration über `application.yaml` + Umgebungsvariablen;
|
||||
keine Zugangsdaten im Repository.
|
||||
- Keine neuen **Laufzeit**-Abhängigkeiten ohne Rückfrage (Wurzel-CLAUDE.md);
|
||||
|
||||
Reference in New Issue
Block a user