Files

207 lines
5.0 KiB
Plaintext

generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
enum UserRole {
User
Admin
Agent
superAdmin
}
enum OrderStatus {
pending
confirmed
preparing
shipped
delivered
cancelled
}
enum RepresentationStatus {
pending
active
rejected
}
enum ReviewStatus {
pending
approved
rejected
}
enum SmsOtpPurpose {
register
login
resetPassword
}
model User {
id String @id @default(cuid())
firstName String
lastName String
cellNumber String @unique
passwordHash String
city String @default("")
role UserRole @default(User)
disabled Boolean @default(false)
ordersCount Int @default(0)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
refreshTokens RefreshToken[]
orders Order[]
reviews Review[]
callRequests CallRequest[]
representations Representation[]
@@index([role])
@@index([disabled])
}
model RefreshToken {
id String @id @default(cuid())
tokenHash String
userId String
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
expiresAt DateTime
createdAt DateTime @default(now())
@@index([userId])
@@index([tokenHash])
}
model SmsOtp {
id String @id @default(cuid())
cellNumber String
purpose SmsOtpPurpose
codeHash String
payload Json?
attempts Int @default(0)
expiresAt DateTime
createdAt DateTime @default(now())
@@index([cellNumber, purpose])
@@index([expiresAt])
}
model Product {
id String @id @default(cuid())
nameFa String
nameEn String @default("")
price Int @default(0)
stock Int @default(0)
category String @default("")
imageUrl String?
imageKey String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
orderItems OrderItem[]
@@index([category])
@@index([price])
}
model Order {
id Int @id @default(autoincrement())
customerId String?
customer User? @relation(fields: [customerId], references: [id], onDelete: SetNull)
customerName String
customerPhone String
status OrderStatus @default(pending)
itemCount Int @default(0)
note String @default("")
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
items OrderItem[]
@@index([customerId])
@@index([status])
@@index([createdAt])
}
model OrderItem {
id String @id @default(cuid())
orderId Int
order Order @relation(fields: [orderId], references: [id], onDelete: Cascade)
productId String?
product Product? @relation(fields: [productId], references: [id], onDelete: SetNull)
nameFa String
quantity Int @default(1)
unitPrice Int @default(0)
@@index([orderId])
@@index([productId])
}
model BlogPost {
id String @id @default(cuid())
title String
summary String @default("")
body String @default("")
author String @default("")
imageUrl String?
imageKey String?
published Boolean @default(true)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model Representation {
id String @id @default(cuid())
userId String?
user User? @relation(fields: [userId], references: [id], onDelete: SetNull)
name String
owner String @default("")
firstName String @default("")
lastName String @default("")
nationalCode String @default("")
mobile String
province String @default("")
city String
landline String @default("")
address String @default("")
postalCode String @default("")
description String @default("")
status RepresentationStatus @default(pending)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@index([status])
@@index([userId])
}
model Review {
id String @id @default(cuid())
authorId String?
authorUser User? @relation(fields: [authorId], references: [id], onDelete: SetNull)
author String
product String
rating Int
body String @default("")
status ReviewStatus @default(pending)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@index([status])
}
model CallRequest {
id String @id @default(cuid())
userId String?
user User? @relation(fields: [userId], references: [id], onDelete: SetNull)
name String
mobile String
note String @default("")
handled Boolean @default(false)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@index([handled])
@@index([createdAt])
}