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 }