Aller au contenu

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.


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é.