Added better auth. Still fixing issues

This commit is contained in:
Jose Selesan
2026-04-14 14:14:07 -03:00
parent e2299c6d46
commit 9133950d6a
42 changed files with 2453 additions and 1358 deletions

View File

@@ -1,37 +0,0 @@
model Complex {
id String @id @db.Uuid
complexName String @map("complex_name")
physicalAddress String? @map("physical_address") @db.VarChar(200)
city String? @map("city") @db.VarChar(100)
state String? @map("state") @db.VarChar(100)
country String? @map("country") @db.VarChar(100)
complexSlug String @unique @map("complex_slug")
adminEmail String @map("admin_email")
planCode String? @map("plan_code") @db.VarChar(10)
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([planCode])
@@index([complexSlug])
@@map("complexes")
}
enum ComplexUserRole {
ADMIN
}
model ComplexUser {
complexId String @map("complex_id") @db.Uuid
userId String @map("user_id") @db.Uuid
role ComplexUserRole @default(ADMIN)
createdAt DateTime @default(now()) @map("created_at")
complex Complex @relation(fields: [complexId], references: [id], onDelete: Cascade)
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@id([complexId, userId])
@@index([userId])
@@map("complex_users")
}

View File

@@ -1,96 +0,0 @@
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")
}

View File

@@ -1,18 +0,0 @@
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")
}

View File

@@ -1,16 +0,0 @@
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")
}

View File

@@ -1,10 +0,0 @@
model Plan {
code String @id @db.VarChar(10)
name String @db.VarChar(30)
price Decimal @db.Decimal(19, 2)
rules Json
lastUpdatedAt DateTime @default(now()) @map("last_updated_at")
complexes Complex[]
@@map("plans")
}

View File

@@ -6,3 +6,253 @@ generator client {
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")
}

View File

@@ -1,11 +0,0 @@
model User {
id String @id @db.Uuid
supabaseUserId String @unique @map("supabase_user_id") @db.Uuid
email String @unique
fullName String @map("full_name")
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
complexes ComplexUser[]
@@map("users")
}