Commit 7462cf19 authored by wycers's avatar wycers
Browse files

schema

parent 05206c48
Loading
Loading
Loading
Loading

prisma/schema.prisma

0 → 100644
+454 −0
Original line number Diff line number Diff line
generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "mysql"
  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[]

  provider LuciaUserType @default(sustech_cloud)

  user   User   @relation(references: [id], fields: [userId])
  userId Int    @unique
}

model LuciaSession {
  id        String    @id
  userId    String
  expiresAt DateTime
  user      LuciaUser @relation(references: [id], fields: [userId], onDelete: Cascade)
}

enum LuciaUserType {
  sustech_cloud
}

model User {
  id        Int      @id @default(autoincrement())
  createdAt DateTime @default(now())

  email String @unique
  posts Post[]

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

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

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

model Semester {
  id     Int    @id @default(autoincrement())
  year   Int
  season Season

  classes Class[]

  @@unique([year, season])
}

enum Season {
  SPRING
  SUMMER
  FALL
  WINTER
}

model Course {
  id   Int    @id @default(autoincrement())
  code String @unique

  name        String
  description String

  classes Class[]
}

model Class {
  id Int @id @default(autoincrement())

  name String

  semester   Semester @relation(fields: [semesterId], references: [id])
  semesterId Int

  course   Course @relation(fields: [courseId], references: [id])
  courseId Int

  pendingStudentList Json

  users       ClassesOnUsers[]
  assignments Assignment[]
}

model ClassesOnUsers {
  class   Class @relation(fields: [classId], references: [id])
  classId Int
  user    User  @relation(fields: [userId], references: [id])
  userId  Int

  status ClassUserStatus
  role   UserClassRole

  @@id([classId, userId])
}

enum ClassUserStatus {
  OWNER

  APPLIED
  APPROVED
  DENIED

  INVITED
  QUIT
  REMOVED
}

enum UserClassRole {
  LECTURER
  TEACHER
  ASSISTANT
  STUDENT
}

model File {
  id        String   @id
  size      Int
  createdAt DateTime @default(now())

  filename String
  storage  Storage
}

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

enum StorageType {
  QINIU
  SUSTECH_MIRROR
}

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

  title       String    @unique()
  description String
  publishedAt DateTime?

  startTime DateTime?
  endTime   DateTime?

  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

  title String
  description String
}

model Answer {
  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

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

  start       DateTime
  end         DateTime
  description String

  submissions Submission[]
}

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

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

  submitter   User @relation(fields: [submitterId], references: [id])
  submitterId Int

  files File[]

  feedback SubmissionFeedback?
}

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

  scorer  User @relation(fields: [scoreId], references: [id])
  scoreId Int

  submission Submission
}

model Record {

}


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

  creator   User @relation(fields: [creatorId], references: [id])
  creatorId Int  @unique

  startTime DateTime?
  endTime   DateTime?
}
+1 −3
Original line number Diff line number Diff line
import { redirect } from '@sveltejs/kit';
import { redirect, type RequestEvent } from '@sveltejs/kit';
import { generateCodeVerifier, generateState } from 'oslo/oauth2';

import type { RequestEvent } from '@sveltejs/kit';
import oauth2Client from '$lib/server/auth/sustech-cloud';

export async function GET(event: RequestEvent): Promise<Response> {