API — Clubs & Terrains¶
Documentation des endpoints API pour la gestion des clubs et terrains.
Authentification
Les endpoints marqués 🔒 nécessitent un token JWT dans le header Authorization: Bearer {token}.
Clubs¶
GET /api/v1/clubs — Lister les clubs validés¶
Retourne la liste des clubs avec le statut validated.
Paramètres query : | Paramètre | Type | Description | |-----------|------|-------------| | search | string (optionnel) | Filtre sur le nom ou la ville (insensible à la casse) |
Réponse 200 :
{
"data": [
{
"id": 1,
"name": "Padel Arena Nice",
"city": "Nice",
"address": "10 Rue du Sport",
"status": "validated",
"terrains_count": 3,
...
}
]
}
GET /api/v1/clubs/{id} — Détail d'un club¶
Retourne les informations complètes d'un club avec ses terrains actifs.
Réponse 200 : Objet club avec terrains et terrains_count.
🔒 POST /api/v1/clubs — Créer un club¶
Crée un nouveau club rattaché à l'utilisateur connecté.
Body :
{
"name": "Mon Padel Club",
"address": "10 Rue du Sport",
"city": "Paris",
"postal_code": "75012",
"phone": "01 23 45 67 89",
"email": "contact@club.com",
"website": "https://club.com",
"description": "Description du club"
}
Champs obligatoires : name (2–255 car.), address, city.
Réponse 201 : Club créé avec status: "pending".
Effets de bord : - L'utilisateur est promu club_manager s'il était player. - Les administrateurs reçoivent une notification club_registration_received.
🔒 POST /api/v1/clubs/{id}/claim — Revendiquer un club¶
Revendique un club sans propriétaire.
Réponse 200 : Club mis à jour. Réponse 409 : Le club a déjà un propriétaire.
🔒 POST /api/v1/clubs/{id}/logo — Uploader un logo¶
Upload un logo pour le club. Réservé au propriétaire.
Body : multipart/form-data avec champ logo (image JPG/PNG, max 2 Mo).
🔒 GET /api/v1/clubs/my — Mes clubs¶
Retourne les clubs dont l'utilisateur est propriétaire.
🔒 GET /api/v1/clubs/unclaimed — Clubs sans propriétaire¶
Retourne les clubs sans propriétaire pour revendication.
Terrains¶
GET /api/v1/clubs/{clubId}/terrains — Terrains actifs¶
Retourne les terrains actifs d'un club (vue publique).
Réponse 200 :
{
"data": [
{
"id": 1,
"club_id": 5,
"name": "Court Panoramique #1",
"type": "indoor",
"description": "Piste intérieure avec éclairage LED",
"price_per_hour": 25.50,
"is_active": true,
"created_at": "2026-01-01T00:00:00.000000Z"
}
]
}
🔒 GET /api/v1/clubs/{clubId}/terrains/all — Tous les terrains (propriétaire)¶
Retourne tous les terrains du club (actifs et inactifs). Réservé au propriétaire.
Réponse 403 : L'utilisateur n'est pas le propriétaire du club.
🔒 POST /api/v1/clubs/{clubId}/terrains — Ajouter un terrain¶
Crée un nouveau terrain pour le club. Réservé au propriétaire.
Body :
{
"name": "Court #2",
"type": "outdoor",
"description": "Piste extérieure",
"price_per_hour": 15.00,
"is_active": true
}
Champs obligatoires : name (1–100 car.), type (indoor/semi_covered/outdoor).
Réponse 201 : Terrain créé.
🔒 PUT /api/v1/clubs/{clubId}/terrains/{terrainId} — Modifier un terrain¶
Modifie un terrain existant. Réservé au propriétaire.
Réponse 404 : Le terrain n'appartient pas au club spécifié.
🔒 DELETE /api/v1/clubs/{clubId}/terrains/{terrainId} — Supprimer un terrain¶
Supprime un terrain. Réservé au propriétaire. Suppression définitive.
Réponse 404 : Le terrain n'appartient pas au club spécifié.