Aurora HomeAurora HomeDocs
DocsAPI REST

API REST

Les routes API exposées par l'application Next.js Aurora Home.

L'API est conçue pour un usage interne. Elle n'est pas publique et ne requiert pas d'authentification explicite pour le stream SSE (accessible depuis le dashboard connecté uniquement). L'auth utilisateur passe par les cookies Better Auth.

Endpoints

GET/api/sensor-stream

Connexion Server-Sent Events (SSE) en temps réel. Le serveur envoie un événement à chaque nouveau message MQTT reçu, ainsi qu'un ping keepalive toutes les 15 secondes pour maintenir la connexion ouverte.

Content-Type

text/event-stream

Cache-Control

no-cache
Format d'événement SSE
// Événement de mise à jour capteur
data: {
  "type": "sensor_update",
  "data": {
    "TEMPERATURE": {
      "id": "clxyz123",
      "type": "TEMPERATURE",
      "value": "22.50 °C",
      "createdAt": "2024-01-15T10:30:00.000Z"
    },
    "HUMIDITY": { ... },
    "PRESSURE": { ... },
    "CO2": { ... },
    "LIGHT": { ... }
  }
}

// Keepalive (toutes les 15s)
: keepalive
GET|POST/api/auth/[...all]

Route catch-all gérée par Better Auth. Prend en charge toutes les opérations d'authentification : création de session, vérification OTP, récupération de session, déconnexion.

/api/auth/sign-in/email-otp
/api/auth/email-otp/verify-otp
/api/auth/get-session
/api/auth/sign-out

Le stream SSE envoie également les événements d'alertes :

Événement alert_created
data: {
  "type": "alert_created",
  "data": {
    "id": "clxyz456",
    "type": "THRESHOLD_HIGH",
    "severity": "HIGH",
    "sensorType": "CO2",
    "value": 1620,
    "threshold": 1500,
    "message": "CO₂ élevé détecté (1620 ppm)",
    "suggestions": ["Ouvrez une fenêtre", "Vérifiez la ventilation"],
    "read": false,
    "resolvedAt": null,
    "createdAt": "2024-01-15T10:35:00.000Z"
  }
}
POST/api/locale

Met à jour la préférence de langue de l'utilisateur. La valeur est sauvegardée dans un cookie locale et utilisée par next-intl pour charger les traductions FR ou EN.

Body (JSON)
{
  "locale": "fr"  // "fr" ou "en"
}
Réponse
{
  "success": true
}
GET/api/datapoints

Retourne les données historiques d'un capteur pour une période donnée. Le paramètre type est un DataType (ex : CO2). Le paramètre period accepte : live, 1h, 6h, 24h, 7d. Les vues 24h et 7d sont sous-échantillonnées à 80 points maximum.

?type

Type de capteur (ex : CO2, TEMPERATURE)

?period

Fenêtre temporelle : live | 1h | 6h | 24h | 7d
Exemple
GET /api/datapoints?type=CO2&period=6h
GET/api/thresholds

Retourne tous les seuils personnalisés enregistrés en base (modèle SystemThreshold). Les capteurs sans seuil personnalisé utilisent les valeurs par défaut.

POST/api/thresholds

Crée ou met à jour (upsert) un seuil pour un capteur donné.

Body JSON (POST /api/thresholds)
{
  "sensorType":    "CO2",          // DataType enum
  "highValue":     1500,           // Float ou null
  "highSeverity":  "HIGH",         // Severity ou null
  "lowValue":      null,
  "lowSeverity":   null
}
GET/api/preferences

Retourne les préférences par capteur (SensorPreference) et les paramètres de notification globaux (NotificationSettings).

POST/api/preferences

Crée ou met à jour une préférence. Le champ type détermine si l'on met à jour une préférence capteur (sensor) ou les paramètres globaux (settings).

Body JSON (POST /api/preferences)
// Préférence capteur
{
  "type":        "sensor",
  "sensorType":  "TEMPERATURE",
  "enabled":     true,
  "minSeverity": "WARNING"
}

// Paramètres globaux
{
  "type":        "settings",
  "quietStart":  23,
  "quietEnd":    7
}
POST/api/dev/inject-sensordev only

Endpoint de développement pour simuler des données capteurs sans ESP32 physique. Retourne 403 si NODE_ENV !== "development". Crée les DataPoints, lance la détection d'anomalies et émet les événements SSE.

Body (JSON)
{
  "temperature": "22.5",
  "humidity":    "58.0",
  "pressure":    "1013.2",
  "co2":         "820",
  "light":       "310"
}

Gestion des erreurs

200Succès
400Requête invalide (body malformé, paramètre manquant)
401Non authentifié (session absente ou expirée)
500Erreur serveur interne

Route handlers Next.js App Router

Toutes les routes API utilisent le système de route handlers de Next.js App Router (fichiers route.ts dans le dossierapp/api/). Elles s'exécutent côté serveur et ont accès à l'ensemble des ressources Node.js.