Skip to content

Architecture Overview

Vue d'ensemble

Le projet suit actuellement une architecture en trois couches:

  • front pour l'interface et la session utilisateur
  • back pour l'API, la validation d'acces et les regles metier
  • Supabase pour l'auth, le stockage des donnees et les politiques RLS

Frontend

Le frontend Nuxt:

  • ouvre une session utilisateur via Supabase Auth
  • recupere le profil utilisateur dans profiles
  • conserve le contexte d'entreprise courant
  • appelle soit Supabase directement, soit le backend selon le niveau de migration du flux

Tests E2E frontend:

  • Playwright est utilise pour les parcours utilisateurs critiques
  • la premiere suite mocke Supabase et le backend pour stabiliser les scenarios
  • la CI execute cette suite mockee sur PR et sur push
  • une suite live dediee au staging complete la validation reelle
  • les rapports sont recuperes via artifacts GitHub Actions, pas via GitHub Pages par defaut

Fichiers importants:

Type de testOutilEmplacementUsage
Backend unitaire/integrationJestback/src/**/*.spec.tsLogique metier et guards
Backend e2e HTTPJest + Supertestback/testRoutes NestJS
Frontend e2e UIPlaywrightfront/e2eParcours utilisateurs et permissions
Frontend e2e livePlaywrightfront/e2e-liveValidation reelle sur staging
Suite PlaywrightCibleMocksQuand l'executer
front/e2eFront localOuiPR, push, debug dev
front/e2e-liveStaging reelNonAvant release, validation staging, workflow manuel
Restitution des resultatsEmplacementUsage
Rapport HTML localplaywright-report ou playwright-report-liveAnalyse locale apres execution
Artifact GitHub ActionsWorkflow runPartage equipe et investigation CI
Videos / screenshots / tracestest-resultsDiagnostic des echecs

Choix de publication:

  • les rapports ne sont pas pushes sur GitHub Pages par defaut
  • la raison principale est la prudence sur un projet prive avec donnees, captures et URLs de staging potentiellement sensibles

Backend

Le backend Nest:

  • charge back/.env via @nestjs/config
  • verifie le bearer token Supabase
  • ou verifie une API key x-api-key pour certains endpoints
  • charge le profile et le role de l'utilisateur
  • expose des routes metier protegees
  • utilise Supabase cote serveur avec une cle publishable ou secret

Fichiers importants:

Authentification et autorisation

Le backend distingue trois notions:

  • identite applicative: cle Supabase publishable ou secret
  • identite utilisateur: token Supabase de session
  • identite machine: API key geree par l'application
  • autorisation metier: profiles.role.slug et profiles.enterprise_id
  • autorisation technique: scopes portes par l'API key

Regle importante:

  • la cle serveur ne remplace jamais le token utilisateur
  • le token utilisateur ne remplace jamais la cle applicative
  • une API key ne remplace pas un utilisateur console
  • une API key ne porte jamais la cle brute en base, seulement un hash HMAC
NotionPorteeExemple
Identite applicativeInfrastructureSUPABASE_SECRET_KEY
Identite utilisateurSession consoleBearer Supabase
Identite machineIntegration techniquex-api-key
Autorisation metierRole + entreprisesuper-admin, administrateur
Autorisation techniqueScopesenterprises:read

Systeme d'API keys

Architecture retenue:

  • CompositeAuthGuard accepte soit un bearer Supabase, soit un header x-api-key
  • RolesGuard continue de raisonner sur un roleSlug derive
  • ScopesGuard s'applique uniquement aux principals de type api_key
  • les utilisateurs console gardent un acces complet a leurs routes protegees par role

Stockage:

  • table public.api_keys
  • table public.api_key_usage_logs
  • key_hash stocke sous forme HMAC-SHA256
  • secret serveur dans API_KEY_SECRET
  • key_prefix stocke pour affichage partiel
  • un log detaille par appel API key avec used_at, method, path, status_code, ip
ComposantRole
CompositeAuthGuardChoisit bearer Supabase ou x-api-key
RolesGuardApplique les roles derives
ScopesGuardApplique les scopes aux principals api_key
ApiKeyUsageLoggingInterceptorJournalise les appels authentifies par cle

Consequence d'exploitation:

  • si API_KEY_SECRET change, toutes les API keys existantes deviennent invalides
  • une fuite de base seule ne suffit pas a verifier des cles candidates sans le secret applicatif

Visibilite admin:

  • la page super-admin des cles API affiche les metadonnees de la cle
  • un panneau "Voir logs" charge les 100 derniers appels pour une cle donnee
  • la consultation passe par GET /api-keys/:id/usage-logs
Ecran super-adminDonnees visibles
Liste des cleslibelle, prefixe, portee, scopes, expiration, dernier usage, statut
Detail des logsdate, methode, route, code HTTP, IP

Flux technique:

text
Requete entrante
  -> CompositeAuthGuard
    -> bearer Supabase ? SupabaseAuthGuard
    -> sinon x-api-key ? ApiKeyAuthGuard
  -> RolesGuard
  -> ScopesGuard
  -> Controller/Service
  -> ApiKeyUsageLoggingInterceptor
  -> insertion dans api_key_usage_logs

Strategie de migration

Strategie actuelle:

  • migrer d'abord les lectures metier a fort impact
  • conserver le frontend fonctionnel pendant la transition
  • centraliser progressivement les acces sensibles dans back

Etat du domaine enterprises:

  • fetchAll() passe par GET /enterprises sur back
  • GET /enterprises exclut explicitement les entreprises de type personal
  • fetchById() et les mutations restent cote front vers Supabase

Tests

Deux niveaux de tests existent sur le backend pour enterprises:

  • tests unitaires sur la logique metier du service
  • tests d'integration backend avec guards reels et SupabaseService mocke

Fichiers: