Commit Graph

202 Commits

Author SHA1 Message Date
cedric 7d75866803 fix: create docker networks 2026-05-14 17:20:15 +04:00
cedric 42fb5f40f9 build: add node-gyp & sharp lib 2026-05-14 12:26:55 +04:00
cedric 60f5c8ae9c chore: remove package-lock.json 2026-04-30 20:15:43 +04:00
cedric 1109ceb2bb fix: web socket in dev 2026-04-14 17:38:23 +04:00
cedric d4deaa7716 chore: mise à jour todo.md — clôture P3
- Lazy loading : déjà implémenté (dynamic imports jsPDF/html2canvas/md-editor)
- NextAuth v5 stable : bloquée, pas de v5 stable publiée à ce jour
- Responsive mobile : à vérifier manuellement sur appareil

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-14 14:41:12 +04:00
cedric 43f1f6e9f2 a11y: corrections accessibilité WCAG 2.1 (critères 4.1.2, 4.1.3, 1.3.1)
sign.js :
- aria-label sur les 4 Fab (Se déconnecter, dashboard, Se connecter, S'enregistrer)
- Correction des guillemets typographiques U+2018/U+2019 en ASCII (empêchaient le parsing JSX)
- Suppression de useMemo inutilisé
- IIFE async ;() → startSubscription() nommée + .catch() explicite (semi-style + no-void)

auth-form/index.js :
- aria-label des IconButton visibility traduits en français avec état dynamique :
  'Afficher/Masquer le mot de passe' et 'Afficher/Masquer la vérification'

version-timeline.js :
- aria-label='Comparer les versions' sur IconButton Comparer
- aria-label dynamique + aria-expanded sur le bouton expand/collapse
- Correction object-curly-newline et jsx-closing-bracket-location (pré-existants)

version-search.js :
- inputProps aria-label='Rechercher dans les versions' (placeholder seul insuffisant)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-14 14:36:37 +04:00
cedric e75d2e1c53 feat: dockerisation frontend Next.js (output: standalone)
- next.config.mjs : output: 'standalone' — bundle minimal sans node_modules
- Dockerfile      : multi-stage (deps → builder → runner) sur node:22-alpine
  - ARG build-time pour les vars NEXT_PUBLIC_* et SENTRY_AUTH_TOKEN (optionnel)
  - Utilisateur non-root nextjs:nodejs (uid/gid 1001)
  - Image finale < 200 Mo (pas de node_modules, juste .next/standalone)
- docker-compose.yml : service frontend avec env_file et restart: unless-stopped
- .dockerignore   : exclut node_modules, .next, .env, yarn.lock, docs

Alternative au déploiement PM2 existant (DEPLOYMENT.md inchangé).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-14 06:55:41 +04:00
cedric c4762c6437 perf: cache des données constitution avec unstable_cache (ISR data layer)
La page d'accueil appelle auth() (cookies → dynamique) donc export const revalidate
ne s'applique pas au rendu. On cache à la place les appels Directus :

- fetchConstitution() → wrappée avec nextCache (unstable_cache)
- revalidate: 300 (5 min) — la constitution évolue peu
- tag 'constitution' — permet revalidateTag('constitution') depuis une API route
  pour invalider le cache à la demande lors d'un changement Directus

Les appels API Directus (titres + articles) ne sont plus refaits à chaque requête.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-14 06:54:07 +04:00
cedric a25a610d73 chore: suppression middleware.js et mise à jour yarn.lock
middleware.js fusionné dans proxy.js depuis le commit 8016c26.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-14 06:50:35 +04:00
cedric 8016c26e32 feat: intégration Sentry + migration middleware.js → proxy.js (Next.js 16)
Sentry (tracking erreurs frontend + API routes) :
- sentry.client.config.js  : erreurs navigateur + Session Replay sur erreurs
- sentry.server.config.js  : erreurs API routes (register, jwt callback)
- sentry.edge.config.js    : runtime edge (middleware proxy)
- instrumentation.js       : point d'entrée Next.js 15+ (register + captureRequestError)
- next.config.mjs          : wrappé avec withSentryConfig (source maps désactivés sans SENTRY_AUTH_TOKEN)
- .env.sample              : ajout de NEXT_PUBLIC_SENTRY_DSN (placeholder)

Migration middleware → proxy (bug pré-existant surfacé par le build Sentry) :
- proxy.js : fusion du rate limiting + auth NextAuth en un seul proxy Next.js 16
- middleware.js : supprimé (Next.js 16 n'accepte plus les deux fichiers simultanément)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-14 06:48:55 +04:00
cedric d8a771161c feat(auth): refresh token Directus explicite dans le callback JWT NextAuth
Sans ce correctif, l'access token Directus (~15 min) expirait silencieusement,
rendant toutes les requêtes API 401 sans déconnecter l'utilisateur.

- Ajout de refreshDirectusToken() : POST /auth/refresh avec rotation du refresh_token
- accessTokenExpires stocké dès la connexion (expires Directus - marge 60s)
- jwt callback : token valide → pass-through, token expiré → refresh, échec → error flag
- session callback : propagation de session.error = 'RefreshAccessTokenError'
  (permet au client de forcer un signOut si le refresh_token est lui-même expiré)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-14 06:37:11 +04:00
cedric 7b831d5bc4 test: tests unitaires Vitest — format, version-utils, rate-limit
- Installe vitest@4 + @vitest/coverage-v8 (40 tests, 0 échec)
- lib/__tests__/format.test.js        : 14 tests (formatKonstitisyon, formatDate, hasRestrictedChar)
- lib/__tests__/version-utils.test.js : 17 tests (filterVersions par texte/auteur/date, getFilterStats)
- lib/__tests__/rate-limit.test.js    : 9 tests avec fake timers (limite, reset, retryAfter, keys indépendantes)
- vitest.config.mjs : environnement node, imports explicites (pas de globals)
- package.json : scripts test / test:watch / test:coverage + override XO pour les fichiers de test

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-14 06:30:10 +04:00
cedric 170c3c5e90 security: Content Security Policy et headers HTTP sécurité
- Renomme next.config.js → next.config.mjs (ESM, satisfait unicorn/prefer-module)
- Ajout de headers() avec CSP stricte :
    script/style-src 'unsafe-inline' (requis Next.js + Emotion/MUI)
    connect-src dynamique depuis les env vars Directus (API + WebSocket)
    object-src 'none', frame-ancestors 'none', base-uri 'self'
    img-src 'self' data: blob: (html2canvas / export PDF)
- Ajout X-Frame-Options, X-Content-Type-Options, Referrer-Policy,
  Permissions-Policy sur toutes les routes

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 21:55:40 +04:00
cedric dc1f115bd6 security: sanitiser la sortie marked avec DOMPurify (XSS)
export-pdf-button et print-button injectaient marked(content) directement
dans innerHTML / document.write. Un lien Markdown javascript: passait le
filtre hasRestrictedChar et pouvait s'exécuter.

Ajout de DOMPurify.sanitize() via import dynamique (déjà présent en dep
transitive de jspdf) sur les deux composants, avec whitelist de tags
et d'attributs stricte. markdown-renderer n'est pas touché car
react-markdown-preview utilise rehype-sanitize en interne.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 21:48:26 +04:00
cedric d8a63bc4d8 feat: rate limiting sur les routes d'authentification critiques
- Ajout de lib/rate-limit.js : fabrique de limiter en mémoire (closure +
  Map avec nettoyage lazy), sans dépendance externe, réutilisable
- Ajout de middleware.js : intercepte /api/auth/register (5 req/15min)
  et /api/auth/callback/credentials (10 req/5min), répond 429 + Retry-After
- Ajout de tasks/todo.md et tasks/lessons.md (suivi CLAUDE.md)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 21:30:38 +04:00
cedric 22130529f6 feat: récupère le total des votes 2026-01-24 23:35:48 +04:00
cedric b838f46b2b fix: change color & variant pour le total des votes 2026-01-24 22:25:53 +04:00
cedric c2f8a4fb19 feat: ajout du nombre de vote total 2026-01-24 22:14:49 +04:00
cedric a184665ed1 feat: simplifie la vue timeline 2026-01-24 21:34:02 +04:00
cedric be45cc1cc0 docs: ajout de proxy_buffer et X-Forwarded-Host dans la configuration nginx 2026-01-24 17:56:56 +04:00
cedric 5ee2e3707a build: upgrade next-auth 2026-01-24 13:42:20 +04:00
cedric 6f214f7468 feat: ajoute la possibilité de désactiver les websockets 2026-01-24 13:22:35 +04:00
cedric 8ec761b2c8 fix: ajout d'un cercle circulaire lors du chargement des commentaires 2026-01-24 12:23:04 +04:00
cedric 315c71baa4 feat: denier titre publié dans le select lors de la création d'article 2026-01-24 09:08:20 +04:00
cedric d19fbf990b feat: ajout de la timezone pour les exports 2026-01-24 00:40:38 +04:00
cedric 760ca0609d docs: ajout de la documentation pour le déploiement 2026-01-23 23:23:09 +04:00
cedric de81fbfe5c fix: change titres sorting 2026-01-22 11:38:30 +04:00
cedric 1cf621b752 chore: renomme domaine konstitisyon.la vers konstitisyon.nu 2026-01-10 23:41:57 +04:00
cedric e7c4343bfc build: upgrade react-md-editor, jspdf, marked & react-virtuoso 2026-01-05 21:07:43 +04:00
cedric 2701957af8 fix: ferme les votes sur les versions obsolètes dans PDF/Print 2026-01-04 13:14:09 +04:00
cedric e101f503d2 feat: améliorer la gestion de WebSocket Directus 2026-01-04 13:13:49 +04:00
cedric 47d58680b3 build: upgrade Mui & d'autres lib liées 2026-01-04 13:13:25 +04:00
cedric 5679d71b5b build: upgrade date-fns vers 4.1.0 2026-01-04 13:13:03 +04:00
cedric 6134755888 fix: ajout de await à searchParams 2026-01-04 13:12:49 +04:00
cedric 7c41beb992 fix: erreur explicite lors de l'échec de connexion 2026-01-04 13:12:10 +04:00
cedric 1cedf24a65 chore: ajout de next.config 2026-01-04 13:11:59 +04:00
cedric 5249dda717 build: upgrade directus/sdk 2026-01-04 13:11:34 +04:00
cedric 21bc604fb8 refactor: replace middleware par proxy 2026-01-04 13:11:20 +04:00
cedric 2047ec0088 build: upgrade next, react & react-dom 2025-12-23 19:09:40 +04:00
cedric d47df252e7 build: upgrade next-auth 2025-07-24 12:13:45 +04:00
cedric af7189dd6e fix: corrigé couleur texte markdown timeline
- Ajout useTheme pour accès aux couleurs Material-UI
- Utilisation theme.palette.text.secondary pour le markdown
- Compatible thèmes sombre et clair
- Texte markdown maintenant lisible sur tous fonds
2025-07-24 11:34:08 +04:00
cedric cd8fd59a7f fix: ajouté rendu markdown dans extraits timeline
- Import du composant MarkdownRenderer dans version-timeline.js
- Logique d'extrait améliorée préservant structure markdown
- Points de coupure intelligents (phrases, paragraphes, mots)
- Longueur d'extrait augmentée à 150 caractères
- Fallback vers Typography pour texte simple
2025-07-24 11:30:35 +04:00
cedric 21a38d3987 feat: upgrade vers Next.js 15.4.3 et React 19
- Upgrade Next.js de 14.2.3 vers 15.4.3
- Upgrade React et React DOM vers version 19
- Modification page dynamique [id] pour compatibilité Next.js 15
- Gestion asynchrone des params et searchParams
- Tests de build et développement réussis
2025-07-24 11:15:35 +04:00
cedric b6320806c1 fix: amélioré layout table versions avec boutons actions
- Augmenté largeur colonne Actions: 100px → 200px
- Optimisé largeurs: Version 200px→180px, Date 120px→140px
- Ajouté flexWrap et gap réduit (0.3) pour boutons
- Hauteur minimum cellules actions: 64px
- Style compact pour bouton Comparer (minWidth auto)
2025-07-24 08:17:33 +04:00
cedric c9cf8dcdff feat: ajouté impression optimisée pour versions
- Composant PrintButton avec fenêtre popup dédiée
- Styles CSS print-optimized pour A4 avec media queries
- Support markdown complet avec rendu approprié
- Interface print avec boutons Imprimer/Fermer
- Feedback snackbar cohérent avec autres composants
- Intégré dans VersionPage, ListVersions et VersionTimeline
2025-07-24 08:08:15 +04:00
cedric 89fd63c8d7 fix: corrigé affichage erreurs vote backend
- Extraction message d'erreur depuis objet Directus
- Gestion fallback pour différents formats d'erreur
- Affichage correct messages extension backend en français
2025-07-24 07:51:05 +04:00
cedric 06c037a76e fix: ajouté vérification délai vote dans VersionTimeline
- Calcul isVoteDisabled basé sur 3 jours après création
- Désactivation VoteButtons pour versions anciennes
- Chip visuel "Vote fermé" pour versions expirées
- Cohérence avec VersionPage et VersionComparison
2025-07-23 20:39:03 +04:00
cedric 55b41a906b feat: ajouté support markdown dans export PDF
- Parser markdown avec marked pour rendu HTML complet
- Styles CSS pour éléments markdown (headings, listes, code, etc.)
- Nettoyage automatique des styles temporaires
- Fallback texte brut si parsing markdown échoue
2025-07-23 20:35:41 +04:00
cedric 19941839a6 feat: ajouté export PDF pour versions
- Composant ExportPdfButton avec jsPDF + html2canvas
- Support multi-pages avec formatage professionnel
- Intégré dans VersionPage, ListVersions et VersionTimeline
- Métadonnées complètes: nom, auteur, date, statut vote
- Dynamic imports pour optimiser bundle size
2025-07-23 20:31:55 +04:00
cedric 0a1ab064d7 fix: ajouté feedback visuel pour bouton partage en-tête
- Notifications snackbar pour partage natif et copie presse-papier
- Gestion erreurs avec messages appropriés
- Fallback complet pour navigateurs plus anciens
2025-07-23 20:14:53 +04:00