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]) }