DocsDocumentation TechniqueBase 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.| Champ | Type | Notes |
|---|---|---|
id | String | CUID, clé primaire |
name | String? | Nom d'affichage |
email | String | Unique — identifiant de connexion |
emailVerified | Boolean | |
image | String? | URL avatar DiceBear |
createdAt | DateTime | |
updatedAt | DateTime |
Session
Session authentifiée — gérée par Better Auth.| Champ | Type | Notes |
|---|---|---|
id | String | CUID |
token | String | Unique — transmis via cookie |
expiresAt | DateTime | Expiration de la session |
ipAddress | String? | IP du client |
userAgent | String? | User-Agent du navigateur |
userId | String | FK → User |
Account
Compte lié à un provider OAuth (Better Auth).| Champ | Type | Notes |
|---|---|---|
id | String | |
providerId | String | ex: 'credential' |
accountId | String | |
accessToken | String? | |
refreshToken | String? | |
userId | String | FK → User |
Verification
Token de vérification OTP — généré à chaque demande de connexion.| Champ | Type | Notes |
|---|---|---|
id | String | |
identifier | String | Email de l'utilisateur |
value | String | Code OTP haché |
expiresAt | DateTime | Expiration du code |
DataPoint
Relevé de capteur — créé à chaque message MQTT reçu.| Champ | Type | Notes |
|---|---|---|
id | String | CUID |
type | DataType | Enum : TEMPERATURE | HUMIDITY | PRESSURE | CO2 | LIGHT |
value | String | Valeur brute (ex: '22.50') |
createdAt | DateTime | Horodatage du relevé |
Alert
Anomalie détectée sur un capteur.| Champ | Type | Notes |
|---|---|---|
id | String | CUID |
type | AlertType | THRESHOLD_HIGH | THRESHOLD_LOW | SUDDEN_CHANGE |
severity | Severity | WARNING | HIGH | CRITICAL |
sensorType | DataType | Capteur concerné |
value | Float | Valeur mesurée au moment de l'alerte |
threshold | Float? | Seuil dépassé (null si variation soudaine) |
message | String | Message affiché à l'utilisateur |
suggestions | String | JSON stringifié — liste de suggestions |
read | Boolean | false par défaut |
resolvedAt | DateTime? | null tant que non résolue |
createdAt | DateTime |
Nouveaux modèles
SystemThreshold
Seuil personnalisé par capteur — remplace les valeurs par défaut du détecteur d'anomalies.| Champ | Type | Notes |
|---|---|---|
id | String | CUID |
sensorType | DataType | Enum : TEMPERATURE | HUMIDITY | PRESSURE | CO2 | LIGHT |
highValue | Float? | Seuil haut personnalisé (null = valeur par défaut) |
highSeverity | Severity? | Sévérité associée au seuil haut |
lowValue | Float? | Seuil bas personnalisé (null = valeur par défaut) |
lowSeverity | Severity? | Sévérité associée au seuil bas |
updatedAt | DateTime |
SensorPreference
Préférence d'alerte par capteur — activation et sévérité minimale.| Champ | Type | Notes |
|---|---|---|
id | String | CUID |
sensorType | DataType | Enum : TEMPERATURE | HUMIDITY | PRESSURE | CO2 | LIGHT |
enabled | Boolean | true par défaut — false désactive les alertes pour ce capteur |
minSeverity | Severity | Sévérité minimale pour déclencher une alerte (WARNING par défaut) |
updatedAt | DateTime |
NotificationSettings
Paramètres de notification globaux — plage d'heures silencieuses.| Champ | Type | Notes |
|---|---|---|
id | String | Identifiant fixe "default" — un seul enregistrement global |
quietStart | Int? | Heure de début du mode silencieux (0–23, null = désactivé) |
quietEnd | Int? | Heure de fin du mode silencieux (0–23, null = désactivé) |
updatedAt | DateTime |
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 pushnpx prisma migrate devnpx prisma studionpx tsx prisma/seedFakeData.tsnpx tsx prisma/clearData.tsPattern 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 };