Commit graph

970 commits

Author SHA1 Message Date
50c92a5675 chore: Next.js 16.2.0 stable — sortie du canary, suppression du .npmrc legacy-peer-deps 2026-03-26 01:04:52 +01:00
c4fb7fc342 feat: composant AdminMenu (⚙ Gérer) avec actions contextuelles, fusion dans le menu de la page position, suppression du EditLink sur la page sujet, redirect serveur après fusion, TODO.md retiré du repo 2026-03-26 00:39:55 +01:00
20aa53bb85 feat: page détail position et fusion de positions — page /s/[slug]/position/[positionId] avec prises de position, fusion transactionnelle via rpc SQL merge_positions, méthode findByPositionIdWithFigures, lien cliquable sur les titres de position 2026-03-25 22:37:43 +01:00
1032806685 feat: lien Brouillons dans le footer pour les administrateurs 2026-03-25 02:29:08 +01:00
bfa384f605 feat: amendement des brouillons à la validation — formulaire inline avec sélection d'entités existantes (Combobox) ou édition des données de création, composant ModeToggle dans le design system, logique buildAmendments extraite et testée (9 tests) 2026-03-25 01:36:48 +01:00
51767afcd2 feat: distinction rejet définitif / demande de révision — statut revision_requested, deux actions séparées rejectDraftAction et requestRevisionAction, repo factorisé avec findByStatus unique 2026-03-24 23:50:19 +01:00
3abe376c72 feat: champ origin obligatoire sur les brouillons — identifie quelle IA a déposé chaque draft, affiché comme badge dans la carte admin 2026-03-23 23:59:11 +01:00
a1ad478ace feat: système de brouillons de prises de position — table draft_statements, API REST (GET/POST/PATCH) protégée par ADMIN_API_KEY, page admin /admin/drafts avec résolution des entités et validation en cascade via les use cases existants (createPublicFigure, createSubject, createPosition, createStatement), permission admin au rang Fondateur 2026-03-23 23:59:11 +01:00
1376416a24 feat: édition des positions — modifier titre et description depuis /s/[slug]/position/[id]/modifier, composant EditLink réutilisable 2026-03-23 15:21:27 +01:00
62493f36c6 feat: édition des personnalités — modifier nom, bio, photo, sources de notoriété depuis /p/[slug]/modifier 2026-03-23 00:24:04 +01:00
e2cc74bda1 feat: édition des prises de position — use case updateStatement, formulaire partagé StatementForm, page /p/[slug]/s/[subjectSlug]/modifier/[statementId], bouton Modifier visible pour les Idéalistes 2026-03-22 01:12:23 +01:00
04c5e7fc06 fix: rendre la migration de renommage no-op — la migration principale a déjà été corrigée avant déploiement 2026-03-22 00:35:35 +01:00
a70504ae38 refactor: fusionner Evidence dans Statement — un statement est une déclaration sourcée (citation + source + date + personnalité + position), suppression de l'entité Evidence et de la table evidences, renommage factDate → statedAt, nettoyage des permissions evidence_* 2026-03-22 00:30:32 +01:00
08c04907ad fix: le lien « Créer une position » utilisait l'UUID du sujet au lieu du slug — suppression de l'appel onSelect au mount dans le Combobox, le parent connaît déjà sa valeur initiale 2026-03-21 00:14:36 +01:00
7d970ae755 feat: préciser dans le guide et les formulaires que les positions doivent être concrètes et qu'une personnalité peut en avoir plusieurs — extraction du composant GuideExample 2026-03-20 21:59:29 +01:00
2413b41030 feat: évènement Plausible lors de la recherche de personnalité (query + nombre de résultats) 2026-03-18 23:40:20 +01:00
66b1cf5cd7 fix: remonter le bouton feedback au-dessus du footer 2026-03-18 23:29:44 +01:00
0d92ae4f95 feat: lien vers la liste d'attente sur la page /contribuer pour les visiteurs non connectés 2026-03-18 23:27:36 +01:00
00c8b78448 feat: limiter les thumbnails personnalités à 2 lignes sur la page d'accueil (SQL LIMIT 15 + CSS max-height) 2026-03-18 23:08:06 +01:00
254ec5bf34 fix: le champ taken_at des statements utilisait la date du jour au lieu de la date saisie par l'utilisateur 2026-03-18 23:06:37 +01:00
47c2f8ba10 feat: SEO page sujet — canonical URL, JSON-LD Article, Twitter card, image OG dynamique avec avatars des personnalités 2026-03-18 11:08:20 +01:00
068fd3ea0e fix: Next.js 16.1.1-canary.27 pour contourner le bug Turbopack opengraph-image (vercel/next.js#87322), en attente de 16.2 stable 2026-03-18 11:02:09 +01:00
6af13fd714 feat: SEO page personnalité — canonical URL, JSON-LD Person, image OG dynamique avec avatar, sujets et logo 2026-03-18 00:55:07 +01:00
bfb566509e fix: retour sur Next.js 16.1.7 stable (le fix Turbopack opengraph-image #87322 y est inclus) 2026-03-18 00:54:36 +01:00
d738d663aa feat: SEO — canonical URL, JSON-LD, image OG dynamique avec avatar, citation, source et logo + upgrade Next.js 16.1.1-canary.27 (fix Turbopack #87322) 2026-03-18 00:16:19 +01:00
e866f0b570 feat: afficher les autres personnalités sur le même sujet, groupées par position (alliés sous chaque carte, positions différentes en bas) 2026-03-17 00:49:33 +01:00
56eafe4068 feat: page détail prises de position d'une personnalité sur un sujet (/p/[slug]/s/[subjectSlug]) 2026-03-17 00:38:31 +01:00
03b52f0967 fix: recherche de sujet cassée en production dans le Combobox (downshift remplace les types string par des nombres en prod) 2026-03-16 18:26:05 +01:00
3a5e121fcf feat: widget feedback visiteurs avec envoi par email SMTP
Bouton flottant « Votre avis » sur toutes les pages, modal avec type/message/email optionnel. Envoi d'un email à contact@debats.co via Nodemailer (SMTP Infomaniak). Composant Select extrait dans le design system, styles de champs de formulaire mutualisés via CSS Modules composes. Modal amélioré pour le responsive (overlay scrollable, padding mobile).
2026-03-14 01:58:44 +01:00
ef0291beb9 fix: améliorer la gestion d'erreur de l'envoi d'invitation Supabase
Remonter l'erreur à Sentry avec le contexte (email, status) et afficher un message générique à l'utilisateur quand le message d'erreur est absent au lieu d'afficher {}.
2026-03-13 10:23:27 +01:00
b7f381828f feat: permettre le renvoi du lien d'invitation quand le token Supabase a expiré (24h)
Le token OTP Supabase expire après 24h (max autorisé) mais l'invitation applicative reste valide 7 jours. Quand le lien est expiré, l'invité peut maintenant demander un nouveau lien en un clic au lieu d'être bloqué. L'email est inclus dans l'URL d'invitation (urlquery-encodé) pour éviter de le redemander.
2026-03-13 00:33:28 +01:00
9c63aa3ff4 feat: ajouter Hugo Vergès aux crédits et extraire un composant Contributor 2026-03-12 23:23:27 +01:00
d31843baa6 feat: script de push de la config auth Supabase en production
Remplace l'usage dangereux de supabase config push (qui écrase la prod avec les valeurs locales) par un script dédié qui pousse des valeurs explicites via l'API Management. Le script affiche un diff avant/après et demande confirmation.
2026-03-12 23:18:23 +01:00
cd9faa0649 fix: améliorer le responsive de la page personnalités (header wrap, noms tronqués) 2026-03-12 23:06:21 +01:00
3dcf36c518 fix: ajouter scroll-padding-top pour compenser le header fixed après navigation 2026-03-12 22:53:29 +01:00
1ea9cb881a fix: augmenter otp_expiry à 24h pour éviter l'expiration prématurée des invitations 2026-03-12 22:36:09 +01:00
99ffd5ee8c feat: tunnel Sentry via /api/monitoring pour contourner les bloqueurs de pubs 2026-03-12 11:01:03 +01:00
b6e60c8c0b fix: empêcher le scroll en haut de page lors du clic sur l'index A-Z de /p 2026-03-12 10:59:10 +01:00
55db38f064 docs: mise à jour TODO (PWA fait, bug scroll en cours) 2026-03-12 10:41:07 +01:00
53490f9430 feat: rendre l'application installable en PWA (manifest, icônes, meta tags) 2026-03-12 10:23:48 +01:00
af3985f86e refactor: formulaires single-entity (personnalité, position, statement séparés)
Remplace les wizards multi-étapes par des formulaires créant une seule entité chacun.
Supprime les use cases composés (create-public-figure-with-statement, contribute-statement,
create-position-with-statement) et leurs actions/composants associés.
Ajoute FormSuccess, CSS partagé form-with-guide, types partagés domain/use-cases/types.
Ajoute le bouton « Ajouter une position » sur la page sujet.
2026-03-12 00:56:48 +01:00
e852731ae7 fix: afficher les erreurs de validation par champ dans le formulaire de sujet
Le use case createSubjectUseCase retournait un message générique « Données invalides » au lieu de FieldErrors par champ. Alignement sur le pattern des autres use cases (create-public-figure, create-position) avec propagation des erreurs dans l'action et le formulaire.
2026-03-12 00:22:49 +01:00
74d359db72 feat: rendre Wikipedia optionnel avec sources de notoriété alternatives
La création de personnalité accepte désormais soit une URL Wikipedia, soit 2+ sources de notoriété (URLs valides). Le formulaire affiche conditionnellement les champs de sources quand Wikipedia est vide, avec des guides UX sur chaque champ.
2026-03-10 01:15:38 +01:00
5d89a81723 docs: mise à jour documentation (critère notoriété, ports Supabase, commandes) 2026-03-10 01:10:44 +01:00
7f9efc5ee2 feat: refonte page /p avec vue SQL pré-agrégée, recherche et index A-Z
Remplace le findAll() + getStats() par personnalité (843 requêtes) par une vue SQL v_public_figure_activity_summary (2-3 requêtes). La page affiche maintenant 4 sections : recherche, top 10 actives, activité récente, et index alphabétique. Renomme aussi subject_activity_summary en v_subject_activity_summary pour uniformiser la convention de nommage des vues.
2026-03-10 01:10:44 +01:00
fcfe77117a feat: rendre wikipedia_url optionnel et ajouter notoriety_sources
Le critère de notoriété accepte désormais soit une page Wikipedia, soit deux sources indépendantes (notoriety_sources). Cela permet d'ajouter des personnalités publiques notables qui n'ont pas de page Wikipedia.
2026-03-10 01:10:41 +01:00
b0a1b0f3b5 feat: UI d'édition et suppression des sujets
- Page /s/[slug]/modifier avec formulaire pré-rempli et vérification des permissions
- Composant SubjectActions avec boutons Modifier/Supprimer sur la page détail
- Dialog de confirmation de suppression avec gestion d'erreur et Sentry
- Formulaire partagé SubjectForm avec guides intégrés (nommage, présentation, problématique)
- Composant FormPageHeader pour factoriser les en-têtes de formulaire
- Variantes secondary et danger ajoutées au composant Button
- Server actions : retour de résultats au lieu de redirect(), navigation côté client
- Server actions : client admin pour reputationRepo (contournement RLS sécurisé)
2026-03-08 02:40:47 +01:00
3b63a7b98b feat: page profil /me avec dashboard compact
- Identité (nom, email) avec bouton Inviter
- Carte réputation avec score, rang, barre de progression vers le prochain rang
- Lien vers l'historique de réputation
- Le nom dans le header devient un lien vers /me
- Ajout getNextRankThreshold dans permissions
2026-03-08 00:12:30 +01:00
5d4fdcbd14 feat: table reputation_events comme source de vérité pour la réputation
Remplace le pattern addReputation (fetch+update non atomique) par un INSERT dans reputation_events avec trigger PostgreSQL qui maintient le cache contributors.reputation.

- Entité ReputationEvent avec types RewardableAction et RelatedEntityType
- Interface recordEvent + getHistory dans ReputationRepository
- Migration SQL : table, index, trigger, RLS
- Migration des 7 use cases vers recordEvent
- Ajout invitation_bonus dans les récompenses
2026-03-04 23:54:39 +01:00
61dd7ab30e feat: page historique de réputation (/reputation)
Page protégée affichant le score, le rang et la liste chronologique des mouvements de réputation du contributeur connecté. Ajout d'un lien « Réputation » dans le header.
2026-03-04 19:46:08 +01:00