Commit Graph

66 Commits

Author SHA1 Message Date
Azmog 867d744242 feat: add slide generation script for CESIZen project, covering deployment and security aspects 2026-07-09 16:41:44 +02:00
Azmog 37a1079201 fix(soutenance): regénère le PPTX avec les bons diagrammes MCD et MVC
Les slides MCD (Merise) et Architecture MVC affichaient le diagramme de
cas d'usage (PPTX périmé). Les PNG sources étaient corrects ; il suffisait
de regénérer le support.
2026-06-19 16:06:28 +02:00
Azmog 94d4c9138b docs: antiseche orale en plan de points (quoi dire) au lieu de phrases a lire 2026-06-19 15:57:27 +02:00
Azmog cd7dfb6ce9 docs: réécrit l'antisèche orale en 'ce que je dis' (phrases prêtes + glossaire) 2026-06-19 15:55:20 +02:00
Azmog 7fcbe8ff64 chore(deploy): ajoute des health checks backend et frontend
- backend : route santé Laravel /up via php (curl absent de l'image)
- frontend : page d'accueil via node http
Coolify attendra désormais que chaque conteneur soit prêt avant de router.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 15:51:04 +02:00
Azmog 004b8a12df fix(web): corrige la boucle de redirection infinie sur token expiré
Sur 401, l'intercepteur n'effaçait que le token localStorage mais pas le
cookie cesizen-auth lu par le middleware -> /connexion redirigeait vers
/dashboard à l'infini quand le JWT (60 min) expirait. On purge désormais
aussi le cookie et l'état Zustand persisté avant de rediriger.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 15:45:59 +02:00
Azmog d5e11f93a9 fix(mobile): abaisse encore un peu la barre d'onglets
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 15:39:51 +02:00
Azmog b6d4578862 fix(mobile): abaisse les libellés de la barre d'onglets (moins de marge basse)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 15:39:05 +02:00
Azmog 925f56a649 fix(mobile): respecte les safe areas (Dynamic Island + indicateur home)
- AppBar : marge haute = inset top (plus de chevauchement avec l'heure/Dynamic Island)
- barre d'onglets : hauteur/marge basse = inset bottom (plus collée au bord)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 15:38:16 +02:00
Azmog 91ceca2be5 polish(mobile): audit design DSFR multi-agents — tokens, a11y, états, finitions
- tokens centralisés (Tint, IconSize, LineHeight, LetterSpacing), zéro hex en dur
- accessibilité (rôles, labels, live regions, afficher/masquer mot de passe)
- états vides/erreur complétés (ex. saisie introuvable), cibles tactiles >=44px
- suppression du composant mort RepubliqueHeader

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 15:29:40 +02:00
Azmog 7fd27d8dc2 feat(mobile): refonte design DSFR complète + partie admin
- écrans auth/dashboard/journal/info/urgence/profil refondus sur le design system
- AppBar institutionnel République Française sur tous les écrans
- partie admin (utilisateurs, contenus, émotions) avec AdminGuard
- entrée Espace administration dans le profil (admins uniquement)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 15:22:15 +02:00
Azmog 2e96e07c7e feat(mobile): fondation design system DSFR (theme + composants UI) + hooks admin + route admin
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 15:14:55 +02:00
Azmog 549a2fdb03 chore: ajoute make mobile-tunnel (Expo sans WiFi commun)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 14:47:10 +02:00
Azmog 21fd87eb1a chore: corrige l'avertissement watchman du mobile (.watchmanconfig + make mobile-reset)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 14:42:42 +02:00
Azmog 70722e3fe5 chore: ajoute un Makefile pour lancer back/web/mobile proprement
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 14:39:08 +02:00
Azmog 4f54340e89 fix: corrections post-audit (traçabilité, identité État, accents, graphique mobile)
Backend:
- table audits réellement alimentée via trait Auditable (observers Eloquent)
  sur Utilisateur, SaisieTracker, Feed, Emotion ; mot de passe jamais loggé
- 4 nouveaux tests (19/19 au total)

Frontend web:
- en-tête/pied République Française ajoutés aux pages connexion/inscription
- bouton variant danger réellement rouge (tokens erreur DSFR)

Mobile:
- ~30 libellés ré-accentués (Intensité, Succès, Déconnexion, Répartition...)
- Colors.secondary = rouge Marianne #E1000F (différenciation cartes/icônes)
- vrai camembert SVG des rapports (react-native-svg)

Docs: plans oraux mis à jour (audits actif, 29 tests, stockage JWT en Q/R)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 11:17:40 +02:00
Azmog 7be7bec53d docs: ajoute DSFR et déploiement en ligne aux plans oraux
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 11:01:30 +02:00
Azmog f18fb5450b fix(frontend): finitions DSFR (ThemeToggle orphelin, confirm() -> ConfirmDialog, tooltips)
- supprime ThemeToggle orphelin (inerte, forçait le thème sombre)
- remplace les confirm() natifs par ConfirmDialog DSFR sur les 3 pages admin
  (utilisateurs, contenus, émotions)
- tooltips Recharts en variables DSFR (lisibles en clair ET sombre)

tsc 0, build OK.
2026-06-19 10:57:01 +02:00
Azmog fe9e921d73 fix(backend): durcissements (throttle register, garde auto-suppression admin, null-check saisie)
- throttle:10,1 sur l'inscription (anti-spam de comptes)
- un admin ne peut plus désactiver/supprimer son propre compte (anti lock-out)
- update/destroy saisie : abort 404 propre si l'utilisateur n'a pas de tracker

Tests 15/15, Pint pass.
2026-06-19 10:47:37 +02:00
Azmog ae9395a831 fix: corrections issues de l'audit (design DSFR + SDK 54 mobile + honnêteté)
- globals.css : supprime l'override Inter/Poppins (Marianne DSFR s'applique) et
  les palettes candlelight/malachite mortes
- mobile : réinstall SDK 54 (expo 54, RN 0.81.5, worklets) ; app.json splash +
  adaptiveIcon en blanc (plus de jaune #fce117 hors charte)
- formulation honnête du chiffrement (politique conf. + inscription)
- compose : retire la référence au guide supprimé

Vérifs : frontend tsc/lint OK ; mobile tsc 0 + expo-doctor 18/18.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 10:44:45 +02:00
Azmog 35a28e2504 chore(deploy): supprime le fichier de déploiement Coolify obsolète 2026-06-19 10:30:37 +02:00
Azmog f2af66bd36 fix(deploy): force FRONTEND_URL/APP_URL dans .env (CORS prod)
Le FRONTEND_URL=http://localhost du .env masquait l'origine de production -> CORS
bloquait cesizen.cleanows.fr. L'entrypoint écrit désormais les URLs publiques
(fournies par le conteneur) dans le .env.
2026-06-19 10:30:11 +02:00
Azmog bcbdb2ab10 fix(deploy): écrit les paramètres DB dans .env au démarrage
Un DB_PASSWORD vide dans .env (issu de .env.example) masquait la valeur du
conteneur -> 'no password supplied'. L'entrypoint force désormais DB_HOST/PORT/
DATABASE/USERNAME/PASSWORD dans .env (valeurs par défaut alignées sur postgres).
2026-06-19 10:26:41 +02:00
Azmog 40137c2991 fix(deploy): renomme le volume Postgres (init propre avec le bon mot de passe)
Force la création d'un volume neuf -> postgres s'initialise avec le mot de passe
figé, sans avoir à supprimer manuellement l'ancien volume (mismatch). Un simple
Redeploy suffit.
2026-06-19 10:08:45 +02:00
Azmog 2dd93fbbb4 fix(deploy): valeurs en dur dans le compose, sans secret versionné
APP_KEY/JWT_SECRET générés par l'entrypoint (hors dépôt). Domaines + identifiants
DB internes figés en dur (Coolify ne propage pas les ${...}). Base non exposée.
2026-06-19 09:58:32 +02:00
Azmog cc64cb0180 fix(deploy): cache/session/queue en database par défaut (plus de dépendance Redis)
L'API tentait de joindre un service 'redis' inexistant en prod. Bascule des
défauts CACHE_STORE/SESSION_DRIVER/QUEUE_CONNECTION sur database + optimize:clear
au démarrage pour relire les variables d'env.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 09:44:53 +02:00
Azmog 0c6195a4e9 fix(deploy): APP_KEY/JWT_SECRET fiables (écrit dans .env + export si générés)
Corrige MissingAppKeyException : une variable d'env vide masquait la valeur du
.env. On force désormais APP_KEY/JWT_SECRET dans .env si fournies, sinon on les
génère ET on les exporte dans l'environnement du process.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 09:39:47 +02:00
Azmog 1816fd585d fix(deploy): Postgres démarre sans config (mot de passe par défaut + start_period)
Le conteneur postgres plantait (unhealthy) faute de POSTGRES_PASSWORD. Valeur par
défaut fournie (à surcharger dans Coolify) + start_period pour le healthcheck.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 09:24:09 +02:00
Azmog f803798429 chore(deploy): renomme le compose de prod en .yaml (attendu par Coolify) 2026-06-19 09:18:54 +02:00
Azmog 9b63dc8809 feat(deploy): Dockerfiles de production + compose + guide Coolify
- frontend/Dockerfile.prod : Next.js standalone (294 Mo), régénère les assets DSFR,
  injecte NEXT_PUBLIC_API_URL au build (npm ci --ignore-scripts pour le postinstall)
- backend/Dockerfile.prod + docker/entrypoint.sh : API Laravel, migrations + seed
  idempotent + serveur, génération de secrets en fallback
- docker-compose.prod.yml : Postgres + API + Front pour déploiement Coolify
- next.config.ts : output standalone ; .dockerignore back/front
- DEPLOIEMENT_COOLIFY.md : guide + variables d'environnement

Images de prod testées (build + smoke-test DSFR OK).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 09:15:35 +02:00
Azmog 6de41bb6ce feat(expo): ajouter des fichiers README et settings pour la configuration de l'environnement Expo 2026-06-19 00:56:58 +02:00
Azmog bfdad3af5e Merge branch 'refonte-dsfr' 2026-06-19 00:51:17 +02:00
Azmog 2e2ee5fe71 chore(backend): autorise localhost:3001 en CORS (dev) 2026-06-19 00:51:17 +02:00
Azmog 4432bf5c21 fix(dsfr): graphique d'évolution en barres empilées + confirmation de déconnexion (web)
- évolution : courbes monotone (vagues sinusoïdales illisibles) remplacées par
  un histogramme empilé par émotion, bien plus lisible
- ajoute une confirmation avant déconnexion dans l'en-tête web

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 00:49:35 +02:00
Azmog 43a149381f fix(dsfr): Modal avec overlay visible et fermeture fiable
L'ancienne implémentation (<dialog> plein écran transparent) rendait la page
inutilisable au clic sur éditer/supprimer : overlay invisible captant tous les
clics, sans fond assombri ni fermeture au clic extérieur. Remplacé par un
overlay React maîtrisé (fond assombri, clic extérieur/Échap/bouton ferment).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 00:39:32 +02:00
Azmog df911efde1 fix(mobile): déconnexion locale d'abord (instantanée, fiable hors-ligne)
L'appel API /auth/logout pouvait bloquer la déconnexion ; on purge le token et
réinitialise l'état immédiatement, puis on notifie le serveur en arrière-plan.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 00:34:15 +02:00
Azmog 50bcd3533f fix(mobile): aligne babel-preset-expo sur 54.0.11 (SDK 54)
Une version 56.x avait été installée par erreur et transpilait mal pour Hermes
(« private properties are not supported »). Retour à la version du SDK 54.
Retire aussi le plugin worklets manuel (déjà fourni par le preset).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 00:25:51 +02:00
Azmog ee4bbf321b fix(mobile): ajoute le plugin babel react-native-worklets (requis par Reanimated 4 / SDK 54)
Corrige l'erreur Hermes « private properties are not supported » au démarrage.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 00:20:43 +02:00
Azmog 7358d3aaa8 fix(backend): rend EmotionSeeder et FeedSeeder idempotents
Le conteneur exécute `migrate --seed` à chaque démarrage ; sans garde, un
redémarrage dupliquait les émotions et les contenus. Skip si déjà peuplé.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 00:17:58 +02:00
Azmog 511d3b95f0 fix: babel-preset-expo (SDK 54) + navigation wizard sans rognage
- ajoute babel-preset-expo en devDependency (manquant après migration SDK 54,
  bloquait le bundling Metro)
- remplace le fr-btns-group du wizard de saisie par un flex simple : les
  libellés "Précédent/Suivant/Enregistrer" ne sont plus tronqués

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 00:17:57 +02:00
Azmog 170c6ffce2 chore(mobile): migration Expo SDK 53 -> 54 (pour Expo Go iOS à jour)
- expo ^54, react-native 0.81.5, react 19.1.0, @types/react ~19.1.8
- ajout react-native-worklets (peer de reanimated 4), jest-expo ~54
- expo-doctor 18/18, tsc 0

Permet d'exécuter l'app sur un iPhone avec Expo Go SDK 54.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 00:07:09 +02:00
Azmog 6921022e87 fix(dsfr): remplace l'usage détourné de fr-card par un panneau .app-panel
.fr-card (flex + height:100% + bordure ::before) débordait quand utilisé comme
conteneur générique (wizard de saisie, journal, rapports, profil, timeline) et
chevauchait le footer. Remplacé par .app-panel (panneau neutre, variables DSFR).
Les vraies cartes structurées (fr-card__body) sont conservées.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 00:02:33 +02:00
Azmog 1bd8608acb polish(dsfr): layout membre en fond DSFR + masque l'en-tête natif de l'onglet Accueil (mobile)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 23:49:59 +02:00
Azmog ca88bf7737 feat(mobile): applique l'identité visuelle DSFR (bleu France, République Française)
- palette officielle DSFR (#000091, rouge Marianne, gris DSFR) dans lib/colors.ts
- composant RepubliqueHeader (bloc « République Française » + service CESIZen)
- restyle boutons/champs/cartes/onglets/urgence au style gouv.fr sur tous les écrans
- couleurs d'émotions conservées

Le DSFR étant un framework web, le mobile en reçoit l'identité visuelle (pas les classes fr-*). tsc 0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 23:45:05 +02:00
Azmog 69c40bd628 chore(frontend): exclut public/ (assets DSFR) du lint 2026-06-18 23:35:31 +02:00
Azmog f6e150ddae feat(frontend): convertit l'ensemble des pages et composants au DSFR
- composants UI (Input, Card, Badge, Modal, ConfirmDialog, Slider, Skeleton,
  ThemeToggle) + Sidebar
- pages auth (connexion, inscription)
- pages publiques (informations, détail, contacts urgence, mentions, RGPD)
- espace membre (dashboard, journal, wizard saisie via fr-stepper, rapports, profil)
  + composants tracker (EditSaisieModal, EmotionPicker, TrackerTimeline, EmotionChart)
- back-office admin (dashboard, utilisateurs, contenus, émotions)

Suppression de Tailwind candlelight/malachite + lucide-react. Build OK (20 routes).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 23:34:01 +02:00
Azmog 9b5be855fc fix(frontend): ajoute fr-header__menu-links requis par le JS DSFR (évite TypeError menuLinks)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 23:25:11 +02:00
Azmog ee59763dd2 fix(frontend): /admin redirige vers /admin/dashboard (évite un 404)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 23:20:47 +02:00
Azmog c0fd588708 fix(frontend): place la page d'accueil dans le groupe (public) pour hériter du header/footer DSFR
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 23:11:55 +02:00
Azmog 85c744defa feat(frontend): socle de refonte au Système de Design de l'État (DSFR)
- charge le DSFR (CSS/JS officiels) en statique via public/dsfr + postinstall
- en-tête officiel (bloc Marianne « République Française » + nom de service)
- pied de page officiel DSFR (liens institutionnels, licence etalab)
- page d'accueil refondue (hero, fr-card, fr-tile, fr-callout, fr-btn)
- composant Button mappé sur fr-btn
- assets DSFR hors git (régénérés par `npm install`)

Build OK (19 routes). Pages internes encore en Tailwind : conversion à poursuivre.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 23:09:47 +02:00