136 lines
3.5 KiB
Plaintext
136 lines
3.5 KiB
Plaintext
generator client {
|
|
provider = "prisma-client-js"
|
|
}
|
|
|
|
datasource db {
|
|
provider = "postgresql"
|
|
url = env("DATABASE_URL")
|
|
}
|
|
|
|
enum Role {
|
|
LEARNER
|
|
INSTRUCTOR
|
|
ADMIN
|
|
}
|
|
|
|
enum BillingInterval {
|
|
NONE
|
|
MONTH
|
|
QUARTER
|
|
YEAR
|
|
}
|
|
|
|
model User {
|
|
id String @id @default(cuid())
|
|
email String @unique
|
|
passwordHash String
|
|
name String
|
|
role Role @default(LEARNER)
|
|
createdAt DateTime @default(now())
|
|
enrollments Enrollment[]
|
|
progress LessonProgress[]
|
|
certificates Certificate[]
|
|
}
|
|
|
|
model Category {
|
|
id String @id @default(cuid())
|
|
slug String @unique
|
|
name String
|
|
courses CourseCategory[]
|
|
}
|
|
|
|
model Course {
|
|
id String @id @default(cuid())
|
|
slug String @unique
|
|
title String
|
|
description String @default("")
|
|
thumbnailUrl String?
|
|
published Boolean @default(false)
|
|
priceCents Int @default(0)
|
|
currency String @default("EUR")
|
|
billingInterval BillingInterval @default(NONE)
|
|
ratingAverage Float @default(0)
|
|
ratingCount Int @default(0)
|
|
authorId String
|
|
authorName String
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
modules CourseModule[]
|
|
enrollments Enrollment[]
|
|
categories CourseCategory[]
|
|
certificates Certificate[]
|
|
}
|
|
|
|
model LandingPage {
|
|
id String @id
|
|
content Json
|
|
updatedAt DateTime @updatedAt
|
|
}
|
|
|
|
model Certificate {
|
|
id String @id @default(cuid())
|
|
code String @unique
|
|
userId String
|
|
courseId String
|
|
issuedAt DateTime @default(now())
|
|
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
course Course @relation(fields: [courseId], references: [id], onDelete: Cascade)
|
|
|
|
@@unique([userId, courseId])
|
|
}
|
|
|
|
model CourseCategory {
|
|
courseId String
|
|
categoryId String
|
|
course Course @relation(fields: [courseId], references: [id], onDelete: Cascade)
|
|
category Category @relation(fields: [categoryId], references: [id], onDelete: Cascade)
|
|
|
|
@@id([courseId, categoryId])
|
|
}
|
|
|
|
model CourseModule {
|
|
id String @id @default(cuid())
|
|
courseId String
|
|
course Course @relation(fields: [courseId], references: [id], onDelete: Cascade)
|
|
title String
|
|
sortOrder Int @default(0)
|
|
lessons Lesson[]
|
|
}
|
|
|
|
model Lesson {
|
|
id String @id @default(cuid())
|
|
moduleId String
|
|
module CourseModule @relation(fields: [moduleId], references: [id], onDelete: Cascade)
|
|
slug String
|
|
title String
|
|
contentHtml String @default("")
|
|
videoUrl String?
|
|
sortOrder Int @default(0)
|
|
published Boolean @default(true)
|
|
progress LessonProgress[]
|
|
|
|
@@unique([moduleId, slug])
|
|
}
|
|
|
|
model Enrollment {
|
|
id String @id @default(cuid())
|
|
userId String
|
|
courseId String
|
|
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
course Course @relation(fields: [courseId], references: [id], onDelete: Cascade)
|
|
createdAt DateTime @default(now())
|
|
|
|
@@unique([userId, courseId])
|
|
}
|
|
|
|
model LessonProgress {
|
|
id String @id @default(cuid())
|
|
userId String
|
|
lessonId String
|
|
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
lesson Lesson @relation(fields: [lessonId], references: [id], onDelete: Cascade)
|
|
completedAt DateTime?
|
|
|
|
@@unique([userId, lessonId])
|
|
}
|