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]) }