Ajoute l Elo et les statistiques de parties

This commit is contained in:
2026-04-16 00:17:52 +02:00
parent db233e7110
commit 407e5e8ed5
13 changed files with 1914 additions and 11 deletions

View File

@@ -217,6 +217,108 @@ Erreurs frequentes :
- `400 Bad Request` si une longueur maximale est depassee.
- `401 Unauthorized` sans session.
### GET /api/users/me/stats
Retourne les statistiques du compte courant et ses derniers matchs enregistres.
Reponse `200 OK` :
```json
{
"subject": "2f7d0f1d-3ef6-4b5f-aab5-4cf6b61c0a28",
"currentElo": 1216,
"rankedGames": 1,
"casualGames": 2,
"wins": 2,
"losses": 1,
"stoppedGames": 0,
"whiteWins": 1,
"blackWins": 1,
"whiteLosses": 1,
"blackLosses": 0,
"totalMoves": 34,
"totalCubeRounds": 6,
"bestCubeTimeMs": 8420,
"averageCubeTimeMs": 11530,
"lastMatchUtc": "2026-04-15T11:00:00.0000000Z",
"recentMatches": [
{
"matchId": "c1f4e44f5f5f4fe4b8f2bf1f8a634f9e",
"completedUtc": "2026-04-15T11:00:00.0000000Z",
"result": "white",
"mode": "twice",
"preset": "fast",
"matchLabel": "Rencontre ChessCubing",
"playerColor": "white",
"playerName": "Christophe JEANNEROT",
"opponentName": "Alex Martin",
"opponentSubject": "sub-ami-1",
"isRanked": true,
"isWin": true,
"isLoss": false,
"playerMoves": 6,
"opponentMoves": 6,
"cubeRounds": 2,
"playerBestCubeTimeMs": 8420,
"playerAverageCubeTimeMs": 10120,
"eloBefore": 1200,
"eloAfter": 1216,
"eloDelta": 16
}
]
}
```
### POST /api/users/me/stats/matches
Enregistre la fin d'une partie pour les statistiques joueur.
Important :
- le compte connecte doit correspondre a l'un des deux joueurs identifies dans le payload
- l'Elo n'est mis a jour que si `whiteSubject` et `blackSubject` sont tous les deux renseignes, distincts, et que le resultat est `white` ou `black`
- si une meme partie est envoyee deux fois avec le meme `matchId`, l'enregistrement reste idempotent
Requete :
```json
{
"matchId": "c1f4e44f5f5f4fe4b8f2bf1f8a634f9e",
"collaborationSessionId": "play-session-123",
"whiteSubject": "2f7d0f1d-3ef6-4b5f-aab5-4cf6b61c0a28",
"whiteName": "Christophe JEANNEROT",
"blackSubject": "sub-ami-1",
"blackName": "Alex Martin",
"result": "white",
"mode": "twice",
"preset": "fast",
"matchLabel": "Rencontre ChessCubing",
"blockNumber": 2,
"whiteMoves": 6,
"blackMoves": 6,
"cubeRounds": [
{
"blockNumber": 1,
"number": 4,
"white": 8420,
"black": 11030
}
]
}
```
Reponse `200 OK` :
```json
{
"recorded": true,
"isDuplicate": false,
"isRanked": true,
"whiteEloAfter": 1216,
"blackEloAfter": 1184
}
```
## Recherche de joueurs et relations sociales
Ces routes necessitent toutes une session authentifiee.