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}