This commit is contained in:
154
prisma/schema.prisma
Normal file
154
prisma/schema.prisma
Normal file
@@ -0,0 +1,154 @@
|
||||
|
||||
generator client {
|
||||
provider = "prisma-client-js"
|
||||
}
|
||||
|
||||
datasource db {
|
||||
provider = "sqlite"
|
||||
url = env("DATABASE_URL")
|
||||
}
|
||||
|
||||
model Project {
|
||||
id String @id @default(uuid())
|
||||
niche String
|
||||
productType String
|
||||
creativity String
|
||||
aspectRatio String @default("3:4") // 1:1, 3:4, 4:5, 16:9, 9:16, etc.
|
||||
useExactReference Boolean @default(false) // Strict Composition Mode
|
||||
status String @default("draft") // draft, generated, finalized
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
sku String? // e.g. "WLR005"
|
||||
config String? // JSON: { isStickerSet, setSize, basePrompt, characterCore }
|
||||
|
||||
assets Asset[]
|
||||
seoData SeoData?
|
||||
|
||||
userId String?
|
||||
user User? @relation(fields: [userId], references: [id])
|
||||
}
|
||||
|
||||
model Asset {
|
||||
id String @id @default(uuid())
|
||||
projectId String
|
||||
type String // master, mockup, reference, revision
|
||||
path String // Local file path relative to /storage
|
||||
prompt String? // The prompt that generated this asset
|
||||
meta String? // JSON string for extra metadata (scenario name, etc.)
|
||||
quality String @default("DRAFT") // DRAFT, MASTER, UPSCALED
|
||||
createdAt DateTime @default(now())
|
||||
|
||||
project Project @relation(fields: [projectId], references: [id], onDelete: Cascade)
|
||||
}
|
||||
|
||||
model SeoData {
|
||||
id String @id @default(uuid())
|
||||
projectId String @unique
|
||||
title String
|
||||
description String
|
||||
keywords String // Stored as comma separated string or JSON
|
||||
printingGuide String
|
||||
suggestedPrice String
|
||||
jsonLd String? // Structured Data (Schema.org)
|
||||
attributes String? // JSON String: { primaryColor, occasion, etc. }
|
||||
categoryPath String? // Suggested Category Path
|
||||
|
||||
project Project @relation(fields: [projectId], references: [id], onDelete: Cascade)
|
||||
}
|
||||
|
||||
model EtsyShop {
|
||||
id String @id @default(uuid())
|
||||
shopId String @unique
|
||||
userId String
|
||||
shopName String
|
||||
accessToken String
|
||||
refreshToken String
|
||||
expiresAt BigInt
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
||||
}
|
||||
|
||||
model BrandProfile {
|
||||
id String @id @default(uuid())
|
||||
name String @unique
|
||||
referencePaths String // JSON array of file paths relative to /storage
|
||||
createdAt DateTime @default(now())
|
||||
|
||||
// Relations
|
||||
userId String?
|
||||
user User? @relation(fields: [userId], references: [id])
|
||||
}
|
||||
|
||||
model User {
|
||||
id String @id @default(uuid())
|
||||
email String @unique
|
||||
passwordHash String? // Optional for Google Users
|
||||
|
||||
// OAuth Fields
|
||||
googleId String? @unique
|
||||
avatar String?
|
||||
|
||||
role String @default("USER") // USER, ADMIN
|
||||
|
||||
// SaaS / Beta Fields
|
||||
credits Int @default(300) // Free credits (Generous tier)
|
||||
plan String @default("FREE") // FREE, PRO
|
||||
betaAccess Boolean @default(true) // Gated access
|
||||
|
||||
// New SaaS Fields (Phase 1)
|
||||
apiKey String? // User's Personal Gemini API Key (Encrypted/Plain per policy)
|
||||
etsyShopName String? // Manual Etsy Shop Name fallback
|
||||
etsyShopLink String? // Manual Etsy Shop Link fallback
|
||||
etsyShopLogo String? // Path to logo file
|
||||
paymentMethod String? // Stripe Payment Method ID (Future)
|
||||
subscriptionId String? // Stripe Subscription ID (Future)
|
||||
|
||||
skuSettings String? // JSON: { "Wall Art": {prefix: "WLR", next: 1} }
|
||||
|
||||
createdAt DateTime @default(now())
|
||||
|
||||
// Legal Compliance (Phase 6)
|
||||
termsAcceptedAt DateTime? // User Agreement & IP Rights
|
||||
kvkkAcceptedAt DateTime? // KVKK & Data Privacy
|
||||
|
||||
// Profit Analytics (Phase 7)
|
||||
totalRevenue Float @default(0.0) // Total money paid by user (USD)
|
||||
totalCost Float @default(0.0) // Total API cost incurred by user (USD, estimated)
|
||||
|
||||
projects Project[]
|
||||
brandProfiles BrandProfile[]
|
||||
etsyShops EtsyShop[]
|
||||
usageLogs UsageLog[]
|
||||
transactions Transaction[]
|
||||
}
|
||||
|
||||
model UsageLog {
|
||||
id String @id @default(uuid())
|
||||
userId String
|
||||
action String // GENERATE_MASTER, GENERATE_VARIANT, MOCKUP, PROMPT
|
||||
cost Float // Estimated API cost in USD for this action
|
||||
credits Int // Credits deducted
|
||||
timestamp DateTime @default(now())
|
||||
|
||||
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
||||
}
|
||||
|
||||
model Transaction {
|
||||
id String @id @default(uuid())
|
||||
userId String
|
||||
amount Float // USD Amount paid
|
||||
credits Int // Credits added
|
||||
type String // PURCHASE, ADMIN_GRANT, BONUS
|
||||
createdAt DateTime @default(now())
|
||||
|
||||
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
||||
}
|
||||
|
||||
model SystemConfig {
|
||||
key String @id @unique
|
||||
value String
|
||||
description String?
|
||||
updatedAt DateTime @updatedAt
|
||||
}
|
||||
Reference in New Issue
Block a user