291 lines
6.4 KiB
Plaintext
291 lines
6.4 KiB
Plaintext
// This is your Prisma schema file,
|
|
// learn more about it in the docs: https://pris.ly/d/prisma-schema
|
|
|
|
generator client {
|
|
provider = "prisma-client-js"
|
|
}
|
|
|
|
datasource db {
|
|
provider = "postgresql"
|
|
url = env("DATABASE_URL")
|
|
}
|
|
|
|
// User Management
|
|
model User {
|
|
id String @id @default(cuid())
|
|
email String @unique
|
|
passwordHash String
|
|
firstName String?
|
|
lastName String?
|
|
avatar String?
|
|
isActive Boolean @default(true)
|
|
emailVerified Boolean @default(false)
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
// Subscription and billing
|
|
subscription SubscriptionTier @default(FREE)
|
|
billingId String?
|
|
usageMetrics UsageMetrics?
|
|
|
|
// Relationships
|
|
projects Project[]
|
|
collaborations ProjectCollaboration[]
|
|
sessions UserSession[]
|
|
auditLogs AuditLog[]
|
|
|
|
@@map("users")
|
|
}
|
|
|
|
model UserSession {
|
|
id String @id @default(cuid())
|
|
userId String
|
|
token String @unique
|
|
expiresAt DateTime
|
|
createdAt DateTime @default(now())
|
|
|
|
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
|
|
@@map("user_sessions")
|
|
}
|
|
|
|
// Project Management
|
|
model Project {
|
|
id String @id @default(cuid())
|
|
name String
|
|
description String?
|
|
sourceUrl String
|
|
status ProjectStatus @default(CREATED)
|
|
settings Json @default("{}")
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
// Owner
|
|
userId String
|
|
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
|
|
// Relationships
|
|
pages Page[]
|
|
assets Asset[]
|
|
components Component[]
|
|
collaborations ProjectCollaboration[]
|
|
analytics ProjectAnalytics?
|
|
exports ProjectExport[]
|
|
|
|
@@map("projects")
|
|
}
|
|
|
|
model ProjectCollaboration {
|
|
id String @id @default(cuid())
|
|
projectId String
|
|
userId String
|
|
role CollaborationRole @default(VIEWER)
|
|
createdAt DateTime @default(now())
|
|
|
|
project Project @relation(fields: [projectId], references: [id], onDelete: Cascade)
|
|
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
|
|
@@unique([projectId, userId])
|
|
@@map("project_collaborations")
|
|
}
|
|
|
|
// Site Structure
|
|
model Page {
|
|
id String @id @default(cuid())
|
|
projectId String
|
|
url String
|
|
title String?
|
|
depth Int @default(0)
|
|
status PageStatus @default(DISCOVERED)
|
|
metadata Json @default("{}")
|
|
content String?
|
|
screenshot String?
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
project Project @relation(fields: [projectId], references: [id], onDelete: Cascade)
|
|
assets Asset[]
|
|
|
|
@@unique([projectId, url])
|
|
@@map("pages")
|
|
}
|
|
|
|
// Asset Management
|
|
model Asset {
|
|
id String @id @default(cuid())
|
|
projectId String
|
|
pageId String?
|
|
originalUrl String
|
|
storedUrl String
|
|
filename String
|
|
type AssetType
|
|
size Int
|
|
hash String
|
|
optimized Boolean @default(false)
|
|
cdnUrl String?
|
|
metadata Json @default("{}")
|
|
createdAt DateTime @default(now())
|
|
|
|
project Project @relation(fields: [projectId], references: [id], onDelete: Cascade)
|
|
page Page? @relation(fields: [pageId], references: [id], onDelete: SetNull)
|
|
|
|
@@unique([projectId, hash])
|
|
@@map("assets")
|
|
}
|
|
|
|
// Component System
|
|
model Component {
|
|
id String @id @default(cuid())
|
|
projectId String
|
|
name String
|
|
type ComponentType
|
|
html String
|
|
css String
|
|
javascript String?
|
|
props Json @default("[]")
|
|
frequency Int @default(1)
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
project Project @relation(fields: [projectId], references: [id], onDelete: Cascade)
|
|
instances ComponentInstance[]
|
|
|
|
@@map("components")
|
|
}
|
|
|
|
model ComponentInstance {
|
|
id String @id @default(cuid())
|
|
componentId String
|
|
selector String
|
|
props Json @default("{}")
|
|
createdAt DateTime @default(now())
|
|
|
|
component Component @relation(fields: [componentId], references: [id], onDelete: Cascade)
|
|
|
|
@@map("component_instances")
|
|
}
|
|
|
|
// Analytics and Metrics
|
|
model ProjectAnalytics {
|
|
id String @id @default(cuid())
|
|
projectId String @unique
|
|
cloneAccuracy Float?
|
|
processingTime Int? // in milliseconds
|
|
totalPages Int @default(0)
|
|
totalAssets Int @default(0)
|
|
totalComponents Int @default(0)
|
|
lastUpdated DateTime @default(now())
|
|
|
|
project Project @relation(fields: [projectId], references: [id], onDelete: Cascade)
|
|
|
|
@@map("project_analytics")
|
|
}
|
|
|
|
model UsageMetrics {
|
|
id String @id @default(cuid())
|
|
userId String @unique
|
|
pagesCloned Int @default(0)
|
|
storageUsed BigInt @default(0) // in bytes
|
|
apiCalls Int @default(0)
|
|
lastReset DateTime @default(now())
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
|
|
@@map("usage_metrics")
|
|
}
|
|
|
|
// Export and Deployment
|
|
model ProjectExport {
|
|
id String @id @default(cuid())
|
|
projectId String
|
|
format ExportFormat
|
|
status ExportStatus @default(PENDING)
|
|
fileUrl String?
|
|
createdAt DateTime @default(now())
|
|
|
|
project Project @relation(fields: [projectId], references: [id], onDelete: Cascade)
|
|
|
|
@@map("project_exports")
|
|
}
|
|
|
|
// Security and Audit
|
|
model AuditLog {
|
|
id String @id @default(cuid())
|
|
userId String?
|
|
action String
|
|
resource String
|
|
details Json @default("{}")
|
|
ipAddress String?
|
|
userAgent String?
|
|
createdAt DateTime @default(now())
|
|
|
|
user User? @relation(fields: [userId], references: [id], onDelete: SetNull)
|
|
|
|
@@map("audit_logs")
|
|
}
|
|
|
|
// Enums
|
|
enum SubscriptionTier {
|
|
FREE
|
|
BASIC
|
|
PRO
|
|
ENTERPRISE
|
|
}
|
|
|
|
enum ProjectStatus {
|
|
CREATED
|
|
CRAWLING
|
|
PROCESSING
|
|
GENERATING
|
|
COMPLETED
|
|
FAILED
|
|
}
|
|
|
|
enum PageStatus {
|
|
DISCOVERED
|
|
CRAWLING
|
|
SCRAPED
|
|
PROCESSED
|
|
FAILED
|
|
}
|
|
|
|
enum AssetType {
|
|
IMAGE
|
|
CSS
|
|
JAVASCRIPT
|
|
FONT
|
|
MEDIA
|
|
OTHER
|
|
}
|
|
|
|
enum ComponentType {
|
|
NAVIGATION
|
|
HEADER
|
|
FOOTER
|
|
CARD
|
|
FORM
|
|
BUTTON
|
|
OTHER
|
|
}
|
|
|
|
enum CollaborationRole {
|
|
VIEWER
|
|
EDITOR
|
|
ADMIN
|
|
}
|
|
|
|
enum ExportFormat {
|
|
ZIP
|
|
GITHUB
|
|
VERCEL
|
|
NETLIFY
|
|
}
|
|
|
|
enum ExportStatus {
|
|
PENDING
|
|
PROCESSING
|
|
COMPLETED
|
|
FAILED
|
|
} |