datasource db { provider = "postgresql" url = env("DATABASE_URL") } generator client { provider = "prisma-client-js" } enum Role { SUPER_ADMIN INSTRUCTOR CLIENT } enum MediaStatus { PROCESSING READY } enum BookingStatus { CONFIRMED CANCELLED ATTENDED } model Tenant { id String @id @default(cuid()) name String slug String @unique domain String? @unique createdAt DateTime @default(now()) updatedAt DateTime @updatedAt users User[] classSessions ClassSession[] bookings Booking[] mediaAssets MediaAsset[] eWaivers EWaiver[] @@map("tenants") } model User { id String @id @default(cuid()) tenantId String email String name String? role Role @default(CLIENT) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade) bookings Booking[] eWaivers EWaiver[] @@unique([tenantId, email]) @@index([tenantId]) @@map("users") } model ClassSession { id String @id @default(cuid()) tenantId String title String description String? startTime DateTime endTime DateTime capacity Int jitsiRoomId String createdAt DateTime @default(now()) updatedAt DateTime @updatedAt tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade) bookings Booking[] @@index([tenantId]) @@map("class_sessions") } model Booking { id String @id @default(cuid()) tenantId String userId String classSessionId String status BookingStatus @default(CONFIRMED) signedWaiverAt DateTime? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade) user User @relation(fields: [userId], references: [id], onDelete: Cascade) classSession ClassSession @relation(fields: [classSessionId], references: [id], onDelete: Cascade) @@unique([userId, classSessionId]) @@index([tenantId]) @@index([userId]) @@index([classSessionId]) @@map("bookings") } model MediaAsset { id String @id @default(cuid()) tenantId String title String s3Key String status MediaStatus @default(PROCESSING) rawUrl String? transcodedUrl String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade) @@index([tenantId]) @@map("media_assets") } model EWaiver { id String @id @default(cuid()) tenantId String userId String parqStatus String signedAt DateTime @default(now()) ipAddress String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade) user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@index([tenantId]) @@index([userId]) @@map("e_waivers") }