diff --git a/.ai/analyse-2026-08-06.md b/.ai/analyse-2026-08-06.md new file mode 100644 index 0000000..4127ec6 --- /dev/null +++ b/.ai/analyse-2026-08-06.md @@ -0,0 +1,51 @@ +## Résumé + +TVTracker est une application de suivi de séries, animes et films, auto-hébergée, avec un backend Node.js/Express et un frontend React (Vite). Le projet est bien structuré, avec des services dédiés pour les sources externes (TVmaze, Wikipedia, Wikidata, iTunes, JustWatch, Allociné, TMDB) et une intégration Discord. La CI/CD est en place (GitHub Actions, Docker, Renovate). Le code est globalement propre, avec des commentaires explicatifs et une attention à la robustesse (retries HTTP, déduplication). Cependant, plusieurs points méritent attention : duplication de logique entre backend et frontend, absence de tests (un seul fichier de test), et quelques risques de sécurité/performance. + +## Problèmes et bugs potentiels + +- **Duplication de la logique de rendu des messages Discord** : `frontend/src/pages/Profile/Profile.jsx` contient `previewDiscordMessage()` et `splitDiscordMention()` qui dupliquent la logique de `renderMessageTemplate()` et `buildPayload()` de `backend/src/services/discordNotifications.js`. Toute modification de l’un sans l’autre entraînera des incohérences. +- **Gestion des erreurs des API externes** : bien que `backend/src/services/httpRetry.js` existe, il faut vérifier que tous les appels (Wikipedia, TVmaze, etc.) utilisent bien ce mécanisme avec des timeouts adaptés. Un service externe lent peut bloquer la réponse API. +- **Validation des entrées utilisateur** : l’import TV Time (`backend/src/services/tvtimeImport.js`) et les templates Discord (champ libre) ne semblent pas avoir de validation stricte côté backend. Un fichier malformé ou un template avec des caractères dangereux pourrait causer des erreurs ou des failles (ex: injection de mentions Discord). +- **Sécurité JWT** : le secret est requis, mais il faut s’assurer que les tokens ont une expiration courte et que le secret est suffisamment fort. Vérifier la configuration dans `backend/src/utils/jwt.js`. +- **Performance** : les appels aux API externes ne sont pas mis en cache (sauf pour les personnes via la migration `009_add_people_cache.sql`). Les recherches répétées peuvent être lentes et coûteuses. +- **Accessibilité** : le hook `useWheelToHorizontalScroll` dans `frontend/src/pages/Explore/Explore.jsx` intercepte la molette de la souris sur les lignes horizontales, ce qui peut empêcher le scroll vertical de la page si l’utilisateur survole une ligne. Il faudrait limiter ce comportement (ex: ne l’activer que si la ligne est scrollable). +- **Fichiers trop volumineux** : `frontend/src/pages/Profile/Profile.jsx` (20 Ko) et `backend/src/routes/explore.js` (19 Ko) sont trop longs, ce qui rend la maintenance difficile. + +## Qualité du code et nettoyage + +- **Duplication de code** : comme mentionné, la logique des messages Discord est dupliquée. Il serait préférable de créer un module partagé (ex: `shared/` ou un package interne) pour éviter les divergences. +- **Commentaires** : les commentaires sont souvent utiles et expliquent le « pourquoi » (ex: dans `wikipedia.js`), ce qui est appréciable. Cependant, certains sont trop longs et pourraient être raccourcis. +- **Pas de typage** : le projet utilise JavaScript sans TypeScript. Pour un projet de cette taille, l’ajout de TypeScript pourrait réduire les erreurs, mais ce n’est pas une priorité immédiate. +- **Découpage des composants** : `Profile.jsx` et `Explore.jsx` pourraient être découpés en composants plus petits (ex: `StatCard`, `Poster` sont déjà extraits, mais d’autres parties pourraient l’être). +- **Gestion des erreurs** : le service `debugLog.js` est une bonne pratique, mais il faudrait s’assurer que les erreurs sont bien journalisées avec le contexte (route, paramètres) pour faciliter le débogage. + +## Nouvelles fonctionnalités à envisager + +- **Documentation API** : ajouter une spécification OpenAPI (Swagger) pour faciliter l’intégration et la maintenance. +- **Recherche avancée** : permettre des filtres par genre, année, plateforme, etc. dans l’explorateur. +- **Synchronisation avec Trakt** : en plus de l’import TV Time, proposer une synchronisation avec Trakt pour les utilisateurs qui l’utilisent. +- **Notifications par e-mail** : en plus de Discord, offrir des notifications par e-mail (via SMTP) pour les nouveaux épisodes. +- **Statistiques globales** : ajouter une page d’administration avec des statistiques d’utilisation (nombre d’utilisateurs, contenus suivis, etc.). +- **Mode hors-ligne** : permettre de marquer des épisodes comme vus sans connexion (PWA). + +## Tests manquants + +- **Backend** : il n’y a qu’un seul test (`backend/tests/httpRetry.test.js`). Il manque des tests unitaires pour les services (`wikipedia.js`, `wikidata.js`, `tmdb.js`, `justwatch.js`, `tvtimeImport.js`, etc.) et des tests d’intégration pour les routes (`shows.js`, `movies.js`, `profile.js`, `admin.js`, `explore.js`). +- **Frontend** : aucun test n’est présent. Il faudrait au moins des tests de composants (React Testing Library) pour les composants clés (`PosterCard`, `NavBar`, `Profile`, `Explore`, etc.). +- **Tests E2E** : aucun test de bout en bout (Playwright ou Cypress) pour valider les parcours utilisateur (inscription, ajout de série, import TV Time, etc.). + +## Dépendances et sécurité + +- **Vulnérabilités** : il est recommandé de lancer `npm audit` dans `backend/` et `frontend/` pour détecter les vulnérabilités. La mise à jour de `adm-zip` vers `^0.6.0` (commit 5cc9bcd) est probablement une correction de sécurité, mais il faut vérifier que toutes les dépendances sont à jour. +- **JWT_SECRET** : le secret est passé en variable d’environnement, mais il faut s’assurer qu’il est généré avec une longueur suffisante (ex: `openssl rand -hex 32`) et que les tokens ont une expiration courte (ex: 24h). +- **Validation des entrées** : l’import TV Time et les templates Discord doivent être validés côté backend pour éviter les injections (ex: mentions Discord, HTML). +- **HTTPS** : si l’application est exposée sur Internet, il est recommandé de mettre en place un reverse proxy avec HTTPS (ex: Caddy, Nginx) pour protéger les données en transit. + +## Suggestions prioritaires (top 5) + +1. **Ajouter des tests** : commencer par des tests unitaires pour les services backend (surtout `wikipedia.js`, `wikidata.js`, `tvtimeImport.js`) et des tests d’intégration pour les routes principales (`shows`, `movies`, `profile`). Cela permettra de détecter les régressions lors des mises à jour. +2. **Éliminer la duplication de code Discord** : créer un module partagé (ex: `shared/discord.js`) utilisé à la fois par le backend et le frontend pour le rendu des messages, afin d’éviter les divergences. +3. **Ajouter un cache pour les appels API externes** : utiliser un cache en mémoire (ex: `node-cache`) ou la table `people_cache` existante pour les recherches fréquentes (films, séries) afin d’améliorer les performances. +4. **Renforcer la validation des entrées** : valider les fichiers importés (TV Time) et les templates Discord côté backend (taille, format, caractères autorisés) pour éviter les erreurs et les failles de sécurité. +5. **Améliorer la gestion des erreurs** : ajouter un middleware de gestion d’erreurs global dans le backend pour renvoyer des réponses JSON cohérentes et journaliser les erreurs avec le contexte (route, utilisateur, stack). \ No newline at end of file