Vue d’ensemble
Gëstu utilise Supabase comme backend principal : base de données PostgreSQL, authentification, stockage de fichiers et API REST automatique.
Tables principales
partners
Représente un partenaire (cabinet d’audit, consultant).
| Colonne | Type | Description |
|---|
id | uuid | Identifiant unique |
name | text | Nom de l’organisation |
slug | text | Identifiant URL unique |
primary_color | text | Couleur principale (hex) |
secondary_color | text | Couleur secondaire (hex) |
logo_url | text | URL du logo |
app_name | text | Nom de l’application (marque blanche) |
profiles
Étend auth.users avec les données métier de l’utilisateur.
| Colonne | Type | Description |
|---|
id | uuid | Même ID que auth.users |
partner_id | uuid | FK vers partners |
full_name | text | Nom complet |
role | text | superadmin, admin, consultant, client |
products
Catalogue des produits disponibles sur la plateforme.
| Colonne | Type | Description |
|---|
id | uuid | Identifiant unique |
slug | text | ex: gestu-control |
name | text | Nom affiché |
color | text | Couleur de la carte Hub |
active | boolean | Visible dans le Hub |
sort_order | int | Ordre d’affichage |
user_product_access
Accès d’un utilisateur à un produit spécifique.
| Colonne | Type | Description |
|---|
user_id | uuid | FK vers profiles |
product_id | uuid | FK vers products |
granted_at | timestamptz | Date d’activation |
missions
Missions d’audit créées par les partenaires.
risks
Risques dans les cartographies Gëstu Risk.
access_requests
Demandes d’accès produit soumises depuis le Hub.
Row Level Security (RLS)
Toutes les tables ont RLS activée. Les politiques garantissent qu’un utilisateur ne peut accéder qu’aux données de son partenaire.
Fonctions utilitaires
-- Retourne le partner_id de l'utilisateur connecté
public.get_my_partner_id() → uuid
-- Retourne le rôle de l'utilisateur connecté
public.get_my_role() → text
-- Retourne tous les produits avec statut d'accès
public.get_my_product_access() → TABLE(product_id, product_slug, product_name, has_access)
Ces fonctions sont définies en SECURITY DEFINER pour éviter les récursions dans les politiques RLS.
Authentification
Gëstu utilise supabase-js avec onAuthStateChange pour gérer le cycle de vie de la session.
Règles critiques
- Ne jamais
await dans le handler SIGNED_IN — bloque signInWithPassword() indéfiniment
loadProfile() est appelé en fire-and-forget dans SIGNED_IN
- Seul
INITIAL_SESSION peut await loadProfile() (chargement initial avec timeout 6s)
- Un seul
onAuthStateChange global dans src/lib/authInit.ts
Variables d’environnement
VITE_SUPABASE_URL=https://xxxxx.supabase.co
VITE_SUPABASE_ANON_KEY=eyJ...
Ne commitez jamais les variables d’environnement dans Git. Utilisez .env.local pour le développement local et les variables d’environnement Vercel pour la production.