LoL Tracker
Application d'analyse de parties League of Legends construite avec Symfony 8, API Platform et l'API officielle Riot Games.
Vue d'ensemble
Présentation générale du projet
LoL Tracker est une application web full-stack permettant aux joueurs de League of Legends d'analyser leurs performances en détail. Le projet exploite l'API officielle Riot Games pour récupérer les données de matchs, les enrichit avec des statistiques calculées côté serveur, et les présente dans une interface inspirée du thème visuel de League of Legends.
Stack technique
Technologies utilisées dans le projet
Mon compte
Liez votre compte Riot pour accéder à vos statistiques
La page /account permet de lier votre compte Riot Games à votre compte LoL Tracker.
Une fois lié, vos matchs classés Solo/Duo sont importés automatiquement en arrière-plan.
Pseudo#TAG (ex: Chopperman#9696) et sélectionnez votre région.puuid unique./stats.Recherche de matchs
Consultez les parties de n'importe quel joueur
La page /match permet de rechercher n'importe quel joueur par son Riot ID (format Pseudo#TAG).
Les résultats s'affichent sans rechargement grâce à Turbo Frames.
- KDA (Kills / Deaths / Assists)
- Items achetés avec tooltips
- Sorts d'invocateur et runes
- CS, Gold, Dégâts infligés/subis
- Adversaire de lane
- Type de file et durée
- Composition des deux équipes
- Stats de chacun + dégâts + items
- Objectifs (Baron, Dragon, Tourelles…)
- Gold total des équipes
- Région (Europe, NA, Korea)
- Type de partie (Classée, Normal, ARAM)
- Enregistrez les matchs que vous souhaitez et annotez les dans la section "Matchs enregistrés"
Matchs enregistrés
Annotez vos parties pour progresser
Les utilisateurs connectés peuvent enregistrer les parties recherchées dans la section "Matchs" et les annoter en 3 phases pour analyser leur jeu. Les annotations sont sauvegardées via Turbo Streams sans rechargement de page.
Statistiques détaillées
Analysez vos performances sur la durée
La page /stats agrège toutes vos parties importées pour calculer des statistiques moyennes.
Les données sont filtrables dynamiquement par champion, adversaire et rôle via Turbo Streams.
- KDA, Kills, Deaths, Assists
- CS, Gold, Dégâts infligés/subis
- Vision score, Balises placées/détruites
- Quadra/Penta kills
- Barons, Dragons, Heralds, Grubs
- Tourelles, Inhibiteurs
- Monstres jungle alliés/ennemis
- Scuttlecrabs, CS jungle à 10min
- Objectifs pris (timeline)
- Score de vision
- Nombre de balises mises/détruites
- Nombre de balises de contrôles et camouflées
API REST
Endpoints disponibles via API Platform
L'API REST est construite avec API Platform 3 et documentée automatiquement via Swagger UI accessible sur /api/docs.
Elle expose les matchs enregistrés de l'utilisateur connecté.
/api/lol_matches
Liste les matchs enregistrés de l'utilisateur connecté
/api/lol_matches/{id}
Détail d'un match enregistré
/api/lol_matches
Enregistre un nouveau match
/api/lol_matches/{id}
Modifie les annotations d'un match
/api/lol_matches/{id}
Supprime un match enregistré
Authentification JWT
Sécurisation de l'API
L'API est protégée par LexikJWTAuthenticationBundle. Pour obtenir un token :
POST /api/login_check
Content-Type: application/json
{
"username": "votre@email.com",
"password": "votre_mot_de_passe"
}
GET /api/lol_matches
Authorization: eyJ0eXAiOiJKV1Q...
-
Compte admin :
- Email: admin@test.fr
- Mot de passe: password
-
Compte user :
- Email: user@test.fr
- Mot de passe: password
Architecture
Organisation du code
RiotApiService— Appels HTTP vers l'API RiotRiotMatchService— Enrichissement des données de matchRiotStatsService— Calcul des statistiques agrégéesRiotAccountService— Liaison du compte RiotMailerService— Envoi d'emails transactionnels
User— Compte utilisateurLolMatch— Match enregistré avec annotationsCachedMatch— Données brutes API en cache BDDChampion/Item/Rune/RunePath— Données DDragon
LolMatchProvider— Filtre les matchs par utilisateurLolMatchProcessor— Assigne l'utilisateur au POST
QueueMapper— Types de file (Solo, Flex, ARAM…)SeasonMapper— Timestamps par saisonSummonerSpellMapper— IDs → noms de sorts
Jobs asynchrones
Import des matchs en arrière-plan
Quand un utilisateur lie son compte Riot, l'import de tous ses matchs classés est déclenché en arrière-plan via Symfony Messenger pour ne pas bloquer l'interface.
ImportAllMatchesMessageImportAllMatchesHandler récupère tous les matchIDs par batch de 100 avec filtre queue=420 (pour ne prendre que les matchs classés solo et éviter le surnombre d'appels à l'API de Riot GamesImportMatchMessage par match avec DelayStamp pour respecter le rate limit Riot (40 req/min). il faut donc attendre plusieurs minutes pour les utilisateurs important beaucoup de matchsCachedMatch avec em->clear() après chaque flush pour éviter les fuites mémoire