258 lines
6.3 KiB
Plaintext
258 lines
6.3 KiB
Plaintext
generator client {
|
|
provider = "prisma-client-js"
|
|
binaryTargets = ["native", "linux-musl-openssl-3.0.x"]
|
|
}
|
|
|
|
datasource db {
|
|
provider = "postgresql"
|
|
url = env("DATABASE_URL")
|
|
}
|
|
|
|
enum UserRole {
|
|
CUSTOMER
|
|
ADMIN
|
|
OWNER
|
|
}
|
|
|
|
enum ProductStatus {
|
|
DRAFT
|
|
PUBLISHED
|
|
ARCHIVED
|
|
}
|
|
|
|
enum OrderStatus {
|
|
PENDING
|
|
PAID
|
|
CANCELLED
|
|
REFUNDED
|
|
FULFILLED
|
|
}
|
|
|
|
enum ReviewStatus {
|
|
PENDING
|
|
APPROVED
|
|
HIDDEN
|
|
}
|
|
|
|
model User {
|
|
id String @id @default(cuid())
|
|
email String @unique
|
|
passwordHash String
|
|
role UserRole @default(CUSTOMER)
|
|
name String?
|
|
mustChangePassword Boolean @default(false)
|
|
emailVerifiedAt DateTime?
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
sessions Session[]
|
|
orders Order[]
|
|
reviews Review[]
|
|
passwordResetTokens PasswordResetToken[]
|
|
}
|
|
|
|
model Session {
|
|
id String @id @default(cuid())
|
|
userId String
|
|
tokenHash String @unique
|
|
expiresAt DateTime
|
|
createdAt DateTime @default(now())
|
|
|
|
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
}
|
|
|
|
model PasswordResetToken {
|
|
id String @id @default(cuid())
|
|
userId String
|
|
tokenHash String @unique
|
|
expiresAt DateTime
|
|
usedAt DateTime?
|
|
createdAt DateTime @default(now())
|
|
|
|
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
}
|
|
|
|
model ProductType {
|
|
id String @id @default(cuid())
|
|
name String
|
|
slug String @unique
|
|
schema Json
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
products Product[]
|
|
}
|
|
|
|
model Product {
|
|
id String @id @default(cuid())
|
|
typeId String
|
|
title String
|
|
slug String @unique
|
|
description String
|
|
basePrice Int
|
|
currency String @default("EUR")
|
|
status ProductStatus @default(DRAFT)
|
|
attributes Json
|
|
stock Int?
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
type ProductType @relation(fields: [typeId], references: [id])
|
|
variants ProductVariant[]
|
|
categories ProductCategory[]
|
|
images MediaAsset[]
|
|
orderItems OrderItem[]
|
|
reviews Review[]
|
|
}
|
|
|
|
model ProductVariant {
|
|
id String @id @default(cuid())
|
|
productId String
|
|
sku String @unique
|
|
price Int
|
|
stock Int
|
|
attributes Json
|
|
active Boolean @default(true)
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
product Product @relation(fields: [productId], references: [id], onDelete: Cascade)
|
|
}
|
|
|
|
model Category {
|
|
id String @id @default(cuid())
|
|
name String
|
|
slug String @unique
|
|
parentId String?
|
|
createdAt DateTime @default(now())
|
|
|
|
products ProductCategory[]
|
|
}
|
|
|
|
model ProductCategory {
|
|
productId String
|
|
categoryId String
|
|
|
|
product Product @relation(fields: [productId], references: [id], onDelete: Cascade)
|
|
category Category @relation(fields: [categoryId], references: [id], onDelete: Cascade)
|
|
|
|
@@id([productId, categoryId])
|
|
}
|
|
|
|
model MediaAsset {
|
|
id String @id @default(cuid())
|
|
productId String?
|
|
url String
|
|
altText String?
|
|
mimeType String
|
|
size Int
|
|
createdAt DateTime @default(now())
|
|
|
|
product Product? @relation(fields: [productId], references: [id], onDelete: SetNull)
|
|
}
|
|
|
|
model Order {
|
|
id String @id @default(cuid())
|
|
userId String
|
|
status OrderStatus @default(PENDING)
|
|
currency String @default("EUR")
|
|
subtotal Int
|
|
taxTotal Int @default(0)
|
|
shippingTotal Int @default(0)
|
|
grandTotal Int
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
user User @relation(fields: [userId], references: [id])
|
|
items OrderItem[]
|
|
payment Payment?
|
|
}
|
|
|
|
model OrderItem {
|
|
id String @id @default(cuid())
|
|
orderId String
|
|
productId String
|
|
title String
|
|
quantity Int
|
|
unitPrice Int
|
|
totalPrice Int
|
|
metadata Json?
|
|
|
|
order Order @relation(fields: [orderId], references: [id], onDelete: Cascade)
|
|
product Product @relation(fields: [productId], references: [id])
|
|
}
|
|
|
|
model Payment {
|
|
id String @id @default(cuid())
|
|
orderId String @unique
|
|
provider String
|
|
providerPaymentId String? @unique
|
|
status String
|
|
amount Int
|
|
currency String
|
|
rawPayload Json?
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
order Order @relation(fields: [orderId], references: [id], onDelete: Cascade)
|
|
}
|
|
|
|
model Review {
|
|
id String @id @default(cuid())
|
|
userId String
|
|
productId String
|
|
rating Int
|
|
title String?
|
|
comment String?
|
|
status ReviewStatus @default(PENDING)
|
|
verified Boolean @default(false)
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
product Product @relation(fields: [productId], references: [id], onDelete: Cascade)
|
|
|
|
@@unique([userId, productId])
|
|
}
|
|
|
|
model SiteSettings {
|
|
id String @id @default(cuid())
|
|
key String @unique
|
|
value Json
|
|
updatedAt DateTime @updatedAt
|
|
}
|
|
|
|
model Page {
|
|
id String @id @default(cuid())
|
|
slug String @unique
|
|
title String
|
|
seoTitle String?
|
|
seoDesc String?
|
|
published Boolean @default(false)
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
sections PageSection[]
|
|
}
|
|
|
|
model PageSection {
|
|
id String @id @default(cuid())
|
|
pageId String
|
|
type String
|
|
sortOrder Int
|
|
data Json
|
|
visible Boolean @default(true)
|
|
|
|
page Page @relation(fields: [pageId], references: [id], onDelete: Cascade)
|
|
}
|
|
|
|
model AuditLog {
|
|
id String @id @default(cuid())
|
|
userId String?
|
|
action String
|
|
entity String
|
|
entityId String?
|
|
metadata Json?
|
|
createdAt DateTime @default(now())
|
|
}
|