mirror of
https://github.com/nicetry247/offlineacademy.git
synced 2026-07-26 11:58:44 +00:00
213 lines
5.6 KiB
Plaintext
Executable File
213 lines
5.6 KiB
Plaintext
Executable File
// Prisma Schema for OfflineU2
|
|
// Models: Course, Module, Lesson, Progress
|
|
|
|
generator client {
|
|
provider = "prisma-client-js"
|
|
}
|
|
|
|
datasource db {
|
|
provider = "sqlite"
|
|
url = env("DATABASE_URL")
|
|
}
|
|
|
|
model Course {
|
|
id String @id @default(cuid())
|
|
name String
|
|
displayName String?
|
|
slug String @unique
|
|
path String @unique
|
|
thumbnail String?
|
|
description String?
|
|
hidden Boolean @default(false)
|
|
favorited Boolean @default(false)
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
modules Module[]
|
|
progress Progress[]
|
|
bookmarks Bookmark[]
|
|
courseTags CourseTag[]
|
|
tags Tag[] @relation("CourseTags")
|
|
|
|
@@index([slug])
|
|
@@index([path])
|
|
@@index([favorited])
|
|
}
|
|
|
|
model Module {
|
|
id String @id @default(cuid())
|
|
name String
|
|
slug String
|
|
order Int @default(0)
|
|
courseId String
|
|
course Course @relation(fields: [courseId], references: [id], onDelete: Cascade)
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
lessons Lesson[]
|
|
progress Progress[]
|
|
bookmarks Bookmark[]
|
|
|
|
@@unique([courseId, slug])
|
|
@@index([courseId, order])
|
|
}
|
|
|
|
model Lesson {
|
|
id String @id @default(cuid())
|
|
title String
|
|
slug String
|
|
order Int @default(0)
|
|
moduleId String
|
|
module Module @relation(fields: [moduleId], references: [id], onDelete: Cascade)
|
|
filePath String
|
|
fileName String
|
|
mimeType String
|
|
duration Int?
|
|
thumbnail String?
|
|
type String @default("VIDEO")
|
|
subtitlePath String?
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
progress Progress[]
|
|
bookmarks Bookmark[]
|
|
subtitles SubtitleTrack[]
|
|
quiz Quiz?
|
|
quizAttempts QuizAttempt[]
|
|
|
|
@@unique([moduleId, slug])
|
|
@@index([moduleId, order])
|
|
@@index([filePath])
|
|
}
|
|
|
|
model SubtitleTrack {
|
|
id String @id @default(cuid())
|
|
lessonId String
|
|
lesson Lesson @relation(fields: [lessonId], references: [id], onDelete: Cascade)
|
|
src String
|
|
lang String
|
|
label String
|
|
format String
|
|
isDefault Boolean @default(false)
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
@@unique([lessonId, lang, src])
|
|
@@index([lessonId])
|
|
}
|
|
|
|
model Progress {
|
|
id String @id @default(cuid())
|
|
userId String @default("local-user")
|
|
courseId String
|
|
course Course @relation(fields: [courseId], references: [id], onDelete: Cascade)
|
|
moduleId String?
|
|
module Module? @relation(fields: [moduleId], references: [id], onDelete: Cascade)
|
|
lessonId String?
|
|
lesson Lesson? @relation(fields: [lessonId], references: [id], onDelete: Cascade)
|
|
completed Boolean @default(false)
|
|
position Int @default(0)
|
|
lastWatched DateTime @default(now())
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
@@unique([userId, lessonId])
|
|
@@index([userId, courseId])
|
|
@@index([userId, lastWatched])
|
|
}
|
|
|
|
model QuizAttempt {
|
|
id String @id @default(cuid())
|
|
userId String @default("local-user")
|
|
lessonId String?
|
|
lesson Lesson? @relation(fields: [lessonId], references: [id], onDelete: Cascade)
|
|
score Int @default(0)
|
|
passed Boolean @default(false)
|
|
completed Boolean @default(false)
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
@@unique([userId, lessonId])
|
|
@@index([userId, lessonId])
|
|
}
|
|
|
|
model Quiz {
|
|
id String @id @default(cuid())
|
|
title String
|
|
description String?
|
|
lessonId String? @unique
|
|
lesson Lesson? @relation(fields: [lessonId], references: [id], onDelete: Cascade)
|
|
source String?
|
|
topic String?
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
questions Question[]
|
|
|
|
@@index([lessonId])
|
|
}
|
|
|
|
model Question {
|
|
id String @id @default(cuid())
|
|
quizId String
|
|
quiz Quiz @relation(fields: [quizId], references: [id], onDelete: Cascade)
|
|
type String
|
|
text String
|
|
options String?
|
|
correctAnswer String?
|
|
order Int @default(0)
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
@@index([quizId])
|
|
}
|
|
|
|
model Bookmark {
|
|
id String @id @default(cuid())
|
|
userId String @default("local-user")
|
|
courseId String
|
|
course Course @relation(fields: [courseId], references: [id], onDelete: Cascade)
|
|
moduleId String
|
|
module Module @relation(fields: [moduleId], references: [id], onDelete: Cascade)
|
|
lessonId String
|
|
lesson Lesson @relation(fields: [lessonId], references: [id], onDelete: Cascade)
|
|
position Int
|
|
note String?
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
@@index([userId, lessonId])
|
|
@@index([userId, courseId])
|
|
@@index([userId, createdAt])
|
|
}
|
|
|
|
model Setting {
|
|
id String @id @default(cuid())
|
|
key String @unique
|
|
value String
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
}
|
|
|
|
model Tag {
|
|
id String @id @default(cuid())
|
|
name String @unique
|
|
color String?
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
courseTags CourseTag[]
|
|
courses Course[] @relation("CourseTags")
|
|
}
|
|
|
|
model CourseTag {
|
|
courseId String
|
|
tagId String
|
|
course Course @relation(fields: [courseId], references: [id], onDelete: Cascade)
|
|
tag Tag @relation(fields: [tagId], references: [id], onDelete: Cascade)
|
|
|
|
@@id([courseId, tagId])
|
|
@@index([tagId])
|
|
@@index([courseId])
|
|
}
|