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

generator client {
  provider = "prisma-client-js"
}

model User {
  id            Int       @id @default(autoincrement())
  username      String
  password      String?
  avatar        String?
  token         String
  administrator Boolean   @default(false)
  superAdmin    Boolean   @default(false)
  systemTheme   String    @default("system")
  embed         Json      @default("{}")
  ratelimit     DateTime?
  totpSecret    String?
  domains       String[]
  oauth         OAuth[]
  files         File[]
  urls          Url[]
  Invite        Invite[]
  Folder        Folder[]
}

model Folder {
  id        Int      @id @default(autoincrement())
  name      String
  public    Boolean  @default(false)
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt

  user   User @relation(fields: [userId], references: [id], onDelete: Cascade)
  userId Int

  files File[]
}

model File {
  id           Int            @id @default(autoincrement())
  name         String
  originalName String?
  mimetype     String         @default("image/png")
  createdAt    DateTime       @default(now())
  size         Int            @default(0)
  expiresAt    DateTime?
  maxViews     Int?
  views        Int            @default(0)
  favorite     Boolean        @default(false)
  embed        Boolean        @default(false)
  password     String?
  invisible    InvisibleFile?

  user   User? @relation(fields: [userId], references: [id], onDelete: SetNull)
  userId Int?

  folder   Folder? @relation(fields: [folderId], references: [id], onDelete: SetNull)
  folderId Int?
}

model InvisibleFile {
  id    Int    @id @default(autoincrement())
  invis String @unique

  fileId Int  @unique
  file   File @relation(fields: [fileId], references: [id], onDelete: Cascade)
}

model Url {
  id          String        @id @unique
  destination String
  vanity      String?
  createdAt   DateTime      @default(now())
  maxViews    Int?
  views       Int           @default(0)
  invisible   InvisibleUrl?

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

model InvisibleUrl {
  id    Int    @id @default(autoincrement())
  invis String @unique

  urlId String @unique
  url   Url    @relation(fields: [urlId], references: [id], onDelete: Cascade)
}

model Stats {
  id        Int      @id @default(autoincrement())
  createdAt DateTime @default(now())
  data      Json
}

model Invite {
  id        Int       @id @default(autoincrement())
  code      String    @unique
  createdAt DateTime  @default(now())
  expiresAt DateTime?
  used      Boolean   @default(false)

  createdBy   User @relation(fields: [createdById], references: [id], onDelete: Cascade)
  createdById Int
}

model OAuth {
  id       Int            @id @default(autoincrement())
  provider OauthProviders
  user     User           @relation(fields: [userId], references: [id], onDelete: Cascade)
  userId   Int
  username String
  oauthId  String?
  token    String
  refresh  String?

  @@unique([provider, oauthId])
}

enum OauthProviders {
  DISCORD
  GITHUB
  GOOGLE
}
