Initial commit: FL-Akademie LMS mit Docker, Admin, Portal und Dokumentation.
Made-with: Cursor
This commit is contained in:
135
prisma/schema.prisma
Normal file
135
prisma/schema.prisma
Normal file
@@ -0,0 +1,135 @@
|
||||
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])
|
||||
}
|
||||
Reference in New Issue
Block a user