feat(api): extend Masterdata API with CRUD endpoints for Pferde and Funktionäre

- Added full CRUD support for Pferde (list, search, get by ID, create, update, delete) with filters for Jahrgang and BesitzerId.
- Introduced FunktionaerController, offering CRUD operations for Funktionäre (list, search, get by ID, create, update, delete) with filtering by Rolle.
- Enhanced HorseController and ReiterController with updated data models, additional request validation, and detailed filtering options.
- Extended backend configurations to register new controllers and route handlers.
- Updated roadmaps and progress documents to reflect completed Sprint B-1 tasks.

Signed-off-by: Stefan Mogeritsch <stefan.mo.co@gmail.com>
This commit is contained in:
2026-04-03 10:12:27 +02:00
parent 2dd5453365
commit 2270f9602f
11 changed files with 811 additions and 83 deletions
@@ -0,0 +1,93 @@
# 👷 Session-Log: B-1 CRUD Reiter/Pferde/Vereine/Funktionäre + A-1 E2E Re-enable
> **Datum:** 3. April 2026
> **Agent:** 👷 Backend Developer
> **Betroffene Roadmap-Punkte:** A-1, B-1
---
## Zusammenfassung
Diese Session hat die fehlenden CRUD-Endpunkte für alle vier Stammdaten-Entitäten implementiert
und den Tenant-Isolation-E2E-Test reaktiviert.
---
## Durchgeführte Änderungen
### A-1 — E2E-Isolationstest re-enabled
- `@Disabled`-Annotation und zugehöriger Import aus `EntriesIsolationIntegrationTest.kt` entfernt.
- Der Test war bereits vollständig konfiguriert (Testcontainers, DynamicPropertySource, Spring-Properties);
lediglich die Annotation blockierte die Ausführung.
- Klarstellung in Roadmap: Tenant-Isolation-Rollout auf weitere Services entfällt — per ADR-0021 ist
nur der Entries-Service Multi-Tenant; masterdata/events/zns-import sind Single-Tenant.
### B-1 — Vollständiges CRUD für alle vier Entitäten
#### `ReiterController` (erweitert)
- Neu: `GET /reiter` (Liste, Filter: `lizenzKlasse`, `vereinId`, Pagination)
- Neu: `POST /reiter` (Create mit `ReiterCreateRequest`)
- Neu: `PUT /reiter/{id}` (Update mit `ReiterUpdateRequest`, Patch-Semantik)
- Neu: `DELETE /reiter/{id}`
- Bestehend beibehalten: `GET /reiter/search`, `GET /reiter/{id}`, `GET /reiter/satznummer/{nr}`
#### `HorseController` (erweitert)
- Neu: `GET /horse` (Liste, Filter: `jahrgang`, `besitzerId`, Pagination)
- Neu: `POST /horse` (Create mit `HorseCreateRequest`)
- Neu: `PUT /horse/{id}` (Update mit `HorseUpdateRequest`, Patch-Semantik)
- Neu: `DELETE /horse/{id}`
- Bestehend beibehalten: `GET /horse/search`, `GET /horse/{id}`, `GET /horse/lebensnummer/{nr}`
- DTO erweitert: `farbe`, `chipNummer`, `passNummer`, `besitzerId`, `vaterName`, `mutterName`, `stockmass`,
`bemerkungen`
#### `VereinController` (erweitert)
- Neu: `GET /verein` (Liste, Filter: `verband` → Bundesland, Pagination)
- Neu: `POST /verein` (Create mit `VereinCreateRequest`)
- Neu: `PUT /verein/{id}` (Update mit `VereinUpdateRequest`, Patch-Semantik)
- Neu: `DELETE /verein/{id}`
- Bestehend beibehalten: `GET /verein/search`, `GET /verein/{id}`, `GET /verein/nummer/{nr}`
- DTO erweitert: `plz`, `strasse`, `email`, `telefon`, `website`, `oepsRegionNummer`, `bemerkungen`
#### `FunktionaerController` (neu erstellt)
- `GET /funktionaer` (Liste, Filter: `rolle`, Pagination)
- `GET /funktionaer/search?q=...`
- `GET /funktionaer/{id}`
- `GET /funktionaer/richternummer/{nr}`
- `POST /funktionaer` (Create mit Enum-Validierung für `rollen`, `richterQualifikation`, `qualifiziertFuerSparten`)
- `PUT /funktionaer/{id}` (Update, Patch-Semantik)
- `DELETE /funktionaer/{id}`
### Infrastruktur-Anpassungen
| Datei | Änderung |
|-------------------------------|--------------------------------------------------------------------------------|
| `MasterdataApiModule.kt` | `FunktionaerController` als Parameter + Route-Registrierung |
| `MasterdataConfiguration.kt` | `@Bean fun funktionaerController(...)` hinzugefügt |
| `KtorServerConfiguration.kt` | `FunktionaerController` als Bean-Parameter + Übergabe an `masterdataApiModule` |
| `RegulationControllerTest.kt` | `funktionaerController = mockk(relaxed = true)` ergänzt |
---
## Offene Punkte (nicht in dieser Session)
- **A-3 / B-3**: Sonderregeln & ÖTO-Validierung — wartet auf 📜 Rulebook B-2 Übergabe
- **B-1 OpenAPI**: Springdoc-Dokumentation für neue Endpunkte
- **B-1 E2E-Tests**: CRUD-Flows Turnier → Bewerb → Abteilung
- **B-2**: Kassa-Service
---
## Kompilierung
```
./gradlew :backend:services:masterdata:masterdata-api:compileKotlin \
:backend:services:masterdata:masterdata-service:compileKotlin \
:backend:services:entries:entries-service:compileTestKotlin
```
✅ Keine Fehler.