Files
2025-12-25 12:02:07 -03:00

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
}