Backend Fastify pour le musée avec authentification Discord OAuth2.
yarn installyarn dev- Démarre le serveur en mode développement avec rechargement automatiqueyarn start- Démarre le serveur en mode production (utilise Node.js 24 avec support TypeScript natif)yarn test- Lance les tests unitairesyarn test:watch- Lance les tests en mode watch (re-exécution automatique)yarn docs- Génère la documentation OpenAPI/Swagger (JSON, YAML et HTML) à partir des fichiers.featureet des schémas Fastifyyarn migrate- Applique toutes les migrations en attenteyarn migrate:up- Applique les migrations en attenteyarn migrate:down- Annule la dernière migrationyarn migrate:create <nom>- Crée une nouvelle migration
GET /auth/signin- Redirige vers Discord OAuth2 pour l'authentificationGET /auth/login- Alias de/auth/signinGET /auth/callback- Callback OAuth2 de Discord (échange le code contre un token)GET /auth/session- Vérifie l'état de la session (authentifié, refresh token disponible)GET /auth/me- Récupère les informations de l'utilisateur authentifié (gère automatiquement le refresh du token)
POST /pay/checkout- Crée un nouveau checkout SumUp- Body:
{ amount: number, currency?: string, description?: string, checkout_reference?: string } - Retourne:
{ checkout_id, checkout_reference, amount, currency, status }
- Body:
GET /pay/checkout/:checkoutId- Vérifie le statut d'un checkout SumUp- Retourne:
{ id, checkout_reference, amount, currency, status, payment_type?, transaction_code? }
- Retourne:
Le serveur utilise les variables d'environnement suivantes (définies dans .env.local) :
PORT- Port d'écoute (défaut: 3000)HOST- Host d'écoute (défaut: 0.0.0.0)NODE_ENV- Environnement (developmentouproduction)
CORS_ORIGINS- Origines autorisées (séparées par des virgules, défaut:http://localhost:3000,http://localhost:4000)
COOKIE_SECRET- Secret pour signer les cookies (défaut:your-secret-key-change-in-production)COOKIE_DOMAIN- Domaine des cookies (optionnel, utilisé en production)
DISCORD_CLIENT_ID- ID du client Discord (requis)DISCORD_CLIENT_SECRET- Secret du client Discord (requis)DISCORD_REDIRECT_URI- URI de redirection OAuth2 (défaut:http://localhost:{PORT}/auth/callback)DISCORD_SCOPES- Scopes Discord demandés (défaut:identify email)REFRESH_TOKEN_MAX_AGE_DAYS- Durée de vie du refresh token en jours (défaut: 90)
DATABASE_URL- URL de connexion PostgreSQL (format:postgresql://user:password@host:port/database)- Si configuré, les erreurs seront sauvegardées en base de données
- Permet la détection de doublons pour éviter le spam sur Discord
ERROR_DUPLICATE_WINDOW_HOURS- Fenêtre de temps (en heures) pour détecter les erreurs dupliquées (défaut: 1)
DISCORD_LOG_WEBHOOK_URL- URL du webhook Discord pour recevoir les notifications d'erreurs (optionnel)- Si configuré, toutes les erreurs seront envoyées à Discord avec les détails (URL, méthode, IP, stack trace)
- Les erreurs dupliquées (dans la fenêtre configurée) ne seront pas envoyées pour éviter le spam
- Les réponses HTTP aux clients restent génériques (sans détails de l'erreur)
SUMUP_API_KEY- Clé API SumUp (requis pour les paiements)SUMUP_MERCHANT_CODE- Code marchand SumUp (requis pour les paiements)
FRONTEND_URL- URL du frontend pour les redirections (défaut:http://localhost:3000)
src/
├── features/
│ ├── auth/
│ │ ├── auth.ctrl.ts # Contrôleur d'authentification
│ │ ├── auth.ctrl.test.ts # Tests unitaires
│ │ ├── auth.schemas.ts # Schémas de validation Fastify
│ │ └── auth.types.ts # Types TypeScript pour Discord
│ ├── docs/
│ │ └── docs.ctrl.ts # Routes de documentation
│ ├── pay/
│ │ ├── pay.ctrl.ts # Contrôleur de paiement SumUp
│ │ ├── pay.utils.ts # Utilitaires pour l'API SumUp
│ │ ├── pay.schemas.ts # Schémas de validation Fastify
│ │ └── pay.types.ts # Types TypeScript pour SumUp
│ └── terror/
│ ├── error.handler.ts # Gestionnaires d'erreurs Fastify
│ ├── error.service.ts # Services de gestion d'erreurs (DB, Discord)
│ └── error.types.ts # Types pour les erreurs
├── scripts/
│ └── generate-doc.ts # Script de génération de documentation
└── server.ts # Point d'entrée du serveur
migrations/ # Migrations de base de données
└── 001_create_errors_table.ts
Les tests utilisent l'API de test native de Node.js (node:test) avec les assertions natives (node:assert).
# Lancer tous les tests
yarn test
# Lancer les tests en mode watch
yarn test:watch- Validation automatique des entrées avec JSON Schema
- Sérialisation optimisée des réponses
- Cookies HTTP-only et sécurisés en production
- Headers de sécurité (X-Content-Type-Options, X-Frame-Options, etc.)
- CORS configuré avec support des credentials
- Fastify 5.6.1 - Framework web rapide
- TypeScript 5.3.3 - Typage statique
- Node.js 24 - Support TypeScript natif
- PostgreSQL - Base de données relationnelle
- @fastify/postgres - Plugin PostgreSQL pour Fastify
- @fastify/cookie - Gestion des cookies
- @fastify/cors - Gestion CORS
- node-pg-migrate - Système de migrations pour PostgreSQL
- pino-pretty - Formatage des logs
La documentation API est générée automatiquement à partir des scénarios Gherkin/Cucumber (.feature.ts) et des schémas Fastify.
yarn docsCela génère :
docs/openapi.json- Spécification OpenAPI en JSONdocs/openapi.yaml- Spécification OpenAPI en YAMLdocs/index.html- Interface Swagger UI interactive (ouvrir dans un navigateur)
Ouvrez simplement docs/index.html dans votre navigateur pour accéder à l'interface Swagger UI interactive avec :
- Tous les endpoints documentés
- Les scénarios Gherkin intégrés comme descriptions
- La possibilité de tester les endpoints directement
- Les schémas de validation et exemples
Les migrations sont gérées avec node-pg-migrate. Les fichiers de migration se trouvent dans le dossier migrations/.
# Appliquer toutes les migrations en attente
yarn migrate
# Créer une nouvelle migration
yarn migrate:create nom_de_la_migration
# Annuler la dernière migration
yarn migrate:down# Appliquer toutes les migrations en attente sur la production
yarn migrate:prod
# Annuler la dernière migration en production
yarn migrate:prod:down.env.prod contient bien la DATABASE_URL de votre base de données de production avant d'exécuter les migrations.
La table errors stocke toutes les erreurs avec :
- Informations sur l'erreur (nom, message, stack trace)
- Contexte (URL, méthode HTTP, IP)
- Hash unique pour détecter les doublons
- Statut d'envoi à Discord
- Timestamps de création et mise à jour