153 lines
No EOL
3.7 KiB
Text
153 lines
No EOL
3.7 KiB
Text
generator client {
|
|
provider = "prisma-client-js"
|
|
}
|
|
|
|
datasource db {
|
|
provider = "postgresql"
|
|
url = env("DATABASE_URL")
|
|
}
|
|
|
|
model User {
|
|
id String @id @default(cuid())
|
|
email String @unique
|
|
passwordHash String
|
|
name String?
|
|
company String?
|
|
role UserRole @default(USER)
|
|
apiKey String? @unique
|
|
isActive Boolean @default(true)
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
websites Website[]
|
|
reports Report[]
|
|
scanJobs ScanJob[]
|
|
}
|
|
|
|
model Website {
|
|
id String @id @default(cuid())
|
|
name String
|
|
url String
|
|
userId String
|
|
user User @relation(fields: [userId], references: [id])
|
|
|
|
scanSchedule Json? // ScanSchedule type
|
|
lastScanAt DateTime?
|
|
complianceScore Float?
|
|
tags String[]
|
|
active Boolean @default(true)
|
|
|
|
authConfig Json? // AuthenticationConfig type
|
|
scanOptions Json? // Default scan options
|
|
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
scanResults ScanResult[]
|
|
scanJobs ScanJob[]
|
|
reports Report[]
|
|
|
|
@@index([userId])
|
|
@@index([url])
|
|
}
|
|
|
|
model ScanResult {
|
|
id String @id @default(cuid())
|
|
websiteId String
|
|
website Website @relation(fields: [websiteId], references: [id])
|
|
jobId String? @unique
|
|
job ScanJob? @relation(fields: [jobId], references: [id])
|
|
|
|
url String
|
|
scanDuration Int
|
|
summary Json // ScanSummary type
|
|
violations Json // AccessibilityViolation[] type
|
|
passes Json // AxeResult[] type
|
|
incomplete Json // AxeResult[] type
|
|
inapplicable Json // AxeResult[] type
|
|
pageMetadata Json // PageMetadata type
|
|
wcagCompliance Json // WCAGCompliance type
|
|
|
|
createdAt DateTime @default(now())
|
|
|
|
@@index([websiteId])
|
|
@@index([createdAt])
|
|
}
|
|
|
|
model ScanJob {
|
|
id String @id @default(cuid())
|
|
websiteId String
|
|
website Website @relation(fields: [websiteId], references: [id])
|
|
userId String
|
|
user User @relation(fields: [userId], references: [id])
|
|
|
|
url String
|
|
status JobStatus @default(PENDING)
|
|
options Json // AccessibilityScanOptions type
|
|
|
|
scheduledAt DateTime @default(now())
|
|
startedAt DateTime?
|
|
completedAt DateTime?
|
|
|
|
error String?
|
|
retryCount Int @default(0)
|
|
maxRetries Int @default(3)
|
|
|
|
result ScanResult?
|
|
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
@@index([websiteId])
|
|
@@index([status])
|
|
@@index([scheduledAt])
|
|
}
|
|
|
|
model Report {
|
|
id String @id @default(cuid())
|
|
websiteId String
|
|
website Website @relation(fields: [websiteId], references: [id])
|
|
userId String
|
|
user User @relation(fields: [userId], references: [id])
|
|
|
|
type ReportType
|
|
format ReportFormat
|
|
period Json // ReportPeriod type
|
|
|
|
summary Json // ReportSummary type
|
|
data Json // Report data
|
|
|
|
fileUrl String?
|
|
|
|
generatedAt DateTime @default(now())
|
|
|
|
@@index([websiteId])
|
|
@@index([userId])
|
|
@@index([generatedAt])
|
|
}
|
|
|
|
enum UserRole {
|
|
USER
|
|
ADMIN
|
|
}
|
|
|
|
enum JobStatus {
|
|
PENDING
|
|
RUNNING
|
|
COMPLETED
|
|
FAILED
|
|
}
|
|
|
|
enum ReportType {
|
|
COMPLIANCE
|
|
EXECUTIVE
|
|
TECHNICAL
|
|
TREND
|
|
}
|
|
|
|
enum ReportFormat {
|
|
PDF
|
|
HTML
|
|
JSON
|
|
CSV
|
|
} |