259 lines
8.8 KiB
Plaintext
259 lines
8.8 KiB
Plaintext
generator client {
|
|
provider = "prisma-client"
|
|
output = "../src/generated/prisma"
|
|
}
|
|
|
|
datasource db {
|
|
provider = "postgresql"
|
|
}
|
|
|
|
// ============== APP MODELS (existing) ==============
|
|
|
|
model Plan {
|
|
code String @id @map("code") @db.VarChar(10)
|
|
name String @db.VarChar(30)
|
|
price Decimal @map("price") @db.Decimal(19, 2)
|
|
rules Json @map("rules")
|
|
lastUpdatedAt DateTime @default(now()) @map("last_updated_at")
|
|
complexes Complex[]
|
|
|
|
@@map("plans")
|
|
}
|
|
|
|
model Complex {
|
|
id String @id @db.Uuid
|
|
complexSlug String @unique @map("complex_slug")
|
|
complexName String @map("complex_name")
|
|
physicalAddress String @map("physical_address")
|
|
city String?
|
|
state String?
|
|
country String?
|
|
adminEmail String @map("admin_email")
|
|
planCode String @map("plan_code")
|
|
isActive Boolean @default(true) @map("is_active")
|
|
createdAt DateTime @default(now()) @map("created_at")
|
|
updatedAt DateTime @updatedAt @map("updated_at")
|
|
plan Plan @relation(fields: [planCode], references: [code])
|
|
users ComplexUser[]
|
|
courts Court[]
|
|
|
|
@@index([adminEmail])
|
|
@@map("complexes")
|
|
}
|
|
|
|
model ComplexUser {
|
|
id String @id @default(cuid()) @map("id")
|
|
complexId String @map("complex_id") @db.Uuid
|
|
userId String @map("user_id")
|
|
role ComplexUserRole
|
|
createdAt DateTime @default(now()) @map("created_at")
|
|
updatedAt DateTime @updatedAt @map("updated_at")
|
|
complex Complex @relation(fields: [complexId], references: [id], onDelete: Cascade)
|
|
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
|
|
@@unique([complexId, userId])
|
|
@@map("complex_users")
|
|
}
|
|
|
|
enum ComplexUserRole {
|
|
ADMIN
|
|
MANAGER
|
|
USER
|
|
}
|
|
|
|
enum DayOfWeek {
|
|
MONDAY
|
|
TUESDAY
|
|
WEDNESDAY
|
|
THURSDAY
|
|
FRIDAY
|
|
SATURDAY
|
|
SUNDAY
|
|
}
|
|
|
|
enum CourtBookingStatus {
|
|
CONFIRMED
|
|
CANCELLED
|
|
COMPLETED
|
|
}
|
|
|
|
model Sport {
|
|
id String @id @db.Uuid
|
|
name String @unique
|
|
slug String @unique
|
|
isActive Boolean @default(true) @map("is_active")
|
|
createdAt DateTime @default(now()) @map("created_at")
|
|
updatedAt DateTime @updatedAt @map("updated_at")
|
|
courts Court[]
|
|
|
|
@@map("sports")
|
|
}
|
|
|
|
model Court {
|
|
id String @id @db.Uuid
|
|
complexId String @map("complex_id") @db.Uuid
|
|
sportId String @map("sport_id") @db.Uuid
|
|
name String
|
|
slotDurationMinutes Int @map("slot_duration_minutes")
|
|
basePrice Decimal @map("base_price") @db.Decimal(19, 2)
|
|
createdAt DateTime @default(now()) @map("created_at")
|
|
updatedAt DateTime @updatedAt @map("updated_at")
|
|
complex Complex @relation(fields: [complexId], references: [id], onDelete: Cascade)
|
|
sport Sport @relation(fields: [sportId], references: [id])
|
|
availabilities CourtAvailability[]
|
|
priceRules CourtPriceRule[]
|
|
bookings CourtBooking[]
|
|
|
|
@@index([complexId])
|
|
@@index([sportId])
|
|
@@map("courts")
|
|
}
|
|
|
|
model CourtAvailability {
|
|
id String @id @db.Uuid
|
|
courtId String @map("court_id") @db.Uuid
|
|
dayOfWeek DayOfWeek @map("day_of_week")
|
|
startTime String @map("start_time") @db.VarChar(5)
|
|
endTime String @map("end_time") @db.VarChar(5)
|
|
createdAt DateTime @default(now()) @map("created_at")
|
|
court Court @relation(fields: [courtId], references: [id], onDelete: Cascade)
|
|
|
|
@@index([courtId, dayOfWeek])
|
|
@@map("court_availabilities")
|
|
}
|
|
|
|
model CourtPriceRule {
|
|
id String @id @db.Uuid
|
|
courtId String @map("court_id") @db.Uuid
|
|
dayOfWeek DayOfWeek? @map("day_of_week")
|
|
startTime String? @map("start_time") @db.VarChar(5)
|
|
endTime String? @map("end_time") @db.VarChar(5)
|
|
price Decimal @db.Decimal(19, 2)
|
|
isActive Boolean @default(true) @map("is_active")
|
|
createdAt DateTime @default(now()) @map("created_at")
|
|
updatedAt DateTime @updatedAt @map("updated_at")
|
|
court Court @relation(fields: [courtId], references: [id], onDelete: Cascade)
|
|
|
|
@@index([courtId, isActive])
|
|
@@map("court_price_rules")
|
|
}
|
|
|
|
model CourtBooking {
|
|
id String @id @db.Uuid
|
|
bookingCode String @unique @map("booking_code") @db.VarChar(8)
|
|
courtId String @map("court_id") @db.Uuid
|
|
bookingDate DateTime @map("booking_date") @db.Date
|
|
startTime String @map("start_time") @db.VarChar(5)
|
|
endTime String @map("end_time") @db.VarChar(5)
|
|
customerName String @map("customer_name") @db.VarChar(120)
|
|
customerPhone String @map("customer_phone") @db.VarChar(30)
|
|
status CourtBookingStatus @default(CONFIRMED)
|
|
createdAt DateTime @default(now()) @map("created_at")
|
|
updatedAt DateTime @updatedAt @map("updated_at")
|
|
court Court @relation(fields: [courtId], references: [id], onDelete: Cascade)
|
|
|
|
@@unique([courtId, bookingDate, startTime])
|
|
@@index([courtId, bookingDate])
|
|
@@index([bookingDate])
|
|
@@map("court_bookings")
|
|
}
|
|
|
|
model OnboardingRequest {
|
|
id String @id @db.Uuid
|
|
fullName String @map("full_name")
|
|
email String
|
|
otpHash String @map("otp_hash")
|
|
otpExpiresAt DateTime @map("otp_expires_at")
|
|
otpAttempts Int @default(0) @map("otp_attempts")
|
|
otpLastSentAt DateTime @map("otp_last_sent_at")
|
|
otpResendCount Int @default(0) @map("otp_resend_count")
|
|
emailVerifiedAt DateTime? @map("email_verified_at")
|
|
completedAt DateTime? @map("completed_at")
|
|
createdAt DateTime @default(now()) @map("created_at")
|
|
updatedAt DateTime @updatedAt @map("updated_at")
|
|
|
|
@@index([email])
|
|
@@index([otpExpiresAt])
|
|
@@map("onboarding_requests")
|
|
}
|
|
|
|
model PasswordResetRequest {
|
|
id String @id @db.Uuid
|
|
email String
|
|
otpHash String @map("otp_hash")
|
|
otpExpiresAt DateTime @map("otp_expires_at")
|
|
otpAttempts Int @default(0) @map("otp_attempts")
|
|
otpLastSentAt DateTime @map("otp_last_sent_at")
|
|
otpResendCount Int @default(0) @map("otp_resend_count")
|
|
usedAt DateTime? @map("used_at")
|
|
createdAt DateTime @default(now()) @map("created_at")
|
|
updatedAt DateTime @updatedAt @map("updated_at")
|
|
|
|
@@index([email])
|
|
@@index([otpExpiresAt])
|
|
@@map("password_reset_requests")
|
|
}
|
|
|
|
// ============== BETTER AUTH MODELS ==============
|
|
|
|
model User {
|
|
id String @id @default(cuid()) @map("id")
|
|
supabaseUserId String? @unique @map("supabase_user_id") @db.Uuid
|
|
name String?
|
|
email String @unique
|
|
emailVerified Boolean @default(false)
|
|
image String?
|
|
fullName String? @map("full_name")
|
|
createdAt DateTime @default(now()) @map("created_at")
|
|
updatedAt DateTime @updatedAt @map("updated_at")
|
|
accounts Account[]
|
|
sessions Session[]
|
|
complexes ComplexUser[]
|
|
|
|
@@map("users")
|
|
}
|
|
|
|
model Session {
|
|
id String @id @default(cuid()) @map("id")
|
|
userId String @map("user_id")
|
|
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
token String @unique
|
|
expiresAt DateTime @map("expires_at")
|
|
ipAddress String? @map("ip_address")
|
|
userAgent String? @map("user_agent")
|
|
createdAt DateTime @default(now()) @map("created_at")
|
|
updatedAt DateTime @updatedAt @map("updated_at")
|
|
|
|
@@map("session")
|
|
}
|
|
|
|
model Account {
|
|
id String @id @default(cuid()) @map("id")
|
|
userId String @map("user_id")
|
|
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
accountId String @map("account_id")
|
|
providerId String @map("provider_id")
|
|
accessToken String? @map("access_token")
|
|
refreshToken String? @map("refresh_token")
|
|
accessTokenExpiresAt DateTime? @map("access_token_expires_at")
|
|
refreshTokenExpiresAt DateTime? @map("refresh_token_expires_at")
|
|
scope String? @map("scope")
|
|
idToken String? @map("id_token")
|
|
password String? @map("password")
|
|
createdAt DateTime @default(now()) @map("created_at")
|
|
updatedAt DateTime @updatedAt @map("updated_at")
|
|
|
|
@@map("account")
|
|
}
|
|
|
|
model Verification {
|
|
id String @id @default(cuid()) @map("id")
|
|
identifier String
|
|
value String
|
|
expiresAt DateTime @map("expires_at")
|
|
createdAt DateTime @default(now()) @map("created_at")
|
|
updatedAt DateTime @updatedAt @map("updated_at")
|
|
|
|
@@map("verification")
|
|
}
|