> For the complete documentation index, see [llms.txt](https://docs.devonyx.fr/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.devonyx.fr/getting-started/api-rest.md).

# API REST

### URL de base

* **Développement :** `https://localhost:3000/api`
* **Production :** `https://<ton-domaine>/api`

Toutes les routes sont préfixées par `/api` .

### Authentification

L'authentification utilise des **JSON Web Token (JWT).**

1. L'utilisateur s'inscrit ou se connecte via `/auth/register` ou `/auth/login`
2. Le serveur retourne un objet `{ token, user }`&#x20;
3. Pour toutes les routes protégées, ajouter le header :&#x20;

```http
Authorization : Bearer
```

> **État actuel :** seules les routes `/auth/me` est explicitement protégée par le middleare verifyToken.  Les routes métier (`/parcelles`, `/cultures`, etc.) ne vérifient pas le token  côté serveur dans le code livré au moment de la rédaction. C'est un point d'amélioration identifié.

### Endpoints

#### Authentification

```http
POST /auth/register
```

Crée un compte utilisateur

**Body :**&#x20;

```json
{
  "nom": "Dupont",
  "prenom": "Jean",
  "email": "jean.dupont@example.com",
  "mot_de_passe": "motdepasse_securise",
  "role": "agriculteur"
}

```

**Réponse 201 :**&#x20;

```json
{
  "token": "eyJhbGciOiJIUzI1NiIs...",
  "user": {
    "id": 1,
    "nom": "Dupont",
    "prenom": "Jean",
    "email": "jean.dupont@example.com",
    "role": "agriculteur"
  }
}
```

**Erreurs :**&#x20;

* `400` : champs manquants
* `409` : email déjà utilisé

***

```http
POST /auth/login
```

Connecte un utilisateur existant.

**Body :**&#x20;

```json
{
  "email": "jean.dupont@example.com",
  "mot_de_passe": "motdepasse_securise"
}
```

**Réponse 200 :** identique à `/register`

**Erreurs :**&#x20;

* `400` : champs manquants
* `401` : email ou mot de passe incorrect

***

```http
GET /auth/me
```

Retourne l'utilisateur connecté à partir du token.

**Headers :** `Authorization : Bearer <token>`

**Réponse 200 :**&#x20;

```json
{
  "user": { "id": 1, "nom": "Dupont", "prenom": "Jean", "email": "...", "role": "agriculteur" }
}
```

***

#### Parcelles

```http
GET /parcelles
```

Lister toutes les parcelles avec leurs cultures associées.

**Réponse 200 :**

```json
[
  {
    "id_parcelle": 1,
    "nom": "Champ du nord",
    "surface": 5.2,
    "latitude": 48.85,
    "longitude": 2.34,
    "description": "Parcelle principale",
    "date_creation": "2026-03-15",
    "id_utilisateur": 1,
    "cultures": [ { "id_culture": 1, "nom": "Blé", "..." } ]
  }
]
```

***

```http
GET /parcelles/:id
```

Détail d'une parcelle (avec cultures).

***

```http
POST /parcelles
```

Crée une parcelle. La date de création est positionnée automatiquement.

**Body :**&#x20;

```json
{
  "nom": "Champ du sud",
  "surface": 3.4,
  "latitude": 48.85,
  "longitude": 2.35,
  "description": "Optionnel",
  "id_utilisateur": 1
}
```

***

```http
PUT /parcelles/:id
```

Met à jour une parcelle (sauf `id_utilisateur` et `date_creation` ).

***

```http
DELETE /parcelles/:id
```

Supprimer une parcelle. **Attention :** sans contraintes `ON DELETE CASCADE` dans le schéma actuel, la suppression peut échouer si  des cultures sont attachées.

***

#### Cultures

```http
GET /cultures
```

Liste toutes les cultures avec parcelle et type de joints.

***

```http
GET /cultures/:id
```

Détail d'une culture.

***

```http
POST /cultures
```

**Body :**&#x20;

```json
{
  "nom": "Blé tendre",
  "variete": "Apache",
  "date_semis": "2026-10-15",
  "date_recolte_prevue": "2027-07-20",
  "statut": "en cours",
  "id_parcelle": 1,
  "id_type_culture": 2
}
```

***

```http
PUT /cultures/:id
```

Met à jour une culture (sauf `id_parcelle`)

***

```http
DELETE /cultures/:id
```

Supprime une culture.

***

#### Types de cultures

```http
GET /type-culture
```

Liste tous les types disponibles.

***

```http
POST /types-cultures
```

```json
{
  "nom": "Maïs grain",
  "description": "Maïs pour grain sec",
  "couleur": "#F4C430"
}
```

***

```http
PUT /type-cultures/:id 
```

```http
DELETE /type-cultures/:id
```

Mise à jour et suppression standards.

***

#### Observations

```http
GET /observations
```

Liste les observations. Filtre optionnel par culture :&#x20;

```http
GET /api/observations?id_culture=3
```

Retourne les observations enrichies avec le nom de la culture et de la parcelle

***

```http
GET observations/:id
```

Détail d'une observation.

> **À noter :** les routes POST/PUT/DELETE sur les observatons ne sont pas implémentées dans la version actuelle.

***

#### Météo

```http
GET /meteo
```

Retourne les données météo agrégées par jour (moyennes globales).

**Query Params :**&#x20;

* `limit` (défaut: 30), nombre de jours à retourner
* `id_parcelle` (optionnel), filtre par parcelle

**Exemple :**&#x20;

```http
GET /api/meteo?limit=7
```

**Réponse 200 :**&#x20;

```json
[
  {
    "date_meteo": "2026-05-07",
    "temperature": 18.4,
    "humidite": 62.1,
    "precipitation": 2.3,
    "vent": 12.5
  }
]
```

***

```http
GET /meteo/latest
```

Météo du jour le plus récent (moyennes globales).

***

#### Alertes

```http
GET alertes
```

Liste toutes les alertes triées par daté décroissante, avec nom de la culture et de la règle.

***

```http
GET /alertes/:id
```

Détail d'une alerte.

***

```http
PUT /alertes/:id/resolve
```

Marque une alerte comme `resolue` .

**Réponse 200 :**&#x20;

```json
{ "message": "Alerte résolue" }
```

***

```http
POST /alertes/run
```

**Déclenche le moteur d'alertes.** Compare la dernière météo enregistrée à toutes les règles actives, et crée une alerte par  culture en cours pour chaque règle déclenchée. Évite  les doublons : si une alerte `active`  existe déjà pour ce couple (culture, règle), aucune nouvelle alerte n'est créée.

**Réponse 200 :**&#x20;

```json
{
  "alertes_creees": 3,
  "detail": [
    { "culture": "Blé tendre", "regle": "Gel sévère", "niveau": "critique" }
  ]
}
```

***

### Code d'erreur standards

| Code | Signification                       |
| ---- | ----------------------------------- |
| 200  | OK                                  |
| 201  | Ressource créée                     |
| 204  | OK sans contenu (DELETE)            |
| 400  | Requête invalide (champs manquants) |
| 401  | Non authentifié / token invalide    |
| 404  | Ressource introuvable               |
| 409  | Conflit (ex: email déjà utilisé)    |
| 500  | Erreur interne du serveur           |

### Format des erreurs

```json
{ "error": "Message d'erreur explicite" }
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.devonyx.fr/getting-started/api-rest.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
