401 lines
8.9 KiB
Markdown
401 lines
8.9 KiB
Markdown
---
|
||
modul: api-overview
|
||
status: active
|
||
last_reviewed: 2025-10-22
|
||
review_cycle: 180d
|
||
summary: Überblick und Einstieg in die REST‑APIs der Meldestelle.
|
||
yt_epic: MP-1
|
||
yt_issues: [MP-7]
|
||
tags: [api, overview]
|
||
---
|
||
|
||
# Meldestelle – REST‑API Dokumentation
|
||
|
||
## Überblick
|
||
|
||
Die Meldestelle-Anwendung bietet eine umfassende REST API für die Verwaltung von Pferdesportveranstaltungen. Die API folgt RESTful-Prinzipien und ist in modulare Services unterteilt, die jeweils spezifische Domänen abdecken.
|
||
|
||
## API-Architektur
|
||
|
||
### Modulare Service-Struktur
|
||
|
||
Die API ist in folgende Hauptmodule unterteilt:
|
||
|
||
```
|
||
API Services
|
||
├── Members API # Mitgliederverwaltung
|
||
├── Horses API # Pferderegistrierung
|
||
├── Events API # Veranstaltungsverwaltung
|
||
└── Masterdata API # Stammdatenverwaltung
|
||
├── Countries # Länderverwaltung
|
||
├── States # Bundesländerverwaltung
|
||
├── Age Classes # Altersklassenverwaltung
|
||
└── Venues # Plätze/Austragungsorte
|
||
```
|
||
|
||
### Technische Spezifikationen
|
||
|
||
- **Framework**: Spring Boot 3.x mit Spring Web MVC
|
||
- **Dokumentation**: OpenAPI 3.0 (Swagger)
|
||
- **Serialisierung**: JSON mit Jackson/Kotlinx Serialization
|
||
- **Authentifizierung**: JWT Bearer Token
|
||
- **Versionierung**: URL-basiert (/api/v1/)
|
||
- **Content-Type**: application/json
|
||
- **Zeichenkodierung**: UTF-8
|
||
|
||
## Basis-URL und Endpunkte
|
||
|
||
### Entwicklungsumgebung
|
||
```
|
||
Base URL: http://localhost:8081/api
|
||
```
|
||
|
||
### Produktionsumgebung
|
||
```
|
||
Base URL: https://api.meldestelle.yourdomain.com/api
|
||
```
|
||
|
||
## API-Module Übersicht
|
||
|
||
### 1. Members API
|
||
**Basis-Pfad**: `/api/members`
|
||
|
||
Verwaltung von Vereinsmitgliedern und deren Mitgliedschaftsdaten.
|
||
|
||
**Hauptfunktionen**:
|
||
- Mitgliederverwaltung (CRUD)
|
||
- Mitgliedschaftsstatus-Tracking
|
||
- Ablaufende Mitgliedschaften
|
||
- Validierung von E-Mail und Mitgliedsnummer
|
||
|
||
**Controller**: `MemberController`
|
||
**Endpunkte**: 12 REST-Endpunkte
|
||
**Dokumentation**: [Members API](members-api.md)
|
||
|
||
### 2. Horses API
|
||
**Basis-Pfad**: `/api/horses`
|
||
|
||
Registrierung und Verwaltung von Pferden mit umfassenden Identifikationsdaten.
|
||
|
||
**Hauptfunktionen**:
|
||
- Pferderegistrierung (CRUD)
|
||
- Identifikationsnummern-Verwaltung
|
||
- OEPS/FEI-Registrierung
|
||
- Besitzer- und Verantwortlichen-Zuordnung
|
||
|
||
**Controller**: `HorseController`
|
||
**Endpunkte**: 15+ REST-Endpunkte
|
||
|
||
### 3. Events API
|
||
**Basis-Pfad**: `/api/events`
|
||
|
||
Planung und Verwaltung von Pferdesportveranstaltungen.
|
||
|
||
**Hauptfunktionen**:
|
||
- Veranstaltungsplanung (CRUD)
|
||
- Terminverwaltung
|
||
- Teilnehmerverwaltung
|
||
- Öffentliche/Private Veranstaltungen
|
||
|
||
**Controller**: `VeranstaltungController`
|
||
**Endpunkte**: 10+ REST-Endpunkte
|
||
|
||
### 4. Masterdata API
|
||
**Basis-Pfad**: `/api/masterdata`
|
||
|
||
Verwaltung von Stammdaten für das gesamte System.
|
||
|
||
#### 4.1 Countries API
|
||
**Pfad**: `/api/masterdata/countries`
|
||
- Länderverwaltung mit ISO-Codes
|
||
- EU/EWR-Mitgliedschaft
|
||
- Mehrsprachige Ländernamen
|
||
|
||
#### 4.2 States API
|
||
**Pfad**: `/api/masterdata/states`
|
||
- Bundesländer/Kantone/Regionen
|
||
- OEPS-Codes für österreichische Bundesländer
|
||
- ISO 3166-2 Codes
|
||
|
||
#### 4.3 Age Classes API
|
||
**Pfad**: `/api/masterdata/age-classes`
|
||
- Altersklassen für verschiedene Sparten
|
||
- Teilnahmeberechtigung
|
||
- Geschlechts- und Spartenfilter
|
||
|
||
#### 4.4 Venues API
|
||
**Pfad**: `/api/masterdata/venues`
|
||
- Turnierplätze und Austragungsorte
|
||
- Platztypen und Abmessungen
|
||
- Bodenarten und Eignung
|
||
|
||
**Controller**: `CountryController`, `BundeslandController`, `AltersklasseController`, `PlatzController`
|
||
**Endpunkte**: 37+ REST-Endpunkte
|
||
|
||
## Gemeinsame API-Konventionen
|
||
|
||
### HTTP-Status-Codes
|
||
|
||
| Status Code | Bedeutung | Verwendung |
|
||
|-------------|-----------|------------|
|
||
| 200 | OK | Erfolgreiche GET/PUT-Anfragen |
|
||
| 201 | Created | Erfolgreiche POST-Anfragen |
|
||
| 204 | No Content | Erfolgreiche DELETE-Anfragen |
|
||
| 400 | Bad Request | Ungültige Anfragedaten |
|
||
| 401 | Unauthorized | Fehlende/ungültige Authentifizierung |
|
||
| 403 | Forbidden | Unzureichende Berechtigung |
|
||
| 404 | Not Found | Ressource nicht gefunden |
|
||
| 409 | Conflict | Duplikat oder Geschäftsregel-Verletzung |
|
||
| 422 | Unprocessable Entity | Validierungsfehler |
|
||
| 500 | Internal Server Error | Serverfehler |
|
||
|
||
### Standard-Response-Format
|
||
|
||
Alle API-Endpunkte verwenden ein einheitliches Response-Format:
|
||
|
||
```json
|
||
{
|
||
"data": {},
|
||
"success": true,
|
||
"message": "Operation completed successfully",
|
||
"errors": [],
|
||
"timestamp": "2025-07-25T12:37:00Z"
|
||
}
|
||
```
|
||
|
||
#### Erfolgreiche Antwort
|
||
```json
|
||
{
|
||
"data": {
|
||
"id": "123e4567-e89b-12d3-a456-426614174000",
|
||
"firstName": "Max",
|
||
"lastName": "Mustermann",
|
||
"email": "max@example.com"
|
||
},
|
||
"success": true,
|
||
"message": null,
|
||
"errors": [],
|
||
"timestamp": "2025-07-25T12:37:00Z"
|
||
}
|
||
```
|
||
|
||
#### Fehler-Antwort
|
||
```json
|
||
{
|
||
"data": null,
|
||
"success": false,
|
||
"message": "Validation failed",
|
||
"errors": [
|
||
"Email address is required",
|
||
"First name must not be empty"
|
||
],
|
||
"timestamp": "2025-07-25T12:37:00Z"
|
||
}
|
||
```
|
||
|
||
### Paginierung
|
||
|
||
Für Listen-Endpunkte wird standardmäßig Paginierung unterstützt:
|
||
|
||
**Query-Parameter**:
|
||
- `limit`: Maximale Anzahl Ergebnisse (Standard: 100, Maximum: 1000)
|
||
- `offset`: Anzahl zu überspringende Ergebnisse (Standard: 0)
|
||
|
||
**Beispiel-Anfrage**:
|
||
```
|
||
GET /api/members?limit=50&offset=100
|
||
```
|
||
|
||
**Paginierte Antwort**:
|
||
```json
|
||
{
|
||
"data": {
|
||
"content": [],
|
||
"page": 2,
|
||
"size": 50,
|
||
"totalElements": 1250,
|
||
"totalPages": 25,
|
||
"hasNext": true,
|
||
"hasPrevious": true
|
||
},
|
||
"success": true,
|
||
"timestamp": "2025-07-25T12:37:00Z"
|
||
}
|
||
```
|
||
|
||
### Suchfunktionalität
|
||
|
||
Viele Endpunkte unterstützen Suchfunktionalität:
|
||
|
||
**Query-Parameter**:
|
||
- `search`: Suchbegriff für Textfelder
|
||
- `name`: Suche nach Namen (Teilübereinstimmung)
|
||
- `active`: Filter für aktive/inaktive Einträge
|
||
|
||
**Beispiel**:
|
||
```
|
||
GET /api/members?search=Schmidt&active=true&limit=20
|
||
```
|
||
|
||
### Sortierung
|
||
|
||
Sortierung wird über Query-Parameter gesteuert:
|
||
|
||
**Query-Parameter**:
|
||
- `sort`: Sortierfeld (z.B. `name`, `createdAt`)
|
||
- `order`: Sortierrichtung (`asc` oder `desc`)
|
||
|
||
**Beispiel**:
|
||
```
|
||
GET /api/members?sort=lastName&order=asc
|
||
```
|
||
|
||
## Authentifizierung und Autorisierung
|
||
|
||
### JWT Bearer Token
|
||
|
||
Alle API-Endpunkte (außer öffentlichen) erfordern Authentifizierung über JWT Bearer Token:
|
||
|
||
```http
|
||
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
|
||
```
|
||
|
||
### Rollen und Berechtigungen
|
||
|
||
| Rolle | Beschreibung | Berechtigungen |
|
||
|-------|--------------|----------------|
|
||
| ADMIN | Systemadministrator | Vollzugriff auf alle Ressourcen |
|
||
| TRAINER | Trainer/Ausbilder | Zugriff auf Pferde und Veranstaltungen |
|
||
| MEMBER | Vereinsmitglied | Zugriff auf eigene Daten |
|
||
| GUEST | Gast | Nur Lesezugriff auf öffentliche Daten |
|
||
|
||
## Rate Limiting
|
||
|
||
Zum Schutz der API vor Überlastung gelten folgende Limits:
|
||
|
||
- **Authentifizierte Benutzer**: 1000 Anfragen/Stunde
|
||
- **Nicht authentifizierte Benutzer**: 100 Anfragen/Stunde
|
||
- **Burst-Limit**: 50 Anfragen/Minute
|
||
|
||
Bei Überschreitung wird HTTP 429 (Too Many Requests) zurückgegeben.
|
||
|
||
## Fehlerbehandlung
|
||
|
||
### Validierungsfehler (422)
|
||
|
||
```json
|
||
{
|
||
"data": null,
|
||
"success": false,
|
||
"message": "Validation failed",
|
||
"errors": [
|
||
{
|
||
"field": "email",
|
||
"message": "Email address is invalid",
|
||
"code": "INVALID_EMAIL"
|
||
},
|
||
{
|
||
"field": "membershipNumber",
|
||
"message": "Membership number already exists",
|
||
"code": "DUPLICATE_MEMBERSHIP_NUMBER"
|
||
}
|
||
],
|
||
"timestamp": "2025-07-25T12:37:00Z"
|
||
}
|
||
```
|
||
|
||
### Geschäftsregel-Verletzungen (409)
|
||
|
||
```json
|
||
{
|
||
"data": null,
|
||
"success": false,
|
||
"message": "Business rule violation",
|
||
"errors": [
|
||
"Membership end date cannot be before start date"
|
||
],
|
||
"timestamp": "2025-07-25T12:37:00Z"
|
||
}
|
||
```
|
||
|
||
## API-Dokumentation
|
||
|
||
### Swagger/OpenAPI
|
||
|
||
Die vollständige API-Dokumentation ist über Swagger UI verfügbar:
|
||
|
||
- **Entwicklung**: http://localhost:8080/swagger-ui.html
|
||
- **Produktion**: https://api.meldestelle.at/swagger-ui.html
|
||
|
||
### Postman Collections
|
||
|
||
Postman Collections für alle API-Endpunkte sind verfügbar unter:
|
||
- [docs/postman/](../postman/)
|
||
|
||
## Versionierung
|
||
|
||
Die API verwendet URL-basierte Versionierung:
|
||
|
||
- **Aktuelle Version**: v1
|
||
- **Basis-URL**: `/api/v1/`
|
||
- **Deprecated Versionen**: Werden 12 Monate unterstützt
|
||
|
||
## Monitoring und Observability
|
||
|
||
### Health Checks
|
||
|
||
```
|
||
GET /actuator/health
|
||
```
|
||
|
||
### Metriken
|
||
|
||
```
|
||
GET /actuator/metrics
|
||
GET /actuator/prometheus
|
||
```
|
||
|
||
### API-Metriken
|
||
|
||
- Request-Anzahl pro Endpunkt
|
||
- Response-Zeiten
|
||
- Fehlerquoten
|
||
- Rate-Limiting-Statistiken
|
||
|
||
## Entwicklung und Testing
|
||
|
||
### Lokale Entwicklung
|
||
|
||
```bash
|
||
# API-Server starten
|
||
./gradlew bootRun
|
||
|
||
# Swagger UI öffnen
|
||
open http://localhost:8080/swagger-ui.html
|
||
```
|
||
|
||
### API-Tests
|
||
|
||
```bash
|
||
# Unit Tests
|
||
./gradlew test
|
||
|
||
# Integration Tests
|
||
./gradlew integrationTest
|
||
|
||
# API Tests mit Newman
|
||
newman run docs/postman/meldestelle-api.postman_collection.json
|
||
```
|
||
|
||
## Support und Kontakt
|
||
|
||
- **Dokumentation**: [docs/api/](.)
|
||
- **Issue Tracker**: GitHub Issues
|
||
- **API-Status**: https://status.meldestelle.at
|
||
|
||
---
|
||
|
||
**Letzte Aktualisierung**: 25. Juli 2025
|
||
**API-Version**: v1.0
|
||
**OpenAPI-Spezifikation**: 3.0.3
|