Aurora HomeAurora HomeDocs
DocsBase de données

Base de données

Aurora Home utilise Prisma ORM avec SQLite. Le schéma est défini dans prisma/schema.prisma à la racine du projet.

Modèles

User

Compte utilisateur de l'application.
ChampTypeNotes
idStringCUID, clé primaire
nameString?Nom d'affichage
emailStringUnique — identifiant de connexion
emailVerifiedBoolean
imageString?URL avatar DiceBear
createdAtDateTime
updatedAtDateTime

Session

Session authentifiée — gérée par Better Auth.
ChampTypeNotes
idStringCUID
tokenStringUnique — transmis via cookie
expiresAtDateTimeExpiration de la session
ipAddressString?IP du client
userAgentString?User-Agent du navigateur
userIdStringFK → User

Account

Compte lié à un provider OAuth (Better Auth).
ChampTypeNotes
idString
providerIdStringex: 'credential'
accountIdString
accessTokenString?
refreshTokenString?
userIdStringFK → User

Verification

Token de vérification OTP — généré à chaque demande de connexion.
ChampTypeNotes
idString
identifierStringEmail de l'utilisateur
valueStringCode OTP haché
expiresAtDateTimeExpiration du code

DataPoint

Relevé de capteur — créé à chaque message MQTT reçu.
ChampTypeNotes
idStringCUID
typeDataTypeEnum : TEMPERATURE | HUMIDITY | PRESSURE | CO2 | LIGHT
valueStringValeur brute (ex: '22.50')
createdAtDateTimeHorodatage du relevé

Alert

Anomalie détectée sur un capteur.
ChampTypeNotes
idStringCUID
typeAlertTypeTHRESHOLD_HIGH | THRESHOLD_LOW | SUDDEN_CHANGE
severitySeverityWARNING | HIGH | CRITICAL
sensorTypeDataTypeCapteur concerné
valueFloatValeur mesurée au moment de l'alerte
thresholdFloat?Seuil dépassé (null si variation soudaine)
messageStringMessage affiché à l'utilisateur
suggestionsStringJSON stringifié — liste de suggestions
readBooleanfalse par défaut
resolvedAtDateTime?null tant que non résolue
createdAtDateTime

Nouveaux modèles

SystemThreshold

Seuil personnalisé par capteur — remplace les valeurs par défaut du détecteur d'anomalies.
ChampTypeNotes
idStringCUID
sensorTypeDataTypeEnum : TEMPERATURE | HUMIDITY | PRESSURE | CO2 | LIGHT
highValueFloat?Seuil haut personnalisé (null = valeur par défaut)
highSeveritySeverity?Sévérité associée au seuil haut
lowValueFloat?Seuil bas personnalisé (null = valeur par défaut)
lowSeveritySeverity?Sévérité associée au seuil bas
updatedAtDateTime

SensorPreference

Préférence d'alerte par capteur — activation et sévérité minimale.
ChampTypeNotes
idStringCUID
sensorTypeDataTypeEnum : TEMPERATURE | HUMIDITY | PRESSURE | CO2 | LIGHT
enabledBooleantrue par défaut — false désactive les alertes pour ce capteur
minSeveritySeveritySévérité minimale pour déclencher une alerte (WARNING par défaut)
updatedAtDateTime

NotificationSettings

Paramètres de notification globaux — plage d'heures silencieuses.
ChampTypeNotes
idStringIdentifiant fixe "default" — un seul enregistrement global
quietStartInt?Heure de début du mode silencieux (0–23, null = désactivé)
quietEndInt?Heure de fin du mode silencieux (0–23, null = désactivé)
updatedAtDateTime
prisma/schema.prisma — nouveaux modèles
model SystemThreshold {
  id           String    @id @default(cuid())
  sensorType   DataType  @unique
  highValue    Float?
  highSeverity Severity?
  lowValue     Float?
  lowSeverity  Severity?
  updatedAt    DateTime  @updatedAt
}

model SensorPreference {
  id          String   @id @default(cuid())
  sensorType  DataType @unique
  enabled     Boolean  @default(true)
  minSeverity Severity @default(WARNING)
  updatedAt   DateTime @updatedAt
}

model NotificationSettings {
  id         String   @id @default("default")
  quietStart Int?
  quietEnd   Int?
  updatedAt  DateTime @updatedAt
}

Enums

DataType
enum DataType {
  TEMPERATURE
  HUMIDITY
  PRESSURE
  CO2
  LIGHT
}
AlertType
enum AlertType {
  THRESHOLD_HIGH   // Seuil haut dépassé
  THRESHOLD_LOW    // Seuil bas dépassé
  SUDDEN_CHANGE    // Variation brutale (± 25% de la moyenne glissante)
}
Severity
enum Severity {
  WARNING   // Attention — légèrement hors norme
  HIGH      // Problème — significativement hors norme
  CRITICAL  // Urgent — valeur dangereuse
}

Note : Le champ value de DataPoint est stocké enString et non en Float. Le serveur extrait la valeur numérique avec parseFloat() avant de calculer ou afficher les graphiques. Le champsuggestions d'Alert est un tableau JSON stringifié.

Commandes Prisma

npx prisma db push
npx prisma migrate dev
npx prisma studio
npx tsx prisma/seedFakeData.ts
npx tsx prisma/clearData.ts

Pattern Repository

Tous les accès à la base de données passent par des repositories dédiés qui encapsulent les requêtes Prisma. Les usecases retournent un type UsecaseResult<T> pour une gestion uniforme des erreurs.

Exemple
// features/datapoint/repository/dataPointRepository.ts
export const dataPointRepository = {
  findLatestByType: (type: DataType) =>
    prisma.dataPoint.findMany({ where: { type }, orderBy: { createdAt: 'desc' }, take: 20 }),

  create: (type: DataType, value: string) =>
    prisma.dataPoint.create({ data: { type, value } }),
};

// Retour usecase
type UsecaseResult<T> =
  | { success: true; data: T }
  | { success: false; error: string };