Files
workshop-manager/openspec/changes/archive/2026-03-09-perf-quick-wins/tasks.md
Froidefond Julien 2d266f89f9 feat(perf): implement performance optimizations for session handling
- Introduced a new configuration file `config.yaml` for specifying project context and artifact rules.
- Added `.openspec.yaml` files for tracking changes related to performance improvements.
- Created design documents outlining the context, goals, decisions, and migration plans for optimizing session performance.
- Proposed changes include batching database queries, debouncing event refreshes, purging old events, and implementing loading states for better user experience.
- Added tasks and specifications to ensure proper implementation and validation of the new features.

These enhancements aim to improve the scalability and responsiveness of the application during collaborative sessions.
2026-03-10 08:06:47 +01:00

2.0 KiB

1. Batch resolveCollaborator (N+1 fix)

  • 1.1 Lire src/services/session-queries.ts et identifier toutes les occurrences de resolveCollaborator appelées en boucle
  • 1.2 Créer une fonction batchResolveCollaborators(userIds: string[]) qui fait un seul prisma.user.findMany({ where: { id: { in: userIds } } })
  • 1.3 Remplacer les boucles N+1 par collect des IDs → batch query → mapping en mémoire
  • 1.4 Vérifier que les pages sessions/weather/etc. chargent correctement

2. Debounce router.refresh() dans useLive

  • 2.1 Lire src/hooks/useLive.ts et localiser l'appel à router.refresh()
  • 2.2 Ajouter un useRef<ReturnType<typeof setTimeout>> pour le timer de debounce
  • 2.3 Wrapper l'appel router.refresh() avec clearTimeout + setTimeout à 300ms
  • 2.4 Ajouter un clearTimeout dans le cleanup de l'effet pour éviter les leaks mémoire

3. Purge automatique des événements SSE

  • 3.1 Lire src/services/session-share-events.ts et localiser createEvent et cleanupOldEvents
  • 3.2 Ajouter un appel fire-and-forget à cleanupOldEvents à la fin de createEvent (après l'insert)
  • 3.3 Wrapper l'appel dans un try/catch pour logger l'erreur sans bloquer

4. Ajout des loading.tsx sur les routes principales

  • 4.1 Créer src/app/sessions/loading.tsx avec un skeleton de liste de sessions
  • 4.2 Créer src/app/weather/loading.tsx avec un skeleton de tableau météo
  • 4.3 Créer src/app/users/loading.tsx avec un skeleton de liste utilisateurs
  • 4.4 Vérifier que le skeleton s'affiche bien à la navigation (ralentir le réseau dans DevTools)

5. Lazy-load des modals avec next/dynamic

  • 5.1 Identifier tous les composants qui importent ShareModal directement
  • 5.2 Remplacer chaque import statique par next/dynamic(() => import(...), { ssr: false })
  • 5.3 Vérifier que les modals s'ouvrent correctement après lazy-load
  • 5.4 Vérifier dans les DevTools Network que le chunk modal n'est pas dans le bundle initial