No description
Find a file
Hermann_Kitio 5f7e52d88a
Some checks failed
CI / quality (push) Has been cancelled
docs(t2live): MAJ prompt §3, TD-22, CHANGELOG Sprint 6d
- Prompt_t2live.md §3 réécrit (13 règles) + encadré spécificité T2 (règle 7
  non propageable au prompt T1).
- TECH_DEBT-backend.md: TD-22 (contournement prompt engineering Flash Live).
- CHANGELOG-backend.md: bloc Sprint 6d.
2026-06-28 11:49:45 +03:00
.claude fix: T2 live — camelCase setup frame + logs enrichis — 124/124 tests 2026-04-17 04:44:54 +03:00
.github ci(semgrep): scan SAST --severity=ERROR (FTD-28) 2026-04-23 02:46:41 +03:00
docs docs(t2live): MAJ prompt §3, TD-22, CHANGELOG Sprint 6d 2026-06-28 11:49:45 +03:00
src fix(geminiLive): T2 prompt durci + VAD réintégré, retrait SDK @google/genai 2026-06-28 11:49:37 +03:00
supabase/migrations feat(billing): TD-13 webhook idempotency + Stripe Customer Portal + doc cleanup 2026-04-26 04:15:46 +03:00
.env.example fix(deepgram): revert to /v1/auth/grant for temporary JWT tokens 2026-04-25 05:49:45 +03:00
.gitignore fix: T2 live — camelCase setup frame + logs enrichis — 124/124 tests 2026-04-17 04:44:54 +03:00
LICENSE Initial commit 2026-04-16 04:19:06 +02:00
package-lock.json fix(geminiLive): T2 prompt durci + VAD réintégré, retrait SDK @google/genai 2026-06-28 11:49:37 +03:00
package.json fix(geminiLive): T2 prompt durci + VAD réintégré, retrait SDK @google/genai 2026-06-28 11:49:37 +03:00
README.md docs: ajout documentation de référence 2026-04-16 05:50:55 +03:00
tsconfig.json fix: imports ESM avec extensions .js — NodeNext compatible Render — 117/117 tests 2026-04-17 01:04:16 +03:00
vitest.config.ts feat: initialisation projet Hono.js + TypeScript + Vitest 2026-04-16 06:37:25 +03:00

expria-backend

API backend d'Expria — Coach IA de préparation au TCF Canada. Gère la logique métier, les permissions par plan, les corrections IA, les paiements Stripe, et le proxy WebSocket Gemini Live (T2 EO).

Stack technique

  • Hono.js — framework backend Node.js, TypeScript natif
  • Node.js 20+
  • Supabase — PostgreSQL + Auth (service role)
  • DeepSeek — corrections Expression Écrite et Orale
  • Gemini — transcription audio + proxy WebSocket T2 live
  • Stripe — paiements et gestion des abonnements
  • Vitest — tests automatisés

Documents de référence

Lire ces fichiers avant toute modification :

Fichier Contenu
docs/DEVELOPMENT_PRINCIPLES.md Cycle de travail, règles, conventions — obligatoire
docs/ARCHITECTURE.md Stack, structure, flux de données
docs/PLANS_TARIFAIRES.md Plans Free / Standard / Premium et permissions
docs/PARCOURS_UTILISATEURS.md Parcours exact de chaque type d'utilisateur
docs/GOLDEN_DATASET.md Tests manuels anti-régression
docs/TEST_ENVIRONMENT.md Comptes de test Supabase + scripts SQL
docs/TESTS_AUTOMATISES.md Tests Vitest — fonctions critiques

Structure des dossiers

src/
├── routes/           # Définition des routes API (une par domaine)
│   ├── auth.ts
│   ├── simulations.ts
│   ├── corrections.ts
│   ├── plans.ts
│   ├── stripe.ts
│   └── t2live.ts     # WebSocket proxy Gemini Live
├── controllers/      # Logique métier (une par domaine)
├── middleware/
│   ├── auth.ts       # Vérification JWT Supabase
│   ├── plan.ts       # Vérification permissions par plan
│   └── rateLimit.ts
├── lib/
│   ├── access.ts     # Source de vérité des permissions par plan ⚠️
│   ├── supabase.ts   # Client Supabase admin (service role)
│   ├── deepseek.ts   # Client DeepSeek
│   ├── gemini.ts     # Client Gemini
│   └── stripe.ts     # Client Stripe
├── types/            # Types TypeScript partagés
└── index.ts          # Point d'entrée Hono

⚠️ src/lib/access.ts est la source de vérité unique des permissions par plan. Ce fichier doit rester identique à src/lib/access.ts dans expria-frontend. Toute modification des plans tarifaires met ce fichier à jour en premier.

Variables d'environnement

Créer un fichier .env à la racine (ne jamais committer) :

# Supabase
SUPABASE_URL=https://xxx.supabase.co
SUPABASE_SERVICE_ROLE_KEY=xxx        # Clé privée — ne jamais exposer

# APIs
DEEPSEEK_API_KEY=xxx
GEMINI_API_KEY=xxx                   # Ne jamais exposer côté frontend

# Stripe
STRIPE_SECRET_KEY=xxx
STRIPE_WEBHOOK_SECRET=xxx
STRIPE_PRICE_STANDARD=price_xxx      # price_id plan Standard
STRIPE_PRICE_PREMIUM=price_xxx       # price_id plan Premium

# Config
PORT=3000
APP_URL=https://expria.app
API_URL=https://api.expria.app
NODE_ENV=development

Aucune de ces variables ne doit apparaître dans le dépôt expria-frontend.

Commandes

# Installer les dépendances
npm install

# Démarrer en développement (avec rechargement automatique)
npm run dev

# Builder pour la production
npm run build

# Démarrer en production
npm start

# Lancer les tests automatisés
npm run test

# Lancer les tests en mode watch
npm run test:watch

# Générer un rapport de couverture
npm run test:coverage

Tests automatisés

41 tests Vitest couvrant les 6 fonctions critiques :

npm run test
# Résultat attendu : 41/41 passés, 0 échec

⚠️ Les tests doivent être verts avant ET après chaque session de développement. Un test rouge = régression détectée = ne pas continuer.

Voir docs/TESTS_AUTOMATISES.md pour le détail des tests.

Environnement de test

4 comptes Supabase préconfigurés pour tester tous les parcours utilisateur sans passer par Stripe.

Voir docs/TEST_ENVIRONMENT.md pour les scripts SQL de création et réinitialisation.

Déploiement

Plateforme : Render (Frankfurt EU) Déploiement : manuel via dashboard ou CLI

# Via Render CLI
render deploy

# Via dashboard Render
# → Manual Deploy → Deploy latest commit

Domaine : api.expria.app

Routes API

POST   /auth/verify-token
POST   /simulations
GET    /simulations/:id
GET    /simulations
POST   /corrections/ee
POST   /corrections/eo
GET    /plans/status
POST   /plans/upgrade
POST   /plans/upgrade-prorata
POST   /stripe/checkout
POST   /stripe/webhook
WS     /t2/live

Dépôt lié

Frontend : https://codeberg.org/Hermann_Kitio/expria-frontend