> ## Documentation Index
> Fetch the complete documentation index at: https://docs.gestugroup.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Architecture Supabase

> Structure de la base de données, RLS et fonctions clés de la plateforme Gëstu.

## 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

```sql theme={null}
-- 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

```env theme={null}
VITE_SUPABASE_URL=https://xxxxx.supabase.co
VITE_SUPABASE_ANON_KEY=eyJ...
```

<Warning>
  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.
</Warning>
