🔐 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¶
| 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
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¶
- Les parties ouvertes ou complètes créées par l'utilisateur sont annulées ; les participants reçoivent une notification
game_cancelled. - 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. - Les messages de chat de l'utilisateur sont anonymisés :
user_id = null, contenu remplacé par[Message supprimé]. - L'avatar est supprimé du stockage.
- Les données personnelles sont anonymisées : nom →
Joueur supprimé, email →deleted_<uuid>@deleted.invalid, ville →null. - Le jeton JWT actif est invalidé (révocation côté serveur).
- Un email de confirmation est envoyé en file d'attente.
- 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