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/)
12 KiB
Todolist — État stable Veza
Objectif : rapprocher l’application d’un état stable, prêt pour la production.
Sources : FULL_FRONTEND_AUDIT.md, FULL_MONOREPO_AUDIT.md (mise à jour 13/02/2026).
Légende :
- P0 = bloquant sécurité/stabilité
- P1 = important avant prod
- P2 = consolidation
- P3 = amélioration / long terme
- S/M/L/XL = effort (Small / Medium / Large / XL)
1. Sécurité (P0)
Secrets & historique
- Vérifier l’historique git pour tout commit de
.env:documenté dans docs/SECRETS_VERIFICATION.md - Si des secrets ont été committés : aucun secret réel trouvé ; templates supprimés dans
ff04c15 - S'assurer que
.envetveza-*/\.envrestent bien dans.gitignorepartout — vérifié
Auth & contrôle d’accès
- Chat server — JWT fallback : supprimer le fallback qui crée un user "user" si l’utilisateur n’existe pas en DB ; rejeter la connexion si user non trouvé (
veza-chat-server, jwt_manager / auth flow) - Rejeter le refresh token si l’utilisateur n’existe plus en DB (backend Go)
- Validation des query params (pagination) :
playlist_handler.goetprofile_handler.go(GetTracks, SearchUsers) ont déjà ou ont reçu un bounds checking (page >= 1, limit 1–100).profile_handler.SearchUserscorrigé pour retourner 400 au lieu de normaliser.
Déjà fait (à ne pas refaire)
SSRF webhook—IsURLSafe()danswebhook_service.goContrôle d’accès stream—validate_track_access()dansveza-stream-server(token_validator.rs)
2. Frontend — Urgences (P0 / P1)
Bugs & comportements critiques
- Bug 2FA login vs setup (P0) : flux AuthView corrigé —
AuthViewContent+useAuthView+LoginForm: quand login retournerequires_2fa, on stocke les credentials et on appellecompleteLogin2FA(POST /auth/login/2fa) depuisTwoFactorVerifyonSuccess. - Typer
login/registerdansservices/authService.ts: types explicitesAuthLoginResult/AuthRegisterResultetPromise<...>. - Cleanup des
setTimeout:ChatInput,SocialViewFeedItem,PostCardont déjà un cleanup dans leuseEffect(refs + clearTimeout au démontage).
Logs & hygiène
- Supprimer les
console.logdans GlobalSearchBar : le fichier utilise déjàlogger.debug/logger.error(aucunconsole.logtrouvé).
Accessibilité (WCAG — avant prod)
- ChatInput :
aria-label="Type a message"déjà présent sur l’input —features/chat/components/ChatInput.tsx - Sidebar mobile : focus trap déjà en place —
FocusTrapavecactive={sidebarOpen && isMobile}etonEscapedanscomponents/layout/Sidebar.tsx - (Optionnel P2) MiniPlayer :
aria-livepour annoncer le changement de piste —features/player/components/MiniPlayer.tsx - (Optionnel P2) Sidebar ~l.136 : ne pas mettre de texte pertinent dans un élément
aria-hidden
Déjà fait
Skip link— présent dansApp.tsx(href="#main-content")swagger-ui / rollup-plugin-visualizer en prod— en devDependencies
3. Backend & services Rust (P0 / P1)
Chat server
- Supprimer le JWT fallback user (voir section Sécurité ci-dessus) — déjà conforme.
Dépendances & cohérence
- Remplacer
go-clamd— déjà fait :go.modutilisegithub.com/Lyimmi/go-clamd v1.0.0(fork maintenu). - Redis : versions déjà alignées —
veza-chat-serveretveza-stream-serverutilisent tous deuxredis0.32.
Qualité de code / tests
- Réduire le nombre de tests Rust
#[ignore]et ajouter des tests unitaires là où c’est critique - (P2) Échapper le wildcard LIKE dans
message_repository.rs~l.563 si la recherche peut contenir%/_
4. Infra, Docker, CI/CD (P1)
Docker
- Healthcheck backend : les deux Dockerfiles (backend) utilisent déjà
http://localhost:8080/api/v1/health. - docker-compose (dev) : mots de passe via variables (POSTGRES_PASSWORD, RABBITMQ_DEFAULT_PASS) avec défaut devpassword
CD
- Activer le pipeline CD : push configuré (secrets DOCKER_REGISTRY, DOCKER_REGISTRY_USERNAME, DOCKER_REGISTRY_PASSWORD)
- (P2) Envisager signature des images Docker et SBOM pour l’intégrité des builds
Monorepo (P2/P3)
- (P3) Introduire un orchestrateur (ex. Turborepo) pour builds/tests front + back
- (P3) Workspace Rust racine (
Cargo.tomlroot) pour build/test unifié des services Rust - (P3) Workspace Go (
go.work) si plusieurs modules Go
5. Frontend — Consolidation (P1 / P2)
Dette structurante
- Unifier les composants de loading : un seul primitif
LoadingSpinner(loading-spinner.tsx) ;LoadingStateest le wrapper (spinner/inline/skeleton/minimal) qui l’utilise. Aucun composant « Spinner » distinct. - Migration Modal → Dialog :
modal.tsxsupprimé ;Modal.stories.tsxetmodal.test.tsxsupprimés ; tests overlay/Escape/close/body scroll ajoutés àdialog.test.tsx. - Supprimer
(track as any).like_count: le typeTrack(player/types) a déjàlike_count?: numberet TrackCard utilisetrack.like_count ?? 0. - Résoudre les ~15
as unknown asdans les services : typer correctement ou utiliser des gardes - Réduire les
console.loget autres logs de debug en production (déjà listé GlobalSearchBar ; vérifier le reste)
Fichiers trop longs
- Découper
interceptors.ts(~1203 lignes) en modules : CSRF, retry, validation, cache - Découper
handlers.tsMSW (~1606 lignes) par domaine (auth, tracks, playlists, etc.)
Design system & typo
- Unifier la typographie : soit SUMI uniquement, soit Tailwind uniquement ; documenter le choix (ex. dans DESIGN_TOKENS.md)
- Auditer et réduire les valeurs arbitraires Tailwind en production (script
report-arbitrary-values.mjs), en priorité hors stories
Structure du code
- Clarifier
components/vsfeatures/: déplacer les composants feature (admin, social, studio, settings, etc.) versfeatures/ou documenter clairement la règle actuelle - Code mort / studio : soit exposer une route
/studioet brancher le backend, soit supprimer ou archiver les ~76 fichiers danscomponents/studio/ - Handlers MSW gamification sans UI : les supprimer ou câbler une UI ; idem pour autres mocks sans backend
Performance
- DashboardPage :
quickActionButtonsest déjà mémoïsé avecuseMemo;QUICK_ACTIONSetSTATSsont des constantes module (pas recréées à chaque render).
6. Tests (P1 / P2)
Frontend
- Corriger les tests en échec (ordre de grandeur ~42% d’échecs mentionnés) : identifier les tests tracks et autres qui échouent et les stabiliser
- Stories : ajouter les états Loading / Error / Empty aux stories qui en manquent (contrat Storybook)
- Réactiver les tests Storybook dans
vitest.config.ts(lignes ~49-170 actuellement commentées) après stabilisation - Compléter les mocks MSW pour les 30+ endpoints backend qui n’ont pas encore de handler (pour dev et Storybook)
E2E & visuel
- E2E Playwright : ajouter des scénarios pour les parcours critiques (login, library, lecture, playlists, chat)
- (P2) CI visuel : visual regression (Playwright ou outil dédié) pour les écrans clés
Backend / Rust
- (P2) Renforcer les tests du chat server et du stream server (réduire
#[ignore])
7. Produit & features (P1 / P2)
Features fantômes
- Décider du sort des 5 routes Coming Soon (gear, live, education, queue, developer) :
- soit les cacher (pas dans la nav) jusqu’à parité backend,
- soit les supprimer de la config de routes et de la nav
- Marketplace / commerce : wishlist, panier, paiement — soit implémenter les endpoints backend, soit désactiver/masquer les écrans en prod et gérer proprement l’erreur (pas de crash 404)
- Social groups :
CreateGroupModalappelle un endpoint inexistant ; soit ajouter l’endpoint, soit désactiver la création de groupes et afficher un message clair - Feature flags : documenter ou implémenter un mécanisme (env ou backend) pour activer/désactiver les features sans redéploiement
Cohérence front/back
- Aligner le search frontend avec les endpoints backend : utiliser
/tracks/search,/playlists/search,/users/searchsi c’est le contrat backend, ou documenter l’usage de/api/v1/searchgénérique - Tables DB sans code (contests, contest_*, equipment, hardware_sales) : décider de les migrer/utiliser ou de les retirer du schéma pour éviter la confusion
8. Base de données & migrations (P2 / P3)
- Migration UUID :
001_migrate_ids_to_uuid_up.sqlajoutenew_idmais ne migre pas les PK/FK ; soit compléter la migration, soit documenter l’état et le plan de migration - (P3) Nettoyer les tables fantômes (contests, equipment, etc.) ou les brancher au code
9. Frontend — Maturité (P2 / P3)
TypeScript & qualité
- (P2) Activer
noUncheckedIndexedAccessdanstsconfig.app.jsonet corriger les ~234 erreurs potentielles - TODO/FIXME : traiter ou tracker les ~26 TODO/FIXME restants (au moins les critiques)
Design system & docs
- (P3) Extraire le design system SUMI en package npm séparé (
components/ui/+ tokensindex.css) si réutilisation multi-projet - Réduire le bruit dans
docs/: fusionner les 55+ fichiers d’audit en un CHANGELOG / KNOWN_ISSUES (ou déplacer les audits dans un dossier dédié) - (P3) ADR (Architecture Decision Records) pour les choix importants (auth, state, design system)
UX & accessibilité
- (P2) aria-live pour le player et les notifications (contenu dynamique annoncé aux lecteurs d’écran)
- (P2) Images : srcset, WebP/AVIF, lazy loading natif où pertinent
- (P2) Code splitting : séparer gros chunks (framer-motion, axios, DOMPurify) dans
vite.config.tssi besoin
Package design-system inutilisé
- Si
packages/design-systemexiste et n’est pas utilisé : le supprimer du workspace ou le brancher pour éviter la duplication avecsrc/components/ui/
10. Résumé des priorités
| Priorité | Thème | Exemples d’actions |
|---|---|---|
| P0 | Sécurité / auth | Secrets git, JWT fallback chat, 2FA login, pagination bounds |
| P0/P1 | Frontend critique | 2FA bug, cleanup setTimeout, console.log, aria-label ChatInput, focus trap sidebar |
| P1 | Stabilité prod | Healthcheck Docker, CD registry, tests en échec, features fantômes |
| P1 | Dette structurante | Unifier loading, Modal→Dialog, découper interceptors/handlers, Track type |
| P2 | Consolidation | MSW complets, Storybook tests, E2E, typo unifiée, valeurs arbitraires |
| P2 | Produit | Gérer Coming Soon, marketplace/wishlist, social groups |
| P3 | Long terme | Workspace Rust/Go, Turborepo, migration UUID, design system package, ADR, CDN |
11. Ordre de passage suggéré
-
Semaine 1–2 (P0)
Secrets, JWT chat, 2FA frontend, pagination, cleanup setTimeout + console.log, aria-label + focus trap sidebar, healthcheck Docker. -
Semaine 2–4 (P1)
Tests en échec, migration Modal→Dialog, unifier loading, découpage interceptors/handlers (au moins par fichier), gestion des routes Coming Soon et des features mockées (wishlist/cart/groups), activation CD. -
Mois 2 (P2)
Stories Loading/Error/Empty, mocks MSW manquants, E2E parcours critiques, typo unifiée, réduction valeurs arbitraires, optionnel noUncheckedIndexedAccess et aria-live. -
Au-delà (P3)
Workspace monorepo, migration UUID, design system package, ADR, CDN, SBOM/signature Docker.
Document généré à partir des audits frontend et monorepo. À mettre à jour au fur et à mesure des réalisations.