judge4c-db/prisma/schema.prisma

166 lines
4.8 KiB
Plaintext

datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
generator client {
provider = "prisma-client-js"
}
enum UserRole {
ADMIN
TEACHER
STUDENT
GUEST
}
model User {
id String @id @default(cuid())
email String @unique @db.VarChar(255)
displayName String? @db.VarChar(255)
hashedPassword String @default("")
passwordSalt String @default("")
role UserRole @default(GUEST)
createdAt DateTime @default(now()) @db.Timestamptz
updatedAt DateTime @updatedAt @db.Timestamptz
organizedEvents Event[] @relation("OrganizedEvents")
participatedEvents Event[] @relation("ParticipatedEvents")
createdQuestions Question[] @relation("CreatedQuestions")
submissions Submission[]
}
enum EventType {
COMPETITION
EXAM
HOMEWORK
}
model Event {
id String @id @default(cuid())
name String
startTime DateTime @db.Timestamptz
endTime DateTime @db.Timestamptz
isVisible Boolean @default(true)
type EventType @default(COMPETITION)
createdAt DateTime @default(now()) @db.Timestamptz
updatedAt DateTime @updatedAt @db.Timestamptz
organizer User[] @relation("OrganizedEvents")
participants User[] @relation("ParticipatedEvents")
eventQuestions EventQuestion[]
}
enum QuestionDifficulty {
EASY
MEDIUM
HARD
}
model Question {
id String @id @default(cuid())
name String
statement String @db.Text
difficulty QuestionDifficulty @default(EASY)
createdAt DateTime @default(now()) @db.Timestamptz
updatedAt DateTime @updatedAt @db.Timestamptz
creators User[] @relation("CreatedQuestions")
codeTemplates CodeTemplate[]
eventQuestions EventQuestion[]
tags QuestionTag[] @relation("QuestionTags")
}
model QuestionTag {
id String @id @default(cuid())
name String
createdAt DateTime @default(now()) @db.Timestamptz
updatedAt DateTime @updatedAt @db.Timestamptz
questions Question[] @relation("QuestionTags")
}
enum CodeLanguage {
C
CPP
JAVA
}
model CodeTemplate {
id String @id @default(cuid())
language CodeLanguage
starterCode String @db.Text
correctSolution String @default("") @db.Text
createdAt DateTime @default(now()) @db.Timestamptz
updatedAt DateTime @updatedAt @db.Timestamptz
question Question @relation(fields: [questionId], references: [id])
questionId String
}
model EventQuestion {
id String @id @default(cuid())
event Event @relation(fields: [eventId], references: [id])
eventId String
question Question @relation(fields: [questionId], references: [id])
questionId String
displayOrder Int @default(0)
hidden Boolean @default(false)
createdAt DateTime @default(now()) @db.Timestamptz
updatedAt DateTime @updatedAt @db.Timestamptz
submissions Submission[]
@@unique([eventId, questionId])
}
enum SubmissionStatus {
PENDING
ACCEPTED
REJECTED
COMPILATION_ERROR
RUNTIME_ERROR
INTERNAL_ERROR
PARTIAL_ACCEPTED
SKIPPED
}
model Submission {
id String @id @default(cuid())
submitter User @relation(fields: [submitterId], references: [id])
submitterId String @db.VarChar(255)
eventQuestion EventQuestion @relation(fields: [eventQuestionId], references: [id])
eventQuestionId String @db.VarChar(255)
language CodeLanguage
code String @db.Text
status SubmissionStatus
statusMessage String?
memoryUsage Int?
executionTime Int?
score Int? @default(0)
createdAt DateTime @default(now()) @db.Timestamptz
updatedAt DateTime @updatedAt @db.Timestamptz
testResults TestResult[]
}
enum TestResultStatus {
ACCEPTED
REJECTED
TIMEOUT
MEMORY_LIMIT_EXCEEDED
COMPILATION_ERROR
RUNTIME_ERROR
INTERNAL_ERROR
OUTPUT_MISMATCH
SKIPPED
}
model TestResult {
id String @id @default(cuid())
submission Submission @relation(fields: [submissionId], references: [id])
submissionId String
input String @db.Text
output String @db.Text
status TestResultStatus
statusMessage String?
memoryUsage Int?
executionTime Int?
score Int? @default(0)
createdAt DateTime @default(now()) @db.Timestamptz
updatedAt DateTime @updatedAt @db.Timestamptz
}