# Base de données et CRUD

**Résumé express :** Créer une base de données complète avec opérations CRUD (Create, Read, Update, Delete) pour gérer une liste de livres avec Luna Park.

---

## 1. Architecture du projet

1. Créer deux dossiers distincts :
   - **Backend** : pour la base de données et les routes
   - **Frontend** : pour l'interface utilisateur

*Dans ce tutoriel, nous commençons par le backend.*

## 2. Création de la base de données

### Initialiser la base
1. Créer une nouvelle base de données nommée **db-books**
2. La base contient par défaut :
   - **ID** : identifiant unique
   - **created_at** : date de création automatique

### Ajouter des colonnes personnalisées
1. Ajouter une colonne **title** (type : string)
2. Ajouter une colonne **author** (type : string)
3. Ajouter quelques **rows** (lignes) avec des données de test

> En 15 secondes, votre base de données est prête à l'emploi !

## 3. Routes API - Concept général

Les **routes** sont des URL qui permettent de :
- **Récupérer** des données (GET)
- **Envoyer** de nouvelles données (POST)
- **Modifier** des données existantes (PUT)
- **Supprimer** des données (DELETE)

Nous allons créer 4 routes correspondant aux opérations CRUD.

## 4. Route GET - Récupérer tous les livres

### Créer la route get-books
1. Créer une nouvelle route nommée **get-books**
2. Définir la **méthode** : GET

### Méthode simple : dbfind
1. Créer un node **dbfind**
2. Sélectionner la table **db-books**
3. Le résultat renvoie un tableau de **rows** (lignes)
4. Connecter le résultat à la **réponse**
5. Relier le fil d'exécution entre dbfind et la route
6. Tester avec **Execute** et Ctrl+Espace pour visualiser

### Méthode avancée : dbfrom avec query
1. Créer un node **dbfrom**
2. Sélectionner la table **db-books**
3. Ajouter un **select** pour choisir les champs :
   - `id`
   - `title`
   - `author`
4. Ajouter un **dbexecute**
5. Tester avec Ctrl+Espace
6. Connecter le résultat à la **réponse**

### Typer la réponse (bonne pratique)
1. Définir le type de réponse attendu :
   - **Tableau d'objets**
   - Chaque objet contient : `id`, `title`, `author`
2. Avantage : vérification automatique du type
3. Si un champ manque ou est en trop → erreur **missingProperty**

## 5. Route POST - Créer un nouveau livre

### Créer la route create-books
1. Créer une nouvelle route nommée **create-books**
2. Vérifier que la **méthode** est POST

### Définir le body (données entrantes)
Dans **Route Input**, ajouter un **body** contenant :
- **title** (string) : titre du livre
- **author** (string) : auteur du livre

> Ces données viendront des inputs du frontend

### Insérer dans la base
1. Tirer un fil depuis le body
2. Créer un node **dbinsert**
3. Sélectionner la table **db-books**
4. Connecter le **body** au champ **data**

### Renvoyer l'état mis à jour (optionnel mais recommandé)
1. Ajouter un **dbfind** après l'insertion
2. Sélectionner la table **db-books**
3. Connecter le résultat à la **réponse**
4. Copier le type de réponse depuis **get-books** (clic droit → copier)
5. Coller dans la réponse de **create-books**

## 6. Route DELETE - Supprimer un livre

### Créer la route delete-books
1. Créer une nouvelle route nommée **delete-books**
2. Changer la **méthode** en DELETE
3. Coller le type de réponse (même que get-books)

### Définir l'ID à supprimer
Dans **Route Input**, ajouter un **body** contenant :
- **id** (string) : identifiant du livre à supprimer

### Supprimer par ID
1. Tirer un fil depuis delete-books
2. Créer un node **delete by ID**
3. Sélectionner la table **db-books**
4. Connecter l'ID :
   - Tirer un fil depuis le **body**
   - Créer un **get property**
   - Sélectionner la propriété **id**
   - Connecter au champ ID du delete by ID

### Renvoyer l'état mis à jour
1. Ajouter un **dbfind** après la suppression
2. Sélectionner la table **db-books**
3. Connecter le résultat à la **réponse**

## 7. Route PUT - Modifier un livre existant

### Créer la route update-books
1. Créer une nouvelle route nommée **update-books**
2. Changer la **méthode** en PUT
3. Coller le type de réponse

### Définir le body
Dans **Route Input**, ajouter un **body** contenant :
- **id** (string) : livre à modifier
- **title** (string) : nouveau titre
- **author** (string) : nouvel auteur

### Mettre à jour par ID
1. Tirer un fil depuis update-books
2. Créer un node **DBUpdateByID**
3. Sélectionner la table **db-books**

### Gérer les données d'update
1. Pour l'**ID** :
   - Créer un **spread** depuis le body
   - Sélectionner **id**
   - Connecter au champ ID

2. Pour les **données à modifier** :
   - Créer un **create object**
   - Ajouter les propriétés **title** et **author**
   - Créer un **spread** depuis le body
   - Connecter **title** et **author** à l'objet
   - Connecter l'objet au champ **update**

### Renvoyer l'état mis à jour
1. Ajouter un **dbfind** après la mise à jour
2. Sélectionner la table **db-books**
3. Connecter le résultat à la **réponse**

## Récapitulatif des nodes utilisés

| Node | Usage |
|------|-------|
| **dbfind** | Récupérer toutes les données d'une table |
| **dbfrom + select** | Requête flexible avec sélection de champs |
| **dbexecute** | Exécuter une requête dbfrom |
| **dbinsert** | Insérer une nouvelle entrée |
| **delete by ID** | Supprimer une entrée spécifique |
| **DBUpdateByID** | Modifier une entrée existante |
| **get property** | Extraire une propriété d'un objet |
| **spread** | Déstructurer un objet |
| **create object** | Créer un nouvel objet |

## Méthodes HTTP

- **GET** : récupérer des données
- **POST** : créer de nouvelles données
- **PUT** : modifier des données existantes
- **DELETE** : supprimer des données

## Conseils pratiques

- **Toujours typer les réponses** pour éviter les erreurs de structure
- **Renvoyer l'état actuel** de la base après chaque modification
- Utiliser **Ctrl+Espace** pour visualiser les résultats pendant le développement
- L'**ID** est la clé pour identifier précisément chaque élément
- Le **body** permet de transmettre des données du frontend au backend
- Vérifier systématiquement que la **méthode HTTP** est correcte pour chaque route

---