135 lines
3.2 KiB
Plaintext
135 lines
3.2 KiB
Plaintext
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")
|
|
} |