generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" url = env("DATABASE_URL") } enum RequestStatus { pending completed needs_attention } enum JobState { requested matching matched downloading tagging imported needs_attention } enum MonitoredReleaseState { wanted grabbed fulfilled } model Request { id String @id @default(cuid()) artist String album String status RequestStatus @default(pending) createdAt DateTime @default(now()) job Job? libraryItem LibraryItem? monitoredReleaseId String? monitoredRelease MonitoredRelease? @relation(fields: [monitoredReleaseId], references: [id], onDelete: SetNull) } model Job { id String @id @default(cuid()) request Request @relation(fields: [requestId], references: [id], onDelete: Cascade) requestId String @unique state JobState @default(requested) currentStage String @default("intake") attempts Int @default(0) error String? claimedAt DateTime? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt candidates Candidate[] } model Candidate { id String @id @default(cuid()) job Job @relation(fields: [jobId], references: [id], onDelete: Cascade) jobId String source String format String qualityClass Int trackCount Int confidence Float sourceRef String chosen Boolean @default(false) createdAt DateTime @default(now()) } model LibraryItem { id String @id @default(cuid()) request Request? @relation(fields: [requestId], references: [id], onDelete: Cascade) requestId String? @unique artist String album String path String source String format String qualityClass Int importedAt DateTime @default(now()) @@unique([artist, album]) } model Config { key String @id value String secret Boolean @default(false) updatedAt DateTime @updatedAt } model WatchedArtist { id String @id @default(cuid()) mbid String @unique name String autoMonitorFuture Boolean @default(false) showAllTypes Boolean @default(false) monitorFrom DateTime @default(now()) lastPolledAt DateTime? createdAt DateTime @default(now()) releases MonitoredRelease[] } model MonitoredRelease { id String @id @default(cuid()) watchedArtist WatchedArtist? @relation(fields: [watchedArtistId], references: [id], onDelete: Cascade) watchedArtistId String? artistMbid String artistName String rgMbid String @unique album String primaryType String? secondaryTypes String[] firstReleaseDate String? monitored Boolean @default(false) state MonitoredReleaseState @default(wanted) currentQualityClass Int? firstGrabbedAt DateTime? lastSearchedAt DateTime? createdAt DateTime @default(now()) requests Request[] }