# Meldestelle REST API Documentation

## Ü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
