Aller au contenu

🔐 Compte joueur (RGPD) — API Reference

Endpoints

DELETE /api/v1/account

Supprime définitivement le compte du joueur authentifié.

Authentification requise : Oui (Bearer JWT)

Corps de la requête

{
    "email_confirmation": "joueur@example.com",
    "confirm": true
}
Champ Type Requis Description
email_confirmation string (email) Oui L'adresse email du compte, saisie pour confirmer l'identité
confirm boolean (accepted) Oui Doit être true pour valider le consentement explicite

Réponses

200 OK — Compte supprimé avec succès

{
    "message": "Votre compte a été supprimé avec succès."
}

422 Unprocessable Entity — Données de validation incorrectes

{
    "message": "The given data was invalid.",
    "errors": {
        "email_confirmation": ["L'adresse email ne correspond pas à votre compte."],
        "confirm": ["Vous devez confirmer la suppression de votre compte."]
    }
}

401 Unauthorized — Token absent ou invalide

Effets de la suppression

  1. Les parties ouvertes ou complètes créées par l'utilisateur sont annulées ; les participants reçoivent une notification game_cancelled.
  2. L'utilisateur est retiré des parties actives qu'il rejoint ; les autres joueurs reçoivent une notification player_left. Si la partie était complète, elle passe à open.
  3. Les messages de chat de l'utilisateur sont anonymisés : user_id = null, contenu remplacé par [Message supprimé].
  4. L'avatar est supprimé du stockage.
  5. Les données personnelles sont anonymisées : nom → Joueur supprimé, email → deleted_<uuid>@deleted.invalid, ville → null.
  6. Le jeton JWT actif est invalidé (révocation côté serveur).
  7. Un email de confirmation est envoyé en file d'attente.
  8. L'enregistrement est soft-deleted (colonne deleted_at).

GET /api/v1/account/export

Exporte les données personnelles de l'utilisateur authentifié (droit à la portabilité RGPD).

Authentification requise : Oui (Bearer JWT)

Réponse

200 OK

{
    "message": "Export des données généré avec succès.",
    "data": {
        "exported_at": "2025-06-01T12:00:00+00:00",
        "profile": {
            "first_name": "Jean",
            "last_name": "Dupont",
            "email": "jean@example.com",
            "city": "Paris",
            "level": 4.5,
            "reliability_score": "82.50",
            "role": "player"
        },
        "games_participated": [
            {
                "id": 42,
                "scheduled_at": "2025-05-15T14:00:00Z",
                "type": "competitive",
                "status": "completed",
                "club": "Padel Club Paris"
            }
        ],
        "games_created": []
    }
}

401 Unauthorized — Token absent ou invalide


Modèle de données — Champs ajoutés

Table users

Colonne Type Description
deleted_at timestamp\|null Date du soft delete (SoftDeletes Laravel)
deletion_requested_at timestamp\|null Date à laquelle la suppression a été demandée (réservé pour usage futur de délai de grâce)

Table chat_messages

Colonne Impact
user_id Rendu nullable pour permettre l'anonymisation sans supprimer les messages

Service métier — AccountDeletionService

Localisation : app/Domain/User/Services/AccountDeletionService.php

AccountDeletionService
├── deleteAccount(User $user): void
│   ├── cancelUserCreatedGames()     # Annule les parties ouvertes/complètes du créateur
│   ├── removeUserFromActiveGames()  # Retire le joueur des parties actives
│   ├── anonymizeChatMessages()      # Anonymise les messages de chat
│   ├── deleteAvatar()               # Supprime l'avatar du stockage
│   ├── anonymizePersonalData()      # Remplace les PII par des valeurs neutres
│   ├── invalidateJwt()              # Invalide le token JWT actif
│   ├── sendConfirmationEmail()      # Envoie l'email de confirmation (queued)
│   └── $user->delete()             # Soft delete
└── exportUserData(User $user): array
    └── Retourne profil + parties participées + parties créées