203 lines
5.1 KiB
Plaintext
203 lines
5.1 KiB
Plaintext
generator client {
|
|
provider = "prisma-client-js"
|
|
}
|
|
|
|
datasource db {
|
|
provider = "postgresql"
|
|
url = env("DATABASE_URL")
|
|
}
|
|
|
|
enum Role {
|
|
ADMIN
|
|
USER
|
|
}
|
|
|
|
enum RegistrationStatus {
|
|
CONFIRMED
|
|
PAYMENT_PENDING
|
|
PAID
|
|
CANCELLED
|
|
}
|
|
|
|
enum WebinarVisibility {
|
|
PUBLIC
|
|
PRIVATE
|
|
}
|
|
|
|
// BetterAuth User model
|
|
model User {
|
|
id String @id @default(cuid())
|
|
name String?
|
|
email String @unique
|
|
emailVerified Boolean @default(false)
|
|
image String?
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
// Custom fields
|
|
role Role @default(USER)
|
|
firstName String?
|
|
lastName String?
|
|
gender String?
|
|
dob DateTime?
|
|
address String?
|
|
forcePasswordReset Boolean @default(false)
|
|
isActive Boolean @default(true)
|
|
|
|
// BetterAuth relations
|
|
accounts Account[]
|
|
credential Credential?
|
|
sessions Session[]
|
|
verifications Verification[]
|
|
|
|
// Custom relations
|
|
registrations WebinarRegistration[]
|
|
contactMessages ContactMessage[] @relation("messageAuthor")
|
|
}
|
|
|
|
// BetterAuth Account model (OAuth and email/password accounts)
|
|
// Note: For email/password, credentials are stored differently by BetterAuth
|
|
model Account {
|
|
id String @id @default(cuid())
|
|
userId String
|
|
type String @default("oauth")
|
|
provider String
|
|
providerAccountId String
|
|
refreshToken String?
|
|
accessToken String?
|
|
expiresAt Int?
|
|
tokenType String?
|
|
scope String?
|
|
idToken String?
|
|
sessionState String?
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
|
|
@@unique([provider, providerAccountId])
|
|
@@index([userId])
|
|
}
|
|
|
|
// Credential table for email/password authentication
|
|
model Credential {
|
|
id String @id @default(cuid())
|
|
userId String @unique
|
|
password String
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
|
|
@@index([userId])
|
|
}
|
|
|
|
// BetterAuth Session model
|
|
model Session {
|
|
id String @id @default(cuid())
|
|
sessionToken String @unique
|
|
userId String
|
|
expires DateTime
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
|
|
@@index([userId])
|
|
}
|
|
|
|
// BetterAuth Verification model
|
|
model Verification {
|
|
id String @id @default(cuid())
|
|
identifier String
|
|
value String
|
|
expiresAt DateTime
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
user User? @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
userId String?
|
|
|
|
@@unique([identifier, value])
|
|
@@index([userId])
|
|
}
|
|
|
|
model SystemConfig {
|
|
id Int @id
|
|
data Json @default("{}")
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
}
|
|
|
|
model AppSetup {
|
|
id Int @id
|
|
googleAuthEnabled Boolean @default(false)
|
|
googleClientId String?
|
|
googleClientSecret String?
|
|
socials Json @default("{}")
|
|
categories Json @default("[]")
|
|
paginationItemsPerPage Int @default(10)
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
}
|
|
|
|
model Webinar {
|
|
id String @id @default(uuid())
|
|
title String
|
|
description String
|
|
speaker String
|
|
startAt DateTime
|
|
duration Int
|
|
bannerUrl String?
|
|
category String
|
|
visibility WebinarVisibility @default(PUBLIC)
|
|
isActive Boolean @default(true)
|
|
capacity Int
|
|
priceCents Int @default(0)
|
|
meetingInfo Json @default("{}")
|
|
learningPoints Json @default("[]")
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
registrations WebinarRegistration[]
|
|
|
|
@@index([visibility])
|
|
@@index([isActive])
|
|
}
|
|
|
|
model WebinarRegistration {
|
|
id String @id @default(uuid())
|
|
userId String
|
|
webinarId String
|
|
status RegistrationStatus @default(CONFIRMED)
|
|
stripeCheckoutSessionId String?
|
|
stripePaymentIntentId String?
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
user User @relation(fields: [userId], references: [id])
|
|
webinar Webinar @relation(fields: [webinarId], references: [id])
|
|
|
|
@@unique([userId, webinarId])
|
|
@@index([userId])
|
|
@@index([webinarId])
|
|
}
|
|
|
|
model ContactMessage {
|
|
id String @id @default(uuid())
|
|
name String
|
|
email String
|
|
subject String
|
|
message String
|
|
status String @default("NEW") // NEW, READ, REPLIED
|
|
adminNote String?
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
authorId String?
|
|
|
|
author User? @relation("messageAuthor", fields: [authorId], references: [id])
|
|
|
|
@@index([status])
|
|
@@index([createdAt])
|
|
}
|