Skip to main content

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).
ColonneTypeDescription
iduuidIdentifiant unique
nametextNom de l’organisation
slugtextIdentifiant URL unique
primary_colortextCouleur principale (hex)
secondary_colortextCouleur secondaire (hex)
logo_urltextURL du logo
app_nametextNom de l’application (marque blanche)

profiles

Étend auth.users avec les données métier de l’utilisateur.
ColonneTypeDescription
iduuidMême ID que auth.users
partner_iduuidFK vers partners
full_nametextNom complet
roletextsuperadmin, admin, consultant, client

products

Catalogue des produits disponibles sur la plateforme.
ColonneTypeDescription
iduuidIdentifiant unique
slugtextex: gestu-control
nametextNom affiché
colortextCouleur de la carte Hub
activebooleanVisible dans le Hub
sort_orderintOrdre d’affichage

user_product_access

Accès d’un utilisateur à un produit spécifique.
ColonneTypeDescription
user_iduuidFK vers profiles
product_iduuidFK vers products
granted_attimestamptzDate 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.