Architecture Overview
Vue d'ensemble
Le projet suit actuellement une architecture en trois couches:
frontpour l'interface et la session utilisateurbackpour 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:
- front/composables/useAuth.ts
- front/composables/useEntreprises.ts
- front/composables/useEntrepriseContext.ts
- front/playwright.config.ts
- front/playwright.staging.config.ts
- front/e2e/api-keys.spec.ts
- front/e2e/auth-guards.spec.ts
- front/e2e-live/staging-api-keys.spec.ts
- front/e2e-live/staging-auth.spec.ts
| Type de test | Outil | Emplacement | Usage |
|---|---|---|---|
| Backend unitaire/integration | Jest | back/src/**/*.spec.ts | Logique metier et guards |
| Backend e2e HTTP | Jest + Supertest | back/test | Routes NestJS |
| Frontend e2e UI | Playwright | front/e2e | Parcours utilisateurs et permissions |
| Frontend e2e live | Playwright | front/e2e-live | Validation reelle sur staging |
| Suite Playwright | Cible | Mocks | Quand l'executer |
|---|---|---|---|
front/e2e | Front local | Oui | PR, push, debug dev |
front/e2e-live | Staging reel | Non | Avant release, validation staging, workflow manuel |
| Restitution des resultats | Emplacement | Usage |
|---|---|---|
| Rapport HTML local | playwright-report ou playwright-report-live | Analyse locale apres execution |
| Artifact GitHub Actions | Workflow run | Partage equipe et investigation CI |
| Videos / screenshots / traces | test-results | Diagnostic 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/.envvia@nestjs/config - verifie le bearer token Supabase
- ou verifie une API key
x-api-keypour certains endpoints - charge le
profileet lerolede l'utilisateur - expose des routes metier protegees
- utilise Supabase cote serveur avec une cle
publishableousecret
Fichiers importants:
- back/src/supabase/supabase.service.ts
- back/src/auth/guards/supabase-auth.guard.ts
- back/src/auth/guards/roles.guard.ts
- back/src/api-keys/api-keys.service.ts
- back/src/api-keys/guards/composite-auth.guard.ts
- back/src/api-keys/guards/scopes.guard.ts
- back/src/api-keys/interceptors/api-key-usage-logging.interceptor.ts
- back/src/enterprises/enterprises.controller.ts
- back/src/enterprises/enterprises.service.ts
Authentification et autorisation
Le backend distingue trois notions:
- identite applicative: cle Supabase
publishableousecret - identite utilisateur: token Supabase de session
- identite machine: API key geree par l'application
- autorisation metier:
profiles.role.slugetprofiles.enterprise_id - autorisation technique:
scopesportes 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
| Notion | Portee | Exemple |
|---|---|---|
| Identite applicative | Infrastructure | SUPABASE_SECRET_KEY |
| Identite utilisateur | Session console | Bearer Supabase |
| Identite machine | Integration technique | x-api-key |
| Autorisation metier | Role + entreprise | super-admin, administrateur |
| Autorisation technique | Scopes | enterprises:read |
Systeme d'API keys
Architecture retenue:
CompositeAuthGuardaccepte soit un bearer Supabase, soit un headerx-api-keyRolesGuardcontinue de raisonner sur unroleSlugderiveScopesGuards'applique uniquement aux principals de typeapi_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_hashstocke sous formeHMAC-SHA256- secret serveur dans
API_KEY_SECRET key_prefixstocke pour affichage partiel- un log detaille par appel API key avec
used_at,method,path,status_code,ip
| Composant | Role |
|---|---|
CompositeAuthGuard | Choisit bearer Supabase ou x-api-key |
RolesGuard | Applique les roles derives |
ScopesGuard | Applique les scopes aux principals api_key |
ApiKeyUsageLoggingInterceptor | Journalise les appels authentifies par cle |
Consequence d'exploitation:
- si
API_KEY_SECRETchange, 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-admin | Donnees visibles |
|---|---|
| Liste des cles | libelle, prefixe, portee, scopes, expiration, dernier usage, statut |
| Detail des logs | date, 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_logsStrategie 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 parGET /enterprisessurbackGET /enterprisesexclut explicitement les entreprises de typepersonalfetchById()et les mutations restent cotefrontvers 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
SupabaseServicemocke
Fichiers: