Bloc A - Code mort: - Suppression Studio (components, views, features) - Suppression gamification + services mock (projectService, storageService, gamificationService) - Mise à jour Sidebar, Navbar, locales Bloc B - Frontend: - Suppression modal.tsx deprecated, Modal.stories (doublon Dialog) - Feature flags: PLAYLIST_SEARCH, PLAYLIST_RECOMMENDATIONS, ROLE_MANAGEMENT = true - Suppression 19 tests orphelins, retrait exclusions vitest.config Bloc C - Backend: - Extraction routes_auth.go depuis router.go Bloc D - Rust: - Suppression security_legacy.rs (code mort, patterns déjà dans security/)
13 KiB
13 KiB
Todolist exhaustive — Frontend stable sans régressions
Objectif : Atteindre un frontend stable, sans régressions, avec une base backend solide.
Stratégie : Backend d’abord (API stable, auth, validation), puis frontend (tests, UX, dette).
Légende : P0 = bloquant | P1 = important avant prod | P2 = consolidation | P3 = long terme
Effort : S < 1h | M 1–4h | L 4h–1j | XL > 1j
Partie A — Backend d’abord (base solide pour le frontend)
A1. Sécurité backend (P0) — à faire avant de stabiliser le front
- A1.1 Vérifier l’historique git pour secrets :
git log -p -- .env veza-backend-api/.env veza-stream-server/.env apps/web/.env*(S) - A1.2 Si secrets committés : rotation JWT_SECRET, DB_PASSWORD, RABBITMQ_URL, REDIS_URL ; invalider tokens/sessions (M)
- A1.3 Confirmer que
.env,veza-*/.env,apps/web/.env.localsont dans.gitignore(S) - A1.4 Chat server — supprimer le JWT fallback qui crée un user "user" si absent en DB ; rejeter la connexion (fichier :
veza-chat-server, flow JWT/auth) (M) - A1.5 Backend Go — rejeter le refresh token si l’utilisateur n’existe plus en DB (handler refresh token) (S)
- A1.6 Pagination — bounds checking :
page >= 1,limitentre 1 et 100 (ou max défini) dans :veza-backend-api:playlist_handler.go(~l.145)veza-backend-api:profile_handler.go(~l.205)veza-backend-api:track/handler.go(~l.814)- Interdire
page < 1,limit > 100et retourner 400 avec message clair (M)
A2. API & contrats backend (P1) — pour éviter 404 / incohérences front
- A2.1 Documenter ou implémenter les endpoints manquants pour :
- Wishlist / panier (marketplace) : soit implémenter, soit retourner 501 + message (L)
- Social groups : endpoint création de groupe (ou désactiver côté front) (M)
- A2.2 Aligner search : décider du contrat (ex.
/api/v1/searchvs/tracks/search,/playlists/search,/users/search) et documenter dans un fichier API.md (M) - A2.3 Healthcheck : dans
Dockerfile.production(backend), utiliser le path réel/api/v1/health(ou celui exposé par l’API) au lieu de/health(S) - A2.4 Remplacer ou désactiver
go-clamd(abandonné) dansupload_validator.go; si désactivé, documenter et gérer proprement l’absence de scan (M)
A3. Services Rust (P1)
- A3.1 Redis : aligner versions entre
veza-chat-server(0.32) etveza-stream-server(0.27) dans lesCargo.toml(S) - A3.2 Réduire les tests Rust
#[ignore]et ajouter tests unitaires sur les chemins critiques (auth, messages) (L) - A3.3 (P2) Échapper le wildcard LIKE dans
message_repository.rs~l.563 si la recherche peut contenir%/_(S)
A4. Infra & déploiement (P1)
- A4.1 Docker-compose dev : supprimer mots de passe en dur ; utiliser variables d’env ou
.envnon committé (S) - A4.2 CD : décommenter et configurer tag / push registry dans
.github/workflows/cd.yml(M)
Partie B — Frontend : bugs et comportements critiques (P0/P1)
B1. Auth & 2FA (P0)
- B1.1 Corriger le bug 2FA login vs setup dans
TwoFactorVerify.tsx~l.47 : appeler le service de vérification login 2FA, pas celui du setup (M) - B1.2 Typer strictement
login/registerdansservices/authService.ts(l.35, 54) : remplacer lesanypar types dédiés (S) - B1.3 Vérifier que le flux “redirect si déjà authentifié” (LoginPage, RegisterPage) utilise bien
authStore/useUseret ne provoque pas de boucles (S)
B2. Memory leaks & hygiène (P0/P1)
- B2.1
ChatInput.tsx~l.106 : cleanup dessetTimeout(annuler dans un cleanup useEffect ou utiliser une ref pour éviter updates après unmount) (S) - B2.2
SocialViewFeedItem.tsx~l.25, 31 : idem cleanupsetTimeout(S) - B2.3
PostCard.tsx~l.94, 101 : idem cleanupsetTimeout(S) - B2.4 Supprimer les 16
console.logdanscomponents/search/GlobalSearchBar.tsx(S) - B2.5 Audit global :
rg "console\.(log|debug|info)" apps/web/src --glob "!*.test.*"et réduire les logs de debug en prod (M)
B3. Accessibilité (P1 — avant prod)
- B3.1
ChatInput.tsx: ajouteraria-labelsur le champ principal (etaria-describedbypour les erreurs si possible) (S) - B3.2
Sidebar.tsx: ajouter un focus trap quand la sidebar est ouverte (mobile) (M) - B3.3 (P2)
MiniPlayer.tsx:aria-livepour annoncer le changement de piste (S) - B3.4 (P2) Sidebar ~l.136 : ne pas mettre de texte pertinent dans un élément
aria-hidden(S)
Partie C — Frontend : tests et non-régression (P1)
C1. Tests unitaires / intégration
- C1.1 Lister tous les tests en échec :
cd apps/web && npx vitest run 2>&1 | tee vitest_run.txtpuis parser les FAIL (S) - C1.2 Corriger les tests qui échouent par “provider manquant” (QueryClient, Router, Auth) : wrappers communs dans un
test-utils.tsx(M) - C1.3 Corriger les tests qui échouent par “mock manquant” (MSW, vi.mock) : aligner les mocks sur les vrais contrats API (L)
- C1.4 Corriger les tests qui échouent par “texte / i18n” : aligner les assertions sur les chaînes actuelles (EN/FR) ou utiliser des data-testid (M)
- C1.5 S’assurer que
waitFor/findBy*sont importés de@testing-library/reactpartout où utilisés (déjà corrigé usePreload, usePlaybackRealtime ; vérifier le reste) (S) - C1.6 Objectif :
npx vitest runavec 0 échec (ou < 5% échecs documentés et skippés avec ticket) (L) - C1.7 Supprimer ou implémenter les tests actuellement en
describe.skip/it.skip(voirvitest.config.tsexclude list) (M)
C2. MSW & contrats API
- C2.1 Comparer
apps/web/src/mocks/handlers.tsavec les routes réelles du backend ; lister les 30+ endpoints sans handler (S) - C2.2 Ajouter des handlers MSW pour au moins : auth (login, register, refresh, me), tracks (list, get, search), playlists (list, get, create), user (settings, profile) (L)
- C2.3 Aligner le format des réponses MSW avec le wrapper réel (ex.
{ success, data }oudataseul) utilisé par les interceptors (M) - C2.4 (P2) Handlers “gamification” et autres mocks sans backend : soit les câbler à une UI, soit les supprimer pour éviter la confusion (M)
C3. Storybook & contrat
- C3.1 Pour chaque story de composant “feature”, ajouter les états Loading (Skeleton), Error, Empty (voir
STORYBOOK_CONTRACT.md) (L) - C3.2 Lancer
npm run test:storybook(build + serve 6007) et corriger les erreurs réseau / console (M) - C3.3 (P2) Réactiver les tests Storybook dans
vitest.config.ts(lignes ~49–170 commentées) après stabilisation (M)
C4. E2E & visuel (P2)
- C4.1 Scénarios Playwright pour : login, library, lecture d’un track, création playlist, envoi message chat (L)
- C4.2 (P2) Visual regression (Playwright ou outil dédié) sur écrans clés (dashboard, player, chat) (M)
Partie D — Frontend : dette structurante (P1/P2)
D1. Composants & design system
- D1.1 Unifier les 3 composants de loading (Spinner, LoadingSpinner, LoadingState) → un seul dans
components/ui/(M) - D1.2 Migrer les ~6 derniers importeurs de
ModalversDialog, puis déprécier/supprimermodal.tsx(M) - D1.3
TrackCard.tsx~l.43 : étendre le typeTrack(ex.like_count?: number) et supprimer(track as any).like_count(S) - D1.4 Réduire les
as unknown asdans les services : typer correctement ou utiliser des gardes de type (L) - D1.5 Unifier la typographie (SUMI vs Tailwind) et documenter dans
DESIGN_TOKENS.md(M) - D1.6 Lancer
node scripts/report-arbitrary-values.mjset réduire les valeurs arbitraires Tailwind en priorité hors stories (M)
D2. Fichiers trop longs
- D2.1 Découper
interceptors.ts(~1203 lignes) en modules : CSRF, retry, validation, cache (L) - D2.2 Découper
handlers.tsMSW (~1606 lignes) par domaine : auth, tracks, playlists, users, etc. (L)
D3. Structure & code mort
- D3.1 Clarifier la règle
components/vsfeatures/: documenter dans un CONTRIBUTING ou déplacer les composants feature (admin, social, studio, settings) versfeatures/(M) - D3.2 Studio : soit exposer une route
/studioet brancher le backend, soit archiver/supprimer les ~76 fichiers danscomponents/studio/(L) - D3.3 (P2) Si
packages/design-systemexiste et n’est pas utilisé : le supprimer du workspace ou le brancher (S)
D4. Performance
- D4.1
DashboardPage: mémoïser les tableaux et callbacks (l.66–71, 131–164, 300–304) avecuseMemo/useCallback(S)
Partie E — Features fantômes & cohérence produit (P1/P2)
E1. Routes & features
- E1.1 Décider du sort des 5 routes “Coming Soon” (gear, live, education, queue, developer) : les cacher de la nav jusqu’à parité backend, ou les retirer de la config de routes (M)
- E1.2 Marketplace (wishlist, panier, paiement) : soit implémenter les endpoints, soit masquer les écrans en prod et gérer l’erreur (message clair, pas de crash 404) (M)
- E1.3 Social groups :
CreateGroupModalappelle un endpoint inexistant ; soit ajouter l’endpoint, soit désactiver la création et afficher un message (M) - E1.4 Documenter ou implémenter un mécanisme de feature flags (env ou backend) (M)
E2. Cohérence front/back
- E2.1 Aligner le search frontend avec les endpoints backend (voir A2.2) (M)
- E2.2 (P2/P3) Tables DB sans code (contests, contest_*, equipment, hardware_sales) : décider migration/usage ou retrait du schéma (L)
Partie F — Qualité & maturité (P2/P3)
F1. TypeScript & hygiène
- F1.1 (P2) Activer
noUncheckedIndexedAccessdanstsconfiget corriger les erreurs (ou traiter par sous-ensemble de fichiers) (L) - F1.2 Traiter ou tracker les TODO/FIXME critiques restants (au moins ceux liés sécurité/auth) (M)
F2. Docs & ADR
- F2.1 Réduire le bruit dans
docs/: fusionner les 55+ fichiers d’audit en CHANGELOG / KNOWN_ISSUES ou déplacer dansdocs/archive/(M) - F2.2 (P3) ADR pour auth, state (Zustand + React Query), design system (SUMI/Tailwind) (M)
F3. UX & perf (P2)
- F3.1 aria-live pour le player et les notifications (contenu dynamique pour lecteurs d’écran) (S)
- F3.2 Images : srcset, WebP/AVIF, lazy loading où pertinent (M)
- F3.3 Code splitting : séparer gros chunks (framer-motion, axios, DOMPurify) dans
vite.config.tssi nécessaire (M)
Partie G — Base de données & migrations (P2/P3)
- G1 Migration UUID :
001_migrate_ids_to_uuid_up.sql— soit compléter la migration PK/FK, soit documenter l’état et le plan (L) - G2 (P3) Nettoyer les tables fantômes (contests, equipment, etc.) ou les brancher (M)
Partie H — Ordre d’exécution recommandé
Phase 1 — Backend solide (avant de tout stabiliser le front)
- A1.1 → A1.3 (secrets & gitignore)
- A1.4 → A1.6 (auth chat, refresh, pagination)
- A2.1 → A2.4 (API, healthcheck, go-clamd)
- A3.1 (Redis aligné)
- A4.1 → A4.2 (Docker, CD)
Phase 2 — Frontend critique (P0/P1)
- B1.1 → B1.3 (2FA, typage auth)
- B2.1 → B2.5 (setTimeout, console.log)
- B3.1 → B3.2 (aria-label ChatInput, focus trap Sidebar)
Phase 3 — Tests et non-régression
- C1.1 → C1.7 (corriger tous les tests en échec)
- C2.1 → C2.3 (MSW handlers et format)
- C3.1 → C3.2 (Storybook Loading/Error/Empty, test:storybook)
- C4.1 (E2E parcours critiques)
Phase 4 — Dette et structure
- D1.1 → D1.4 (loading, Modal→Dialog, Track type, as unknown)
- D2.1 → D2.2 (découper interceptors, handlers)
- D3.1 → D3.2 (components vs features, studio)
- D4.1 (Dashboard mémo)
Phase 5 — Produit et cohérence
- E1.1 → E1.4 (routes Coming Soon, marketplace, groups, feature flags)
- E2.1 (search aligné)
Phase 6 — Maturité (P2/P3)
- F1.2, F2.1 (TODO/FIXME, docs)
- F3.1 (aria-live)
- G1 (migration UUID doc ou complétion)
Checklist “Frontend stable sans régression” (validation finale)
npx vitest run: 0 échec (ou < 5% skippés avec ticket)npm run build: succès sans warning bloquantnpx tsc --noEmit: 0 erreurnpm run test:storybook: 0 erreur après build + serve 6007- Aucun
console.log/ debug en prod (build sans stub) - Skip link + aria-label ChatInput + focus trap Sidebar en place
- 2FA login corrigé ; pagination backend bornée
- Routes “Coming Soon” soit cachées soit retirées ; pas de crash 404 sur marketplace/groups
- MSW handlers couvrant au moins auth, tracks, playlists, user settings pour dev/Storybook
Document dérivé de STABLE_STATE_TODOLIST.md et des audits frontend/monorepo. À mettre à jour au fur et à mesure.