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

# Permissions Hasura

> Contrôle d'accès via les permissions Hasura (rôles public et admin)

## Vue d'ensemble

Kit'Asso utilise les **permissions Hasura** pour contrôler l'accès aux données. Hasura gère les autorisations au niveau GraphQL, ce qui remplace le mécanisme Row Level Security (RLS) natif de PostgreSQL.

**Philosophie de sécurité :**

> "Le public peut lire le contenu actif, les utilisateurs authentifiés (admin) peuvent tout gérer."

**Rôles :**

* **public** — Visiteurs non authentifiés (lecture seule du contenu actif)
* **user** / **admin** — Utilisateurs authentifiés via Nhost Auth (CRUD complet)

***

## Permissions par domaine

### 1. Contenu toujours visible (tools, categories, filters, tool\_features, site\_assets)

| Rôle   | SELECT | INSERT | UPDATE | DELETE |
| ------ | ------ | ------ | ------ | ------ |
| public | ✅ Tous | ❌      | ❌      | ❌      |
| admin  | ✅ Tous | ✅      | ✅      | ✅      |

**Résultat :** Les visiteurs voient tous les outils et catégories. Seuls les admins peuvent créer, modifier ou supprimer.

***

### 2. Contenu avec statut (workflows, tool\_packs, quizzes)

| Rôle   | SELECT                                                   | INSERT | UPDATE | DELETE |
| ------ | -------------------------------------------------------- | ------ | ------ | ------ |
| public | ✅ Uniquement `status = 'active'` (ou `is_active = true`) | ❌      | ❌      | ❌      |
| admin  | ✅ Tous (y compris drafts)                                | ✅      | ✅      | ✅      |

**Résultat :** Les visiteurs ne voient que le contenu publié. Les admins voient et gèrent les drafts.

***

### 3. Contenu enfant (workflow\_steps, quiz\_questions, quiz\_answers, quiz\_recommendations)

| Rôle   | SELECT                              | INSERT | UPDATE | DELETE |
| ------ | ----------------------------------- | ------ | ------ | ------ |
| public | ✅ Uniquement si le parent est actif | ❌      | ❌      | ❌      |
| admin  | ✅ Tous                              | ✅      | ✅      | ✅      |

**Logique :** La visibilité d'un step suit celle de son workflow parent. Si un workflow est en draft, ses steps ne sont pas visibles publiquement.

***

### 4. Quiz Responses (cas spécial)

| Rôle   | SELECT        | INSERT                 | UPDATE | DELETE |
| ------ | ------------- | ---------------------- | ------ | ------ |
| public | ❌             | ✅ (soumission de quiz) | ❌      | ❌      |
| admin  | ✅ (analytics) | ✅                      | ✅      | ✅      |

**Résultat :** Le public peut soumettre des réponses de quiz mais ne peut pas les lire. Les admins accèdent aux données pour l'analytics.

***

### 5. Pack Tools (table de jonction)

| Rôle   | SELECT | INSERT | UPDATE | DELETE |
| ------ | ------ | ------ | ------ | ------ |
| public | ✅ Tous | ❌      | ❌      | ❌      |
| admin  | ✅ Tous | ✅      | ✅      | ✅      |

***

## Configuration dans Hasura

### Comment configurer les permissions

1. Ouvrez la **console Hasura** de votre projet Nhost
2. Sélectionnez une table (ex: `tools`)
3. Allez dans l'onglet **Permissions**
4. Définissez les règles pour chaque rôle :

**Exemple : table `tools`, rôle `public` :**

* **SELECT** : ✅ Autorisé, sans filtre (toutes les lignes)
* **INSERT/UPDATE/DELETE** : ❌ Non autorisé

**Exemple : table `workflows`, rôle `public` :**

* **SELECT** : ✅ Autorisé, avec filtre : `{ "status": { "_eq": "active" } }`
* **INSERT/UPDATE/DELETE** : ❌ Non autorisé

**Exemple : table `workflows`, rôle `admin` :**

* **SELECT** : ✅ Autorisé, sans filtre
* **INSERT/UPDATE/DELETE** : ✅ Autorisé

***

## Patterns de permissions

### Pattern 1 : Public read, Admin CRUD

**Tables :** tools, categories, filters, tool\_features, site\_assets

Tous les visiteurs peuvent lire. Seuls les admins peuvent modifier.

### Pattern 2 : Public read active only, Admin read all

**Tables :** workflows, tool\_packs, quizzes

Le public ne voit que le contenu avec `status = 'active'`. Les admins voient tout.

### Pattern 3 : Public read via parent

**Tables :** workflow\_steps, quiz\_questions, quiz\_answers, quiz\_recommendations

La visibilité dépend du statut du parent (workflow ou quiz).

### Pattern 4 : Public insert only

**Tables :** quiz\_responses

Le public peut soumettre des données (réponses quiz) mais ne peut pas les consulter.

***

## Tester les permissions

### Test 1 : Visiteur non authentifié

```typescript theme={null}
// Sans token JWT — rôle "public"
const result = await nhost.graphql.request({
  query: '{ tools { id name } }'
});
// ✅ Retourne tous les outils

const result2 = await nhost.graphql.request({
  query: '{ workflows { id title status } }'
});
// ✅ Retourne uniquement workflows avec status = 'active'
```

### Test 2 : Admin authentifié

```typescript theme={null}
// Après nhost.auth.signIn()
const result = await nhost.graphql.request({
  query: '{ workflows(where: { status: { _eq: "draft" }}) { id title } }'
});
// ✅ Retourne les drafts

const result2 = await nhost.graphql.request({
  query: `mutation {
    insert_tools_one(object: { name: "Test", description: "Test tool", pricing_tier: "Gratuit" }) {
      id
    }
  }`
});
// ✅ Création autorisée
```

### Test 3 : Insertion publique bloquée

```typescript theme={null}
// Sans authentification
const result = await nhost.graphql.request({
  query: `mutation {
    insert_tools_one(object: { name: "Hack", description: "Test" }) { id }
  }`
});
// ❌ Erreur : permission denied
```

***

## Bonnes pratiques

### ✅ À faire

* Toujours tester les permissions avec un utilisateur non authentifié avant déploiement
* Utiliser des filtres Hasura pour le contenu avec statut
* Documenter les permissions dans la console Hasura

### ❌ À éviter

* Ne jamais exposer des données sensibles au rôle public
* Ne pas créer de permissions trop permissives (ex: public avec CRUD)
* Ne pas oublier les tables enfants quand on restreint un parent

***

## Ressources

<CardGroup cols={2}>
  <Card title="Database Schema" icon="database" href="/database/schema">
    Structure complète des 13 tables
  </Card>

  <Card title="Nhost & GraphQL" icon="plug" href="/architecture/nhost-graphql">
    Architecture backend
  </Card>

  <Card title="API Layer" icon="code" href="/development/api-layer">
    Abstractions qui respectent les permissions automatiquement
  </Card>

  <Card title="Nhost Docs" icon="book" href="https://docs.nhost.io">
    Documentation officielle
  </Card>
</CardGroup>
