Find a file
2026-03-29 12:25:08 +02:00
.storybook feat: setup Storybook 10 avec @storybook/nextjs-vite, addon a11y/docs, stories Button/TextField/AdminMenu, moduleResolution bundler pour compatibilité ESM 2026-03-27 15:55:08 +01:00
.vscode chore: add IDE configs 2024-01-10 00:56:19 +01:00
api move all api files to own directory 2024-01-05 01:23:21 +01:00
app feat: display and amend notoriety sources in draft validation page 2026-03-29 12:22:37 +02:00
components refactor: extraction du composant SectionTitle dans le design system, suppression du CSS dupliqué entre DailySubject et SubjectSection 2026-03-28 01:59:51 +01:00
domain feat: slug sur les positions (étape 1) — colonne nullable, script backfill, entité/repo mis à jour, slugify partagé entre les 3 entités 2026-03-29 12:25:08 +02:00
frontend chore: init Nx monorepo 2024-01-10 00:56:02 +01:00
hooks feat: implémenter le système de réputation avec rangs et permissions 2026-02-12 18:12:21 +01:00
infra feat: slug sur les positions (étape 1) — colonne nullable, script backfill, entité/repo mis à jour, slugify partagé entre les 3 entités 2026-03-29 12:25:08 +02:00
public feat: rendre l'application installable en PWA (manifest, icônes, meta tags) 2026-03-12 10:23:48 +01:00
ruby-backend move all ruby backend files to own directory 2024-01-05 01:02:42 +01:00
scripts feat: slug sur les positions (étape 1) — colonne nullable, script backfill, entité/repo mis à jour, slugify partagé entre les 3 entités 2026-03-29 12:25:08 +02:00
styles feat: migration Next.js 15 → 16 (Turbopack, ESLint 9, proxy) 2026-02-21 16:30:21 +01:00
supabase feat: slug sur les positions (étape 1) — colonne nullable, script backfill, entité/repo mis à jour, slugify partagé entre les 3 entités 2026-03-29 12:25:08 +02:00
types feat: slug sur les positions (étape 1) — colonne nullable, script backfill, entité/repo mis à jour, slugify partagé entre les 3 entités 2026-03-29 12:25:08 +02:00
.env.example feat: widget feedback visiteurs avec envoi par email SMTP 2026-03-14 01:58:44 +01:00
.envrc refactor: migrate from Nx monorepo to standalone Next.js 2025-07-07 18:30:07 +02:00
.gitignore feat: setup Storybook 10 avec @storybook/nextjs-vite, addon a11y/docs, stories Button/TextField/AdminMenu, moduleResolution bundler pour compatibilité ESM 2026-03-27 15:55:08 +01:00
.prettierignore feat: pré-remplissage du formulaire de contribution et CRUD sujets 2026-02-28 00:02:38 +01:00
.prettierrc chore: installer et configurer Prettier, formater tout le codebase 2026-02-11 22:10:26 +01:00
CONTRIBUTING.md feat: script de push de la config auth Supabase en production 2026-03-12 23:18:23 +01:00
eslint.config.mjs feat: setup Storybook 10 avec @storybook/nextjs-vite, addon a11y/docs, stories Button/TextField/AdminMenu, moduleResolution bundler pour compatibilité ESM 2026-03-27 15:55:08 +01:00
flake.lock chore: supabase-cli depuis nixpkgs-unstable pour avoir une version plus récente 2026-02-28 00:05:20 +01:00
flake.nix chore: supabase-cli depuis nixpkgs-unstable pour avoir une version plus récente 2026-02-28 00:05:20 +01:00
index.d.ts feat: migration Next.js 15 → 16 (Turbopack, ESLint 9, proxy) 2026-02-21 16:30:21 +01:00
instrumentation-client.ts feat: tunnel Sentry via /api/monitoring pour contourner les bloqueurs de pubs 2026-03-12 11:01:03 +01:00
instrumentation.ts feat: installer Sentry pour le monitoring d'erreurs 2026-02-18 12:01:08 +01:00
next-env.d.ts 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
next.config.js feat: formulaire unifié de contribution avec upload admin, gestion d'erreurs Sentry et validation date-fns 2026-02-24 01:22:56 +01:00
package-lock.json feat: setup Storybook 10 avec @storybook/nextjs-vite, addon a11y/docs, stories Button/TextField/AdminMenu, moduleResolution bundler pour compatibilité ESM 2026-03-27 15:55:08 +01:00
package.json feat: setup Storybook 10 avec @storybook/nextjs-vite, addon a11y/docs, stories Button/TextField/AdminMenu, moduleResolution bundler pour compatibilité ESM 2026-03-27 15:55:08 +01:00
proxy.ts feat: migration Next.js 15 → 16 (Turbopack, ESLint 9, proxy) 2026-02-21 16:30:21 +01:00
README.md feat: script de push de la config auth Supabase en production 2026-03-12 23:18:23 +01:00
sentry.edge.config.ts feat: installer Sentry pour le monitoring d'erreurs 2026-02-18 12:01:08 +01:00
sentry.server.config.ts feat: installer Sentry pour le monitoring d'erreurs 2026-02-18 12:01:08 +01:00
tsconfig.json feat: setup Storybook 10 avec @storybook/nextjs-vite, addon a11y/docs, stories Button/TextField/AdminMenu, moduleResolution bundler pour compatibilité ESM 2026-03-27 15:55:08 +01:00
tsconfig.spec.json refactor: migrate from Nx monorepo to standalone Next.js 2025-07-07 18:30:07 +02:00
vitest.config.ts feat: système d'invitation par les contributeurs Éloquent (1000+ pts) 2026-02-27 23:56:20 +01:00

Débats.co

Objectif du projet

Offrir une synthèse ouverte, impartiale et vérifiable des sujets clivants de notre société.

Débats est un projet francophone et participatif qui vise à créer une plateforme collaborative de type wiki pour cartographier les positions et l'évolution de l'engagement des personnalités publiques sur des sujets de société controversés.

Vision

  • Démocratie transparente : Permettre aux citoyens de suivre les positions de leurs représentants
  • Rigueur intellectuelle : Collecter et organiser les prises de position avec des sources vérifiables
  • Lutte contre la simplification : Promouvoir un débat public nuancé
  • Crédibilité de l'engagement public : Documenter l'évolution des positions dans le temps

Historique du projet

Le projet a été initié en 2014 et a connu plusieurs itérations technologiques :

1. Ruby Backend (2014-2018)

  • Stack : Ruby on Rails fullstack
  • État : Version la plus aboutie avec modèle de données complet
  • Localisation : ruby-backend/
  • Fonctionnalités : CRUD complet, authentification, upload d'images

2. Frontend React (2018-2019)

  • Stack : React + Redux + GraphQL
  • État : Interface utilisateur moderne mais incomplète
  • Localisation : frontend/
  • Objectif : Moderniser l'interface utilisateur

3. API GraphQL (2019-2020)

  • Stack : Node.js + GraphQL + Prisma
  • État : API moderne mais non finalisée
  • Localisation : api/
  • Objectif : Remplacer le backend Ruby par une API moderne

4. Elixir Phoenix (2020-2021)

  • Stack : Elixir + Phoenix + PostgreSQL
  • État : Refonte complète mais abandonnée
  • Localisation : debats-elixir/
  • Objectif : Performance et fiabilité

5. Next.js Standalone (actuel)

  • Stack : Next.js 16 + TypeScript + Supabase + Effect TS
  • État : En cours de développement
  • Localisation : racine du projet
  • Objectif : Consolidation et première version exploitable

Modèle de données

Le cœur du modèle est cohérent entre toutes les versions :

Subject (Sujet)
├── Positions (ex: "Pour", "Contre", "Nuancé")
    └── Statements (Prises de position)
        ├── PublicFigure (Personnalité)
        ├── Evidence (Preuves/Sources)
        └── Arguments

Contributors (Contributeurs)

Entités principales

  • Subject : Les sujets de débat (ex: "Immigration", "Écologie", "Retraites")
  • Position : Les différentes positions possibles sur un sujet
  • PublicFigure : Les personnalités publiques (politiques, intellectuels, dirigeants d'institutions, porte-paroles d'organisations, etc.) - Critère de notoriété : la personnalité doit avoir fait l'objet d'au moins deux publications dans des sources indépendantes et fiables (inspiré des critères d'admissibilité Wikipedia). La page Wikipedia n'est pas obligatoire.
  • Statement : Les prises de position concrètes d'une personnalité sur une position
  • Evidence : Les preuves et sources (citations, articles, vidéos, discours)
  • Argument : Les arguments développés pour défendre une position
  • Contributor : Les utilisateurs contributeurs de la plateforme

Architecture technique actuelle

Stack

  • Frontend/Backend : Next.js 16 (App Router)
  • Base de données : PostgreSQL via Supabase
  • Authentification : Supabase Auth
  • Domain : Effect TS + Effect Schema
  • Styling : CSS Modules
  • Tests : Vitest
  • Monitoring : Sentry + Plausible

Structure

├── app/              # Next.js App Router (pages et Server Actions)
├── domain/           # Logique métier (entités, services, règles, use cases)
├── infra/            # Infrastructure (Supabase, Wikipedia API)
├── components/       # Composants React réutilisables
├── hooks/            # React hooks
├── styles/           # CSS Modules et design system
├── supabase/         # Migrations et seeds
├── types/            # Types générés (database.types.ts)
├── docs/             # Documentation et maquettes de référence
└── public/           # Assets statiques (polices, images)

Projets legacy (référence)

  • ruby-backend/ : Application Rails originale
  • debats-elixir/ : Version Phoenix abandonnée

Développement

Prérequis

Installation

npm install
supabase start
supabase migration up  # Applique les migrations

Attention : supabase db reset détruit toutes les données locales. Préférer supabase migration up pour appliquer les migrations de manière incrémentale.

Variables d'environnement

Copier .env.example vers .env.local et renseigner les valeurs :

cp .env.example .env.local

Les variables essentielles pour le développement local :

NEXT_PUBLIC_SUPABASE_URL=http://127.0.0.1:64321
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY=<clé affichée par supabase start>
SUPABASE_SECRET_KEY=<clé affichée par supabase start>
SIGNUP_SECRET_TOKEN=<token pour l'inscription par invitation>

Voir .env.example pour la liste complète des variables.

Lancement

npm run dev

Commandes utiles

npm run dev           # Serveur de développement
npm test              # Tests (Vitest)
npm run lint          # Linting (ESLint)
npm run format        # Formatage (Prettier)
npm run typecheck     # Vérification des types
npm run check         # Lint + format + typecheck + build (à lancer avant chaque commit)

Configuration de production

La configuration auth de production (URLs, templates email, rate limits…) est gérée par un script dédié, pas par supabase config push (qui écraserait la prod avec les valeurs locales).

npm run supabase:config:push            # Affiche le diff et demande confirmation
npm run supabase:config:push -- --yes   # Push sans confirmation

Le script lit les credentials depuis .env.production et les templates email depuis supabase/templates/. La config est déclarée en dur dans scripts/push-prod-auth-config.ts pour être auditable dans le diff git.

Supabase local

supabase start        # Démarrer l'environnement local
supabase stop         # Arrêter l'environnement
supabase migration up # Appliquer les migrations

# Générer les types TypeScript après chaque migration
supabase gen types typescript --local > types/database.types.ts

Les URLs locales sont configurées sur le port 64321 (voir supabase/config.toml) :

Feuille de route

Phase 1 : MVP

  • Consolidation du modèle de données
  • Interface de consultation des sujets et positions
  • Authentification Supabase (inscription par invitation)
  • CRUD sujets, personnalités, positions, prises de position
  • Système de réputation des contributeurs

Phase 2 : Fonctionnalités collaboratives

  • Système de modération
  • Historique des modifications
  • Interface d'administration

Phase 3 : Fonctionnalités avancées

  • Recherche et filtres avancés
  • API publique
  • Export de données
  • Analyses et statistiques

Contributions

Le projet est open source et accueille les contributions. Voir CONTRIBUTING.md pour plus d'informations.

Licence

MIT