first commit
This commit is contained in:
434
prisma/schema.prisma
Normal file
434
prisma/schema.prisma
Normal file
@@ -0,0 +1,434 @@
|
||||
generator client {
|
||||
provider = "prisma-client-js"
|
||||
}
|
||||
|
||||
datasource db {
|
||||
provider = "postgresql"
|
||||
url = env("DATABASE_URL")
|
||||
}
|
||||
|
||||
model Account {
|
||||
id String @id @default(cuid())
|
||||
userId String
|
||||
type String
|
||||
provider String
|
||||
providerAccountId String
|
||||
refresh_token String? @db.Text
|
||||
access_token String? @db.Text
|
||||
expires_at Int?
|
||||
token_type String?
|
||||
scope String?
|
||||
id_token String? @db.Text
|
||||
session_state String?
|
||||
|
||||
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
||||
|
||||
@@unique([provider, providerAccountId])
|
||||
}
|
||||
|
||||
model Session {
|
||||
id String @id @default(cuid())
|
||||
sessionToken String @unique
|
||||
userId String
|
||||
expires DateTime
|
||||
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
||||
}
|
||||
|
||||
model User {
|
||||
id String @id @default(cuid())
|
||||
name String?
|
||||
email String @unique
|
||||
emailVerified DateTime?
|
||||
image String?
|
||||
password String?
|
||||
role Role @default(CUSTOMER)
|
||||
referralCode String @unique @default(cuid())
|
||||
referrerId String?
|
||||
phone String?
|
||||
address String?
|
||||
joinedAt DateTime @default(now())
|
||||
isActive Boolean @default(true)
|
||||
currentRankId String?
|
||||
|
||||
// Partner-specific fields
|
||||
partnerTier String? // 'Diamond', 'Gold', 'Silver'
|
||||
minReferrals Int @default(3) // Minimum members a partner needs to add
|
||||
|
||||
accounts Account[]
|
||||
sessions Session[]
|
||||
|
||||
// Referral relationships
|
||||
referrer User? @relation("UserReferrals", fields: [referrerId], references: [id])
|
||||
referrals User[] @relation("UserReferrals")
|
||||
|
||||
// Orders and transactions
|
||||
orders Order[]
|
||||
commissions Commission[] @relation("UserCommissions")
|
||||
commissionsFrom Commission[] @relation("UserCommissionsFrom")
|
||||
payouts Payout[]
|
||||
wallet Wallet?
|
||||
|
||||
// Address management
|
||||
addresses Address[]
|
||||
|
||||
// Rank system
|
||||
currentRank Rank? @relation(fields: [currentRankId], references: [id])
|
||||
rankAchievements RankAchievement[]
|
||||
|
||||
// Form responses
|
||||
formResponses FormResponse[]
|
||||
|
||||
// Reviews and feedback
|
||||
reviews Review[]
|
||||
reviewHelpfulVotes ReviewHelpfulVote[]
|
||||
reviewReports ReviewReport[]
|
||||
|
||||
@@map("users")
|
||||
}
|
||||
|
||||
model VerificationToken {
|
||||
identifier String
|
||||
token String @unique
|
||||
expires DateTime
|
||||
|
||||
@@unique([identifier, token])
|
||||
}
|
||||
|
||||
model Category {
|
||||
id String @id @default(cuid())
|
||||
name String @unique
|
||||
description String?
|
||||
image String?
|
||||
isActive Boolean @default(true)
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
products Product[]
|
||||
|
||||
@@index([isActive])
|
||||
@@index([name])
|
||||
@@map("categories")
|
||||
}
|
||||
|
||||
model Product {
|
||||
id String @id @default(cuid())
|
||||
name String
|
||||
description String?
|
||||
price Float
|
||||
discount Float @default(0)
|
||||
images String[]
|
||||
stock Int @default(0)
|
||||
manageStock Boolean @default(true)
|
||||
sku String @unique
|
||||
slug String @unique
|
||||
isActive Boolean @default(true)
|
||||
categoryId String
|
||||
brand String?
|
||||
origin String?
|
||||
weight String?
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
category Category @relation(fields: [categoryId], references: [id])
|
||||
orderItems OrderItem[]
|
||||
reviews Review[]
|
||||
|
||||
@@index([isActive])
|
||||
@@index([categoryId])
|
||||
@@index([createdAt])
|
||||
@@index([isActive, stock])
|
||||
@@index([categoryId, isActive])
|
||||
@@index([createdAt, isActive])
|
||||
@@index([isActive, createdAt(sort: Desc)])
|
||||
@@index([isActive, createdAt(sort: Desc), categoryId])
|
||||
@@map("products")
|
||||
}
|
||||
|
||||
model Order {
|
||||
id String @id @default(cuid())
|
||||
userId String
|
||||
total Float
|
||||
status OrderStatus @default(PENDING)
|
||||
razorpayOrderId String?
|
||||
razorpayPaymentId String?
|
||||
shippingAddressId String?
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
user User @relation(fields: [userId], references: [id])
|
||||
orderItems OrderItem[]
|
||||
shippingAddress Address? @relation(fields: [shippingAddressId], references: [id])
|
||||
|
||||
@@map("orders")
|
||||
}
|
||||
|
||||
model OrderItem {
|
||||
id String @id @default(cuid())
|
||||
orderId String
|
||||
productId String
|
||||
quantity Int
|
||||
price Float
|
||||
|
||||
order Order @relation(fields: [orderId], references: [id])
|
||||
product Product @relation(fields: [productId], references: [id])
|
||||
|
||||
@@map("order_items")
|
||||
}
|
||||
|
||||
model Commission {
|
||||
id String @id @default(cuid())
|
||||
userId String
|
||||
fromUserId String
|
||||
orderId String
|
||||
amount Float
|
||||
level Int
|
||||
type CommissionType @default(REFERRAL)
|
||||
status CommissionStatus @default(PENDING)
|
||||
createdAt DateTime @default(now())
|
||||
|
||||
user User @relation("UserCommissions", fields: [userId], references: [id])
|
||||
fromUser User @relation("UserCommissionsFrom", fields: [fromUserId], references: [id])
|
||||
|
||||
@@map("commissions")
|
||||
}
|
||||
|
||||
model Wallet {
|
||||
id String @id @default(cuid())
|
||||
userId String @unique
|
||||
balance Float @default(0)
|
||||
totalEarnings Float @default(0)
|
||||
totalWithdrawn Float @default(0)
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
user User @relation(fields: [userId], references: [id])
|
||||
|
||||
@@map("wallets")
|
||||
}
|
||||
|
||||
model Payout {
|
||||
id String @id @default(cuid())
|
||||
userId String
|
||||
amount Float
|
||||
status PayoutStatus @default(PENDING)
|
||||
bankDetails String?
|
||||
adminNotes String?
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
user User @relation(fields: [userId], references: [id])
|
||||
|
||||
@@map("payouts")
|
||||
}
|
||||
|
||||
model CommissionSettings {
|
||||
id String @id @default(cuid())
|
||||
level Int @unique
|
||||
percentage Float
|
||||
isActive Boolean @default(true)
|
||||
|
||||
@@map("commission_settings")
|
||||
}
|
||||
|
||||
model Address {
|
||||
id String @id @default(cuid())
|
||||
userId String
|
||||
firstName String
|
||||
lastName String
|
||||
company String?
|
||||
address1 String
|
||||
address2 String?
|
||||
city String
|
||||
state String
|
||||
zipCode String
|
||||
country String @default("India")
|
||||
phone String?
|
||||
isDefault Boolean @default(false)
|
||||
type AddressType @default(HOME)
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
||||
orders Order[]
|
||||
|
||||
@@map("addresses")
|
||||
}
|
||||
|
||||
model SystemSettings {
|
||||
id String @id @default(cuid())
|
||||
siteName String @default("Padmaaja Rasooi")
|
||||
siteDescription String @default("Premium quality rice products and grains. Experience the finest rice sourced directly from local farmers.")
|
||||
supportEmail String @default("info@padmajarice.com")
|
||||
minimumPayout Float @default(1000)
|
||||
enableReferrals Boolean @default(true)
|
||||
enableCommissions Boolean @default(true)
|
||||
maintenanceMode Boolean @default(false)
|
||||
allowRegistration Boolean @default(true)
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
@@map("system_settings")
|
||||
}
|
||||
|
||||
model Rank {
|
||||
id String @id @default(cuid())
|
||||
name String @unique
|
||||
description String?
|
||||
minReferrals Int @default(0)
|
||||
minSalesVolume Float @default(0)
|
||||
minTeamVolume Float @default(0)
|
||||
commissionMultiplier Float @default(1.0)
|
||||
benefits String[]
|
||||
color String @default("#3B82F6")
|
||||
icon String @default("🏆")
|
||||
order Int @unique
|
||||
isActive Boolean @default(true)
|
||||
createdAt DateTime @default(now())
|
||||
|
||||
users User[]
|
||||
achievements RankAchievement[]
|
||||
|
||||
@@map("ranks")
|
||||
}
|
||||
|
||||
model RankAchievement {
|
||||
id String @id @default(cuid())
|
||||
userId String
|
||||
rankId String
|
||||
achievedAt DateTime @default(now())
|
||||
|
||||
user User @relation(fields: [userId], references: [id])
|
||||
rank Rank @relation(fields: [rankId], references: [id])
|
||||
|
||||
@@unique([userId, rankId])
|
||||
@@map("rank_achievements")
|
||||
}
|
||||
|
||||
enum Role {
|
||||
ADMIN
|
||||
MEMBER // For Partners
|
||||
WHOLESALER // For Wholesale customers
|
||||
PART_TIME // For those who want part-time job opportunities
|
||||
CUSTOMER // Regular customers
|
||||
}
|
||||
|
||||
enum OrderStatus {
|
||||
PENDING
|
||||
PAID
|
||||
SHIPPED
|
||||
DELIVERED
|
||||
CANCELLED
|
||||
}
|
||||
|
||||
enum CommissionType {
|
||||
REFERRAL
|
||||
LEVEL
|
||||
BONUS
|
||||
}
|
||||
|
||||
enum CommissionStatus {
|
||||
PENDING
|
||||
APPROVED
|
||||
PAID
|
||||
CANCELLED
|
||||
}
|
||||
|
||||
enum PayoutStatus {
|
||||
PENDING
|
||||
APPROVED
|
||||
REJECTED
|
||||
PAID
|
||||
}
|
||||
|
||||
enum AddressType {
|
||||
HOME
|
||||
WORK
|
||||
OTHER
|
||||
}
|
||||
|
||||
model FormResponse {
|
||||
id String @id @default(cuid())
|
||||
formId String // e.g., "contact", "partnership", "bulk_inquiry"
|
||||
data Json @db.JsonB // Actual form submission data
|
||||
status String @default("new")
|
||||
metadata Json? @db.JsonB // Additional metadata like IP, user agent
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
userId String? // Optional relation to user if logged in
|
||||
|
||||
user User? @relation(fields: [userId], references: [id])
|
||||
|
||||
@@index([status])
|
||||
@@index([userId])
|
||||
@@index([formId])
|
||||
@@map("form_responses")
|
||||
}
|
||||
|
||||
model Review {
|
||||
id String @id @default(cuid())
|
||||
productId String
|
||||
userId String
|
||||
rating Int @default(5) // 1-5 stars
|
||||
title String?
|
||||
comment String?
|
||||
images String[] @default([])
|
||||
isVerified Boolean @default(false) // Verified purchase
|
||||
isApproved Boolean @default(false) // Admin approval
|
||||
helpfulVotes Int @default(0)
|
||||
reportCount Int @default(0)
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
product Product @relation(fields: [productId], references: [id], onDelete: Cascade)
|
||||
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
||||
|
||||
// Relations for helpful votes and reports
|
||||
helpfulVotedBy ReviewHelpfulVote[]
|
||||
reportedBy ReviewReport[]
|
||||
|
||||
@@unique([productId, userId]) // One review per user per product
|
||||
@@index([productId])
|
||||
@@index([userId])
|
||||
@@index([rating])
|
||||
@@index([isApproved])
|
||||
@@index([createdAt])
|
||||
@@index([productId, isApproved])
|
||||
@@index([createdAt, isApproved])
|
||||
@@index([isApproved, createdAt(sort: Desc)])
|
||||
@@index([isApproved, createdAt(sort: Desc), productId])
|
||||
@@map("reviews")
|
||||
}
|
||||
|
||||
model ReviewHelpfulVote {
|
||||
id String @id @default(cuid())
|
||||
reviewId String
|
||||
userId String
|
||||
|
||||
review Review @relation(fields: [reviewId], references: [id], onDelete: Cascade)
|
||||
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
||||
|
||||
@@unique([reviewId, userId])
|
||||
@@map("review_helpful_votes")
|
||||
}
|
||||
|
||||
model ReviewReport {
|
||||
id String @id @default(cuid())
|
||||
reviewId String
|
||||
userId String
|
||||
reason ReportReason
|
||||
comment String?
|
||||
createdAt DateTime @default(now())
|
||||
|
||||
review Review @relation(fields: [reviewId], references: [id], onDelete: Cascade)
|
||||
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
||||
|
||||
@@unique([reviewId, userId])
|
||||
@@map("review_reports")
|
||||
}
|
||||
|
||||
enum ReportReason {
|
||||
SPAM
|
||||
INAPPROPRIATE
|
||||
FAKE
|
||||
OFFENSIVE
|
||||
OTHER
|
||||
}
|
||||
Reference in New Issue
Block a user