Commit c44e9a68 authored by wycer's avatar wycer
Browse files

schema

parent 7462cf19
Loading
Loading
Loading
Loading
+65 −272
Original line number Diff line number Diff line
@@ -7,215 +7,6 @@ datasource db {
  url      = env("DATABASE_URL")
}

model answer {
  id                             Int                          @id @default(autoincrement()) @db.UnsignedInt
  uuid                           String                       @db.VarChar(255)
  assignment_entry_submission_id Int?                         @db.UnsignedInt
  problem_id                     Int                          @db.UnsignedInt
  content                        String?                      @db.Text
  language                       String?                      @db.Text
  attachment_id                  Int?                         @unique(map: "answer_attachment_id_unique") @db.UnsignedInt
  points                         Int?
  record_id                      Int?                         @unique(map: "answer_record_id_unique") @db.UnsignedInt
  submitter_id                   Int                          @db.UnsignedInt
  is_valid                       Boolean?
  assignment_entry_submission    assignment_entry_submission? @relation(fields: [assignment_entry_submission_id], references: [id], map: "answer_assignment_entry_submission_id_foreign")
  file                           file?                        @relation(fields: [attachment_id], references: [id], map: "answer_attachment_id_foreign")
  problem                        problem                      @relation(fields: [problem_id], references: [id], onDelete: NoAction, map: "answer_problem_id_foreign")
  ioj_record                     ioj_record?                  @relation(fields: [record_id], references: [id], map: "answer_record_id_foreign")
  user                           user                         @relation(fields: [submitter_id], references: [id], onDelete: NoAction, map: "answer_submitter_id_foreign")
  answer_feedback                answer_feedback?
  answer_files                   answer_files[]

  @@index([assignment_entry_submission_id], map: "answer_assignment_entry_submission_id_index")
  @@index([problem_id], map: "answer_problem_id_index")
  @@index([submitter_id], map: "answer_submitter_id_index")
}

model answer_feedback {
  id                                      Int                                  @id @default(autoincrement()) @db.UnsignedInt
  answer_id                               Int                                  @unique(map: "answer_feedback_answer_id_unique") @db.UnsignedInt
  assignment_entry_submission_feedback_id Int                                  @db.UnsignedInt
  content                                 String?                              @db.Text
  attachment_id                           Int?                                 @unique(map: "answer_feedback_attachment_id_unique") @db.UnsignedInt
  points                                  Int?
  answer                                  answer                               @relation(fields: [answer_id], references: [id], onDelete: NoAction, map: "answer_feedback_answer_id_foreign")
  assignment_entry_submission_feedback    assignment_entry_submission_feedback @relation(fields: [assignment_entry_submission_feedback_id], references: [id], onDelete: NoAction, map: "answer_feedback_assignment_entry_submission_feedback_id_foreign")
  file                                    file?                                @relation(fields: [attachment_id], references: [id], map: "answer_feedback_attachment_id_foreign")

  @@index([assignment_entry_submission_feedback_id], map: "answer_feedback_assignment_entry_submission_feedback_id_index")
}

model answer_files {
  answer_id Int    @db.UnsignedInt
  file_id   Int    @db.UnsignedInt
  answer    answer @relation(fields: [answer_id], references: [id], onDelete: Cascade, map: "answer_files_answer_id_foreign")
  file      file   @relation(fields: [file_id], references: [id], onDelete: Cascade, map: "answer_files_file_id_foreign")

  @@id([answer_id, file_id])
  @@index([answer_id], map: "answer_files_answer_id_index")
  @@index([file_id], map: "answer_files_file_id_index")
}

model assignment {
  id                  Int                   @id @default(autoincrement()) @db.UnsignedInt
  name                String                @db.VarChar(255)
  description         String                @db.Text
  points              Int
  title               String                @db.VarChar(255)
  class_id            Int                   @db.UnsignedInt
  start               DateTime              @default(now()) @db.DateTime(0)
  end                 DateTime              @default(now()) @db.DateTime(0)
  public              Boolean?              @default(true)
  Renamedclass        Renamedclass          @relation(fields: [class_id], references: [id], onDelete: NoAction, map: "assignment_class_id_foreign")
  assignment_assignee assignment_assignee[]
  assignment_entry    assignment_entry[]

  @@index([class_id], map: "assignment_class_id_index")
  @@index([name], map: "assignment_name_index")
}

model assignment_assignee {
  id            Int        @id @default(autoincrement()) @db.UnsignedInt
  assignment_id Int        @db.UnsignedInt
  start         DateTime?  @db.DateTime(0)
  end           DateTime?  @db.DateTime(0)
  to_evenyone   Boolean?
  assignment    assignment @relation(fields: [assignment_id], references: [id], onDelete: NoAction, map: "assignment_assignee_assignment_id_foreign")

  @@index([assignment_id], map: "assignment_assignee_assignment_id_index")
}

model assignment_entry {
  id                          Int                           @id @default(autoincrement()) @db.UnsignedInt
  assignment_id               Int                           @db.UnsignedInt
  uuid                        String                        @db.VarChar(255)
  title                       String                        @db.VarChar(255)
  proportion                  Int?
  penalty                     Int?
  penalty_after               Int?
  assignment                  assignment                    @relation(fields: [assignment_id], references: [id], onDelete: NoAction, map: "assignment_entry_assignment_id_foreign")
  assignment_entry_metric     assignment_entry_metric[]
  assignment_entry_note       assignment_entry_note[]
  assignment_entry_submission assignment_entry_submission[]
  problem                     problem[]

  @@index([assignment_id], map: "assignment_entry_assignment_id_index")
}

model assignment_entry_metric {
  id               Int               @id @default(autoincrement()) @db.UnsignedInt
  uuid             String            @db.VarChar(255)
  entry_id         Int?              @db.UnsignedInt
  title            String            @db.VarChar(255)
  description      String            @db.VarChar(255)
  max              Float             @db.Float
  assignment_entry assignment_entry? @relation(fields: [entry_id], references: [id], map: "assignment_entry_metric_entry_id_foreign")

  @@index([entry_id], map: "assignment_entry_metric_entry_id_index")
}

model assignment_entry_note {
  id               Int               @id @default(autoincrement()) @db.UnsignedInt
  entry_id         Int?              @db.UnsignedInt
  uuid             String            @db.VarChar(255)
  submitter_id     Int               @db.UnsignedInt
  submitted_at     DateTime          @db.DateTime(0)
  text             String            @db.Text
  assignment_entry assignment_entry? @relation(fields: [entry_id], references: [id], map: "assignment_entry_note_entry_id_foreign")
  user             user              @relation(fields: [submitter_id], references: [id], onDelete: NoAction, map: "assignment_entry_note_submitter_id_foreign")

  @@index([entry_id], map: "assignment_entry_note_entry_id_index")
  @@index([submitter_id], map: "assignment_entry_note_submitter_id_index")
}

model assignment_entry_submission {
  id                                                  Int                                   @id @default(autoincrement()) @db.UnsignedInt
  created_at                                          DateTime                              @db.DateTime(0)
  content                                             String?                               @db.Text
  attachment_id                                       Int?                                  @unique(map: "assignment_entry_submission_attachment_id_unique") @db.UnsignedInt
  points                                              Int?
  feedback_id                                         Int?                                  @unique(map: "assignment_entry_submission_feedback_id_unique") @db.UnsignedInt
  penalty_score                                       Int?
  final_score                                         Int?
  scorer_id                                           Int?                                  @db.UnsignedInt
  scored_at                                           DateTime?                             @db.DateTime(0)
  metrics                                             Json?
  comment                                             String?                               @db.VarChar(255)
  answer                                              answer[]
  file                                                file?                                 @relation(fields: [attachment_id], references: [id], map: "assignment_entry_submission_attachment_id_foreign")
  assignment_entry                                    assignment_entry                      @relation(fields: [entry_id], references: [id], onDelete: NoAction, map: "assignment_entry_submission_entry_id_foreign")
  assignment_entry_submission_feedback                assignment_entry_submission_feedback? @relation(fields: [feedback_id], references: [id], map: "assignment_entry_submission_feedback_id_foreign")
  user_assignment_entry_submission_scorer_idTouser    user?                                 @relation("assignment_entry_submission_scorer_idTouser", fields: [scorer_id], references: [id], map: "assignment_entry_submission_scorer_id_foreign")
  user_assignment_entry_submission_submitter_idTouser user                                  @relation("assignment_entry_submission_submitter_idTouser", fields: [submitter_id], references: [id], onDelete: NoAction, map: "assignment_entry_submission_submitter_id_foreign")
}

model assignment_entry_submission_feedback {
  id                          Int                          @id @default(autoincrement()) @db.UnsignedInt
  created_at                  DateTime                     @db.DateTime(0)
  submitter_id                Int                          @db.UnsignedInt
  answer_feedback             answer_feedback[]
  assignment_entry_submission assignment_entry_submission?
  user                        user                         @relation(fields: [submitter_id], references: [id], onDelete: NoAction, map: "assignment_entry_submission_feedback_submitter_id_foreign")

  @@index([submitter_id], map: "assignment_entry_submission_feedback_submitter_id_index")
}

model ioj_record {
  id      Int     @id @default(autoincrement()) @db.UnsignedInt
  name    String  @db.VarChar(255)
  inputs  Json?
  outputs Json?
  program String  @db.VarChar(255)
  answer  answer?
}

model oauth2credential {
  id            Int      @id @default(autoincrement()) @db.UnsignedInt
  created_at    DateTime @db.DateTime(0)
  updated_at    DateTime @db.DateTime(0)
  issuer        Int      @db.TinyInt
  sub           String   @db.VarChar(255)
  access_token  String   @db.VarChar(255)
  refresh_token String?  @db.VarChar(255)
  user_id       Int      @db.UnsignedInt
  user          user     @relation(fields: [user_id], references: [id], onDelete: NoAction, map: "oauth2credential_user_id_foreign")

  @@index([user_id], map: "oauth2credential_user_id_index")
}

model problem {
  id                  Int               @id @default(autoincrement()) @db.UnsignedInt
  assignment_entry_id Int?              @db.UnsignedInt
  type                problem_type
  judgement_args      Json?
  points              Int
  uuid                String            @db.VarChar(255)
  submitter_id        Int               @db.UnsignedInt
  answers_of          String?           @db.VarChar(255)
  answer              answer[]
  assignment_entry    assignment_entry? @relation(fields: [assignment_entry_id], references: [id], map: "problem_assignment_entry_id_foreign")
}

model user {
  id         Int      @id @default(autoincrement()) @db.UnsignedInt
  email      String   @db.VarChar(255)
  bio        String   @default("") @db.VarChar(255)
  image      String   @default("") @db.VarChar(255)
  created_at DateTime @db.DateTime(0)
  updated_at DateTime @db.DateTime(0)
  sid        String   @db.VarChar(255)
  name       String   @db.VarChar(255)

  answer                                                                     answer[]
  assignment_entry_note                                                      assignment_entry_note[]
  assignment_entry_submission_assignment_entry_submission_scorer_idTouser    assignment_entry_submission[]          @relation("assignment_entry_submission_scorer_idTouser")
  assignment_entry_submission_assignment_entry_submission_submitter_idTouser assignment_entry_submission[]          @relation("assignment_entry_submission_submitter_idTouser")
  assignment_entry_submission_feedback                                       assignment_entry_submission_feedback[]
  oauth2credential                                                           oauth2credential[]
  problem                                                                    problem[]
}

model LuciaUser {
  id       String         @id
  sessions LuciaSession[]
@@ -240,28 +31,21 @@ enum LuciaUserType {
model User {
  id        Int      @id @default(autoincrement())
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt()

  email     String @unique
  posts Post[]
  studentId Int?
  bio       String @default("")
  image     String @default("")

  nickname  String
  sustechId Int    @unique
  luciaUser   LuciaUser? @relation(fields: [luciaUserId], references: [id])
  luciaUserId String? @unique

  classes            ClassesOnUsers[]
  submissions        Submission[]
  answers     Answer[]
  Task        Task[]
}
  SubmissionFeedback SubmissionFeedback[]

model Post {
  id        Int     @id @default(autoincrement())
  title     String
  content   String?
  published Boolean @default(false)
  author    User    @relation(fields: [authorId], references: [id])
  authorId  Int
  luciaUser LuciaUser?
}

model Semester {
@@ -345,12 +129,16 @@ model File {
  createdAt DateTime @default(now())

  filename     String
  storage  Storage
  storage      Storage     @relation(fields: [storageKey], references: [key])
  storageKey   String
  Submission   Submission? @relation(fields: [submissionId], references: [id])
  submissionId Int?
}

model Storage {
  key  String      @id
  type StorageType @default(QINIU)
  File File[]
}

enum StorageType {
@@ -363,6 +151,8 @@ model Assignment {
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt

  name String

  title       String    @unique()
  description String
  publishedAt DateTime?
@@ -373,39 +163,30 @@ model Assignment {
  class   Class @relation(fields: [classId], references: [id])
  classId Int

  entries Entry[]
}

model Problem {
  id        Int      @id @default(autoincrement())
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
  entries AssignmentEntry[]

  title String
  description String
  @@unique([classId, name])
}

model Answer {
model AssignmentEntry {
  id        Int      @id @default(autoincrement())
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt

  author   User @relation(fields: [authorId], references: [id])
  authorId Int
}

model Entry {
  id        Int      @id @default(autoincrement())
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
  name  String
  index Int

  assignment   Assignment @relation(fields: [assignmentId], references: [id])
  assignmentId Int

  penalty      Int?
  penaltyAfter Int?

  title         String
  start         DateTime
  end           DateTime
  description   String

  judgementArgs Json?
  submissions   Submission[]
}

@@ -414,7 +195,9 @@ model Submission {
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt

  entry   Entry @relation(fields: [entryId], references: [id])
  name String

  entry   AssignmentEntry @relation(fields: [entryId], references: [id])
  entryId Int

  submitter   User @relation(fields: [submitterId], references: [id])
@@ -422,6 +205,7 @@ model Submission {

  files File[]

  // feedback
  feedback SubmissionFeedback?
}

@@ -429,26 +213,35 @@ model SubmissionFeedback {
  id         Int       @id @default(autoincrement())
  createdAt  DateTime  @default(now())
  updatedAt  DateTime  @updatedAt
  releasedAt DateTime?

  scorer  User @relation(fields: [scoreId], references: [id])
  scoreId Int
  judgement   Judgement? @relation(fields: [judgementId], references: [id])
  judgementId Int?       @unique
  isValid     Boolean    @default(true)

  submission Submission
}
  scorer  User? @relation(fields: [scoreId], references: [id])
  scoreId Int?

model Record {
  score       Int
  description String

  submission   Submission @relation(fields: [submissionId], references: [id])
  submissionId Int        @unique
}


model Task {
model Judgement {
  id       Int                 @id @default(autoincrement())
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt

  creator   User @relation(fields: [creatorId], references: [id])
  creatorId Int  @unique
  status   JudgementStatus
  program  String
  inputs   Json
  outputs  Json
  feedback SubmissionFeedback?
}

  startTime DateTime?
  endTime   DateTime?
enum JudgementStatus {
  PENDING
  INQUEUE
  JUDGING
  COMPLETED
  CANCLED
}