Kunden API
Kundendaten über die REST API abrufen und verwalten.
Zuletzt aktualisiert: 2025-01-01
Kunden API
Die Kunden-API ermöglicht das Abrufen und Verwalten von registrierten Kunden und Gastbestellern. Alle Endpunkte erfordern Admin-Authentifizierung.
Kunden-Typen
Das System unterscheidet zwei Kunden-Typen:
- Registrierte Kunden — haben ein Kundenkonto mit E-Mail und Passwort; erhalten positive IDs
- Gastkunden — haben nur eine Bestellung ohne Konto; erhalten negative synthetische IDs (z.B.
-1,-2, ...)
Schreibende Operationen (PUT, DELETE, Adressen) sind für Gastkunden nicht verfügbar und geben 400 zurück.
Endpunkte
Kunden auflisten
GET /api2/admin/customers
Gibt alle Kunden zurück — registrierte Kunden und Gastkäufer zusammengeführt, sortiert nach createdAt DESC.
Antwort:
{
"customers": [
{
"id": 12,
"email": "[email protected]",
"firstName": "Max",
"lastName": "Mustermann",
"phone": "+49 7531 123456",
"orderCount": 3,
"totalSpent": 7470.00,
"isGuest": false,
"createdAt": "2024-06-01T12:00:00Z"
},
{
"id": -1,
"email": "[email protected]",
"firstName": "Anna",
"lastName": "Schmidt",
"orderCount": 1,
"totalSpent": 1250.00,
"isGuest": true,
"createdAt": "2025-01-10T09:30:00Z"
}
]
}
Kunden suchen
GET /api2/admin/customers/search?q=mustermann
Durchsucht die Bestellungen nach Name, E-Mail oder Telefonnummer. Mindestens 2 Zeichen erforderlich. Gibt bis zu 20 Ergebnisse zurück.
Hinweis: Die Suche durchsucht die Bestellungstabelle. Registrierte Kunden ohne Bestellungen erscheinen nicht in den Suchergebnissen. Verwenden Sie die Auflisten-Route für vollständige Ergebnisse.
Antwort:
[
{
"id": 12,
"email": "[email protected]",
"firstName": "Max",
"lastName": "Mustermann",
"orderCount": 3,
"totalSpent": 7470.00
}
]
Kunden abrufen
GET /api2/admin/customers/{id}
Gibt das vollständige Kundenprofil mit Adressen und den letzten 5 Bestellungen zurück.
Antwort:
{
"id": 12,
"email": "[email protected]",
"firstName": "Max",
"lastName": "Mustermann",
"phone": "+49 7531 123456",
"isVerified": true,
"addresses": [
{
"id": 55,
"type": "shipping",
"street": "Musterstraße 1",
"city": "Konstanz",
"postalCode": "78462",
"country": "DE",
"isDefault": true
}
],
"recentOrders": [
{
"id": 1001,
"orderNumber": 10042,
"status": "delivered",
"totalAmount": 2490.00,
"createdAt": "2025-01-15T10:30:00Z"
}
],
"createdAt": "2024-06-01T12:00:00Z"
}
Kunden aktualisieren
PUT /api2/admin/customers/{id}
X-CSRF-Token: <csrf-token>
Content-Type: application/json
{
"email": "[email protected]",
"firstName": "Max",
"lastName": "Mustermann",
"phone": "+49 7531 654321"
}
Nur email, firstName, lastName und phone können aktualisiert werden. Bei E-Mail-Änderungen wird auf Duplikate geprüft.
Antwort (200):
{
"id": 12,
"email": "[email protected]",
"firstName": "Max",
"lastName": "Mustermann",
"updatedAt": "2025-01-20T14:00:00Z"
}
Kunden löschen
DELETE /api2/admin/customers/{id}
X-CSRF-Token: <csrf-token>
Löscht den Kunden und alle zugehörigen Adressen. Bestellungen bleiben erhalten.
Antwort (200):
{ "success": true }
Adressen verwalten
Adresse erstellen
POST /api2/admin/customers/{id}/addresses
X-CSRF-Token: <csrf-token>
Content-Type: application/json
{
"type": "shipping",
"firstName": "Max",
"lastName": "Mustermann",
"street": "Neue Straße 5",
"city": "Konstanz",
"postalCode": "78462",
"country": "DE",
"isDefault": true
}
type kann shipping oder billing sein. Wenn isDefault: true gesetzt wird, werden alle anderen Adressen desselben Typs automatisch als nicht-Standard markiert.
Antwort (201):
{
"id": 56,
"type": "shipping",
"street": "Neue Straße 5",
"city": "Konstanz",
"postalCode": "78462",
"country": "DE",
"isDefault": true
}
Adresse aktualisieren
PUT /api2/admin/customers/addresses/{addressId}
X-CSRF-Token: <csrf-token>
Content-Type: application/json
{
"customerId": 12,
"street": "Geänderte Straße 10",
"city": "Überlingen",
"postalCode": "88662"
}
customerId ist im Request-Body erforderlich (IDOR-Schutz).
Adresse löschen
DELETE /api2/admin/customers/addresses/{addressId}?customerId=12
X-CSRF-Token: <csrf-token>
customerId als Query-Parameter ist erforderlich (IDOR-Schutz).
Antwort (200):
{ "success": true }