Skip to content
Snippets Groups Projects
schema.prisma 3.44 KiB
generator client {
    provider = "prisma-client-js"
}

datasource db {
    provider = "mysql"
    url      = env("DATABASE_URL")
}

enum UserRole {
    STUDENT
    TEACHING_STAFF
    ADMIN
}

enum TagType {
    LANGUAGE
    FRAMEWORK
    THEME
    USERDEFINED
}

model User {
    id             Int       @id /// The user's id is the same as their gitlab id
    name           String?
    mail           String?   @unique
    role           UserRole? @default(STUDENT)
    gitlabUsername String    @unique
    gitlabLastInfo Json      @default("{}") @db.Json
    deleted        Boolean   @default(false)

    assignments Assignment[]
    exercises   Exercise[]
}

model Assignment {
    name               String   @id
    secret             String   @unique @db.Char(36)
    gitlabId           Int
    gitlabLink         String
    gitlabCreationInfo Json     @db.Json
    gitlabCreationDate DateTime
    gitlabLastInfo     Json     @db.Json
    gitlabLastInfoDate DateTime
    published          Boolean  @default(false)
    language           Language @default(other)

    useSonar          Boolean  @default(false)
    allowSonarFailure Boolean  @default(true)
    sonarKey          String?
    sonarCreationInfo Json?    @db.Json
    sonarGate         String?
    sonarProfiles     Json?    @db.Json

    exercises Exercise[]
    staff     User[]
    tags      Tag[]
}

model Exercise {
    id                 String   @id @db.Char(36)
    assignmentName     String
    name               String
    secret             String   @unique @db.Char(36)
    gitlabId           Int
    gitlabLink         String
    gitlabCreationInfo Json     @db.Json
    gitlabCreationDate DateTime
    gitlabLastInfo     Json     @db.Json
    gitlabLastInfoDate DateTime
    deleted            Boolean  @default(false)

    sonarKey          String?
    sonarCreationInfo Json?   @db.Json

    correctionCommit      Json?   @db.Json
    correctionDescription String? @db.VarChar(80)

    assignment Assignment @relation(fields: [assignmentName], references: [name], onDelete: NoAction, onUpdate: Cascade)

    members User[]
    results Result[]
    tags    Tag[]
}

model Result {
    exerciseId     String   @db.Char(36)
    dateTime       DateTime @default(now())
    success        Boolean
    sonarGatePass  Boolean?
    exitCode       Int
    commit         Json     @db.Json
    results        Json     @db.Json
    files          Json     @db.Json

    exercise Exercise @relation(fields: [exerciseId], references: [id], onDelete: Cascade, onUpdate: Cascade)

    @@id([exerciseId, dateTime])
}

model Tag {
    name String  @id @db.Char(36)
    type TagType

    assignments Assignment[]
    exercises   Exercise[]
}

model TagProposal {
    name    String  @id @db.Char(36)
    type    TagType
    state   String  @default("PendingApproval")
    details String?
}

enum Language {
    abap
    ada
    asm
    bash
    bqn
    c
    caml
    cloudformation
    cpp
    csharp
    css
    cuda
    dart
    delphi
    docker
    erlang
    f
    fsharp
    flex
    fortran
    futhark
    go
    groovy
    haskell
    hepial
    json
    jsp
    java
    js
    julia
    kotlin
    kubernetes
    latex
    lisp
    lua
    matlab
    objc
    ocaml
    pascal
    pearl
    perl
    php
    postscript
    powershell
    prolog
    promela
    python
    r
    ruby
    rust
    scala
    sql
    smalltalk
    swift
    terraform
    text
    ts
    tsql
    typst
    vba
    vbnet
    web
    xml
    yaml

    other
}