From dc8dbc3cd7bbc95b4bdc93abf698e483e44e8801 Mon Sep 17 00:00:00 2001 From: Mathieu Date: Fri, 15 May 2026 14:09:57 +0200 Subject: [PATCH] fix(prisma): remplace les enums par des String (compat SQLite) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit SQLite ne supporte pas les enums Prisma. Les 6 enums (HostStatus, HostSource, Protocol, PortState, ScanType, ScanStatus) sont convertis en champs String avec valeurs par défaut littérales et documentation inline des valeurs autorisées. La validation reste assurée par Zod côté app. Adapte aussi les mappings statusVariant des pages hosts/scans en Record avec fallback 'default'. Co-Authored-By: Claude Opus 4.7 --- prisma/schema.prisma | 66 ++++++++++-------------------- src/app/(dashboard)/hosts/page.tsx | 8 ++-- src/app/(dashboard)/scans/page.tsx | 8 ++-- 3 files changed, 31 insertions(+), 51 deletions(-) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 0199ed5..20ffdd7 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -49,10 +49,11 @@ model Host { vendor String? // Issue du MAC (OUI) ou d'une fingerprint osGuess String? // OS détecté / renseigné - status HostStatus @default(UNKNOWN) + // Valeurs : "UP" | "DOWN" | "UNKNOWN" (validation Zod côté app) + status String @default("UNKNOWN") - // Origine de la fiche : saisie manuelle ou découverte - source HostSource @default(MANUAL) + // Origine de la fiche : "MANUAL" | "DISCOVERED" | "IMPORTED" + source String @default("MANUAL") // Relations networkId String? @@ -71,17 +72,10 @@ model Host { @@index([status]) } -enum HostStatus { - UP - DOWN - UNKNOWN -} - -enum HostSource { - MANUAL - DISCOVERED - IMPORTED -} +// NOTE : les enums Prisma ne sont pas supportés par SQLite. On stocke +// donc tous les statuts/types en `String` et on valide les valeurs +// possibles côté app via Zod. Constantes documentées au-dessus de +// chaque champ. // ===================================================================== // Ports ouverts sur un hôte @@ -89,10 +83,12 @@ enum HostSource { model Port { id String @id @default(cuid()) number Int - protocol Protocol @default(TCP) + // Valeurs : "TCP" | "UDP" + protocol String @default("TCP") serviceName String? // ex: "http", "ssh", renseigné ou deviné banner String? // Banner applicatif collecté - state PortState @default(OPEN) + // Valeurs : "OPEN" | "CLOSED" | "FILTERED" | "UNKNOWN" + state String @default("OPEN") hostId String host Host @relation(fields: [hostId], references: [id], onDelete: Cascade) @@ -110,17 +106,8 @@ model Port { @@index([number]) } -enum Protocol { - TCP - UDP -} - -enum PortState { - OPEN - CLOSED - FILTERED - UNKNOWN -} +// Protocol : "TCP" | "UDP" — voir Port.protocol +// PortState : "OPEN" | "CLOSED" | "FILTERED" | "UNKNOWN" — voir Port.state // ===================================================================== // Applications (Jellyfin, Home Assistant, Nextcloud, etc.) @@ -159,9 +146,11 @@ model HostApplication { // Découverte réseau — historique des scans // ===================================================================== model Scan { - id String @id @default(cuid()) - type ScanType - status ScanStatus @default(PENDING) + id String @id @default(cuid()) + // Valeurs : "PING" | "PORT" | "ARP" | "MDNS" | "FULL" + type String + // Valeurs : "PENDING" | "RUNNING" | "COMPLETED" | "FAILED" | "CANCELLED" + status String @default("PENDING") target String // CIDR, IP, ou hôte params String? // JSON (Zod validé côté app) startedAt DateTime? @@ -180,21 +169,8 @@ model Scan { @@index([type]) } -enum ScanType { - PING - PORT - ARP - MDNS - FULL -} - -enum ScanStatus { - PENDING - RUNNING - COMPLETED - FAILED - CANCELLED -} +// ScanType : "PING" | "PORT" | "ARP" | "MDNS" | "FULL" — voir Scan.type +// ScanStatus : "PENDING" | "RUNNING" | "COMPLETED" | "FAILED" | "CANCELLED" — voir Scan.status // Résultat individuel d'un scan (rattaché à un hôte quand possible) model ScanResult { diff --git a/src/app/(dashboard)/hosts/page.tsx b/src/app/(dashboard)/hosts/page.tsx index 65449b0..8ef218f 100644 --- a/src/app/(dashboard)/hosts/page.tsx +++ b/src/app/(dashboard)/hosts/page.tsx @@ -30,11 +30,13 @@ async function getHosts() { } } -const statusVariant = { +type BadgeVariant = 'default' | 'success' | 'warning' | 'destructive' | 'info' | 'outline'; + +const statusVariant: Record = { UP: 'success', DOWN: 'destructive', UNKNOWN: 'default', -} as const; +}; export default async function HostsPage() { const hosts = await getHosts(); @@ -82,7 +84,7 @@ export default async function HostsPage() { {h.network?.name ?? '—'} - {h.status} + {h.status} {h.ports.length > 0 ? ( diff --git a/src/app/(dashboard)/scans/page.tsx b/src/app/(dashboard)/scans/page.tsx index e19f271..b728f33 100644 --- a/src/app/(dashboard)/scans/page.tsx +++ b/src/app/(dashboard)/scans/page.tsx @@ -26,13 +26,15 @@ async function getScans() { } } -const statusVariant = { +type BadgeVariant = 'default' | 'success' | 'warning' | 'destructive' | 'info' | 'outline'; + +const statusVariant: Record = { COMPLETED: 'success', RUNNING: 'info', PENDING: 'default', FAILED: 'destructive', CANCELLED: 'warning', -} as const; +}; function formatDuration(start: Date | null, end: Date | null) { if (!start || !end) return '—'; @@ -83,7 +85,7 @@ export default async function ScansPage() { {s.target} - {s.status} + {s.status} {s.hostsFound} {s.portsFound}