Commit Graph
100 Commits
Author SHA1 Message Date
cedric 1109ceb2bb fix: web socket in dev 2026-04-14 17:38:23 +04:00
cedricandClaude Sonnet 4.6 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
cedricandClaude Sonnet 4.6 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
cedricandClaude Sonnet 4.6 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
cedricandClaude Sonnet 4.6 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
cedricandClaude Sonnet 4.6 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
cedricandClaude Sonnet 4.6 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
cedricandClaude Sonnet 4.6 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
cedricandClaude Sonnet 4.6 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
cedricandClaude Sonnet 4.6 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
cedricandClaude Sonnet 4.6 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
cedricandClaude Sonnet 4.6 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
cedric db8b5dd1c2 feat: synchronisé votes entre header et comparaison
- État voteRefreshKey partagé pour forcer refresh des VoteButtons
- Props onVoteResult passées à VersionComparison
- Clés uniques pour chaque VoteButtons (header/comparison)
- Snackbar local dans VersionComparison si pas de callback parent
2025-07-23 20:13:07 +04:00
cedric f00b7c827d fix: ajouté feedback visuel pour votes sur VersionPage
- Callback onVoteResult pour VoteButtons avec notifications
- Snackbar pour confirmer succès/erreur des votes
- État snackbar avec gestion des messages
2025-07-23 20:10:01 +04:00
cedric 4964938485 fix: ajouté variables NEXT_PUBLIC pour footer côté client
- Variables NEXT_PUBLIC_APP_FOOTER_TEXT/URL dans .env.sample
- Supprimé console.log debug dans Footer
2025-07-23 20:06:34 +04:00
cedric 6dc1bf5a6f fix: ajouté 'use client' au composant VersionPage 2025-07-23 19:59:51 +04:00
cedric 8f272d931c fix: corrigé chemin import auth.js dans route dynamique 2025-07-23 19:58:32 +04:00
cedric 91332724a3 feat: intégré bouton partage dans ListVersions et VersionTimeline
- Ajout ShareButton dans colonnes Actions table et cards timeline
- Génération URLs partageables vers versions spécifiques
- Support partage natif avec fallback copie presse-papier
2025-07-23 19:54:20 +04:00
cedric 529452b0fb feat: créé route dynamique et page version individuelle
- Route app/dashboard/versions/[id]/ pour URLs spécifiques
- Composant VersionPage avec affichage et partage natif
- Support modes comparison/content via paramètre URL
2025-07-23 19:54:10 +04:00
cedric 2a9c0497d9 feat: intègre CopyButton dans VersionComparison 2025-07-23 19:45:38 +04:00
cedric 0c7b097cb0 feat: intègre CopyButton dans ListVersions 2025-07-23 19:45:30 +04:00
cedric ff8da3010d feat: intègre CopyButton dans VersionTimeline 2025-07-23 19:45:21 +04:00
cedric 7831ab473b feat: ajoute composant CopyButton 2025-07-23 19:45:06 +04:00
cedric 1ce038054e feat: intègre recherche et filtres dans ListVersions 2025-07-23 18:50:23 +04:00
cedric 65e6498802 feat: ajoute composant VersionFilters 2025-07-23 18:50:16 +04:00
cedric 502ac388af feat: ajoute composant VersionSearch 2025-07-23 18:50:07 +04:00
cedric 5a5264fb7a feat: ajoute utilitaires de filtrage des versions 2025-07-23 18:49:54 +04:00
cedric 60d7972420 deps: ajoute use-debounce pour recherche 2025-07-23 18:49:38 +04:00
cedric 870f07669e refactor: utilise VoteButtons dans VersionComparison 2025-07-23 18:21:34 +04:00
cedric 1ef29e517c refactor: utilise VoteButtons dans VersionTimeline 2025-07-23 18:21:24 +04:00
cedric 5c3311ca5f feat: ajoute composant VoteButtons réutilisable 2025-07-23 18:21:12 +04:00
cedric 2cf7273f29 feat: améliore interface VersionDialog 2025-07-23 17:41:15 +04:00
cedric e5b2671289 feat: ajoute bascule table/timeline dans ListVersions 2025-07-23 17:41:00 +04:00
cedric 824408afa9 feat: ajoute composant VersionTimeline 2025-07-23 17:40:45 +04:00
cedric bf87b08fa9 deps: ajoute @mui/lab 2025-07-23 17:39:02 +04:00
cedric f7dcc837d2 feat: ajoute affichage auteur pour toutes les versions 2025-07-23 14:30:09 +04:00
cedric 3bb26c7239 feat: améliore label légende versions obsolètes 2025-07-23 14:04:34 +04:00
cedric 709128f881 feat: améliore design cartes et légende comparaison versions 2025-07-23 13:40:34 +04:00
cedric acabbae951 fix: corrige rendu markdown dans comparaison versions 2025-07-23 12:22:21 +04:00
cedric 09d17dafaa feat: ajoute rendu markdown aux articles 2025-07-23 12:21:57 +04:00
cedric f0e5e07386 feat: intègre éditeur riche pour articles uniquement 2025-07-23 12:21:43 +04:00
cedric 2d824175e2 feat: ajoute RichTextEditor avec compteur 2025-07-23 12:21:32 +04:00
cedric 715891e657 feat: ajoute MarkdownRenderer avec couleurs personnalisées 2025-07-23 12:21:10 +04:00
cedric 899cf96ef0 deps: ajoute @uiw/react-md-editor 2025-07-23 12:20:36 +04:00
cedric 247151012d refactor: renomme LogoutCountdown en SessionExpired 2025-07-23 08:45:15 +04:00
cedric f1c24080da feat: supprime le compte à rebours de déconnexion 2025-07-23 08:44:07 +04:00
cedric 1c88e36a3e WS souscription 2025-01-04 19:10:21 +04:00
cedric 0860132763 Changement de couleur de la date de version en fonction du statut du vote 2024-12-17 19:04:10 +04:00
cedric af53eafc2d feat: interdit le vote pour les versions de plus de 3 jours 2024-12-17 12:37:50 +04:00
cedric 4cd303a910 typo: message explicite pour une erreur lors d'un vote 2024-12-17 12:36:56 +04:00
cedric 7902537df1 refactor: versionData > versionCompare + Ajout de la date de création d'une version et de l'utilisateur qui l'a créée 2024-12-17 05:45:16 +04:00
cedric 9e78a32d8d fix: error when no titre or article 2024-12-16 13:34:05 +04:00
cedric e4a294dece docs: améliore la documentation avec le schéma de la base de données
- Ajoute un diagramme ERD en Mermaid montrant la structure de la BDD
- Généralise la description du projet (non spécifique à Haïti)
- Réorganise la section modèle de données
- Clarifie les relations entre les entités
2024-12-16 10:19:20 +04:00
cedric aa02a51a1b feat: Implémentation du système de vote sur les versions
- Ajout des fonctions de vote dans directus.js (handleVote, getUserVote)
- Intégration des boutons de vote dans version-comparison.js
- Support de l'annulation de vote par double-clic
- Gestion des retours visuels (succès/erreur)
- Passage des props nécessaires dans list-versions.js
2024-12-16 09:14:02 +04:00
cedric 3105327735 Add vote icons to current version 2024-12-16 03:32:33 +04:00
cedric 00472914c7 Typo for VersionComparison component 2024-12-03 19:12:15 +04:00
cedric 619f2c566b Improve VersionComparison 2024-12-03 11:51:29 +04:00
cedric 2aa14d41f6 Update directus/sdk 2024-12-03 08:00:11 +04:00
cedric d5365596b0 Update mui dependencies 2024-12-03 07:56:11 +04:00
cedric d5a363953b Remove unnecessary attributes 'item' in Grid component 2024-12-01 22:55:35 +04:00
cedric c0c556cfb8 Fix error when creating comment 2024-12-01 22:46:11 +04:00
cedric 2fc797fa9a Change license to AGPL-3.0 2024-12-01 18:31:26 +04:00
cedric 317161750c Change VersionComparison spaces 2024-12-01 18:29:44 +04:00
cedric 71f18d6909 Improve ListVersion component 2024-11-28 07:55:51 +04:00
cedric 3134184ece Create VersionComparison & VersionDialog components 2024-11-28 07:55:32 +04:00