Skip to main content

API REST

Préfixe proposé : /api. Corps JSON avec Content-Type: application/json. Utiliser HTTPS et WSS en environnement déployé.

Les routes protégées exigent Authorization: Bearer <token>. Le token provient de la connexion REST ; sa durée et sa révocation restent à définir. Les lectures publiques exposent seulement l’état public des parties et les statistiques de jeu.

MéthodeEndpoint proposéAuthentificationFonction et réponse normale
POST/api/usersNonCréer un compte ; 201, username
POST/api/auth/loginNonAuthentifier ; 200, token et username
GET/api/users/meOuiLire son compte ; 200, username
PATCH/api/users/meOuiModifier son username et/ou mot de passe ; 200, username actualisé
GET/api/matchesNonLister les parties consultables ; 200, tableau de résumés
GET/api/matches/{uid}NonLire l’état courant ou le résultat sauvegardé ; 200, partie publique
GET/api/matches/{uid}/statsNonLire les statistiques par joueur ; 200, valeurs provisoires ou finales
GET/api/users/{username}/statsNonLire les statistiques cumulées des parties finalisées ; 200, compteurs agrégés

Comptes et authentification​

Requête POST /api/users, puis réponse 201 :

{ "username": "alice", "password": "exemple-mot-de-passe" }
{ "username": "alice" }

Le backend calcule passhash pour le stockage et refuse un username déjà utilisé. Le mot de passe est transmis uniquement dans la requête HTTPS, jamais en réponse.

POST /api/auth/login reçoit les mêmes champs. Réponse 200 :

{ "token": "jeton-exemple", "username": "alice" }

GET /api/users/me renvoie {"username":"alice"}. PATCH /api/users/me accepte un sous-ensemble non vide de username et password, par exemple :

{ "password": "nouveau-mot-de-passe" }

Seul le compte authentifié est modifié. Un renommage pendant l’appartenance à une partie active est refusé avec 409, car les événements identifient les joueurs par username. La gestion d’un renommage dans les résultats historiques reste à préciser, sans changement de schéma dans cette tâche.

Parties et statistiques​

Réponse GET /api/matches :

[{ "matchUid": "match_123", "state": "ROUND_ONGOING", "roundNumber": 2 }]

Réponse GET /api/matches/match_123 : instantané complet de référence. Les HP, coordonnées, couleurs et IDs d’équipe ci-dessous sont illustratifs.

{
"matchUid": "match_123",
"state": "ROUND_ONGOING",
"roundNumber": 2,
"players": [
{
"username": "alice",
"teamId": 1,
"position": { "x": 12.5, "y": 0, "z": 8.2 },
"rotation": { "x": 0, "y": 90, "z": 0 },
"hp": 100
},
{
"username": "bob",
"teamId": 1,
"position": { "x": 10, "y": 0, "z": 8 },
"rotation": { "x": 0, "y": 90, "z": 0 },
"hp": 100
},
{
"username": "chloe",
"teamId": 2,
"position": { "x": 20, "y": 0, "z": 8 },
"rotation": { "x": 0, "y": 270, "z": 0 },
"hp": 0
},
{
"username": "david",
"teamId": 2,
"position": { "x": 22, "y": 0, "z": 8 },
"rotation": { "x": 0, "y": 270, "z": 0 },
"hp": 40
}
],
"teams": [
{ "teamId": 1, "color": "bleu", "players": ["alice", "bob"], "score": 1 },
{ "teamId": 2, "color": "rouge", "players": ["chloe", "david"], "score": 0 }
]
}

Pour une partie terminée, positions, rotations et HP peuvent être omis s’ils ne sont plus disponibles ; l’état reste MATCH_ENDED, avec équipes et scores persistés.

Réponse GET /api/matches/match_123/stats :

{
"matchUid": "match_123",
"state": "ROUND_ONGOING",
"players": [
{ "username": "alice", "stats": { "damage": 100, "kills": 1, "deaths": 0, "matchTime": 85, "aliveTime": 85 } },
{ "username": "bob", "stats": { "damage": 0, "kills": 0, "deaths": 0, "matchTime": 85, "aliveTime": 85 } },
{ "username": "chloe", "stats": { "damage": 0, "kills": 0, "deaths": 1, "matchTime": 85, "aliveTime": 70 } },
{ "username": "david", "stats": { "damage": 0, "kills": 0, "deaths": 0, "matchTime": 85, "aliveTime": 85 } }
]
}

Ces valeurs sont provisoires tant que la partie n’est pas MATCH_ENDED. Réponse GET /api/users/alice/stats : somme des cinq compteurs des parties finalisées, avec les mêmes noms et unités.

{ "username": "alice", "stats": { "damage": 320, "kills": 3, "deaths": 1, "matchTime": 240, "aliveTime": 200 } }

Statuts HTTP​

CodeSituation
200Lecture, connexion ou modification réussie
201Compte créé
400JSON, champs, types ou valeurs invalides
401Identifiants incorrects ou token absent, invalide ou expiré sur une route protégée
403Action interdite à l’identité authentifiée
404Partie ou utilisateur introuvable
409Username déjà pris ou renommage incompatible avec une partie active
500Erreur interne, sans détails techniques ni secrets dans la réponse

Les erreurs REST utilisent aussi l’objet type: "error" et data: {code, message} décrit dans Erreurs et reconnexion. Les codes complémentaires proposés sont INVALID_PAYLOAD, USER_NOT_FOUND, USERNAME_TAKEN et USERNAME_CHANGE_FORBIDDEN.