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")
  embedTitle    String?
  embedColor    String    @default("#2f3136")
  embedSiteName String?   @default("{image.file} • {user.name}")
  ratelimit     DateTime?
  domains       String[]
  oauth         OAuth[]
  images        Image[]
  urls          Url[]
  Invite        Invite[]
}

enum ImageFormat {
  UUID
  DATE
  RANDOM
  NAME
}

model Image {
  id         Int             @id @default(autoincrement())
  file       String
  mimetype   String          @default("image/png")
  created_at DateTime        @default(now())
  expires_at DateTime?
  maxViews   Int?
  views      Int             @default(0)
  favorite   Boolean         @default(false)
  embed      Boolean         @default(false)
  password   String?
  invisible  InvisibleImage?
  format     ImageFormat     @default(RANDOM)
  user       User?            @relation(fields: [userId], references: [id], onDelete: SetNull)
  userId     Int?
}

model InvisibleImage {
  id      Int    @id @default(autoincrement())
  invis   String @unique
  imageId Int    @unique
  image   Image  @relation(fields: [imageId], references: [id])
}

model Url {
  id          String        @id @unique
  destination String
  vanity      String?
  created_at  DateTime      @default(now())
  maxViews    Int?
  views       Int           @default(0)
  invisible   InvisibleUrl?
  user        User          @relation(fields: [userId], references: [id])
  userId      Int
}

model InvisibleUrl {
  id    Int    @id @default(autoincrement())
  invis String @unique
  urlId String @unique
  url   Url    @relation(fields: [urlId], references: [id])
}

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

model Invite {
  id          Int       @id @default(autoincrement())
  code        String    @unique
  created_at  DateTime  @default(now())
  expires_at  DateTime?
  used        Boolean   @default(false)
  createdBy   User      @relation(fields: [createdById], references: [id])
  createdById Int
}

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

enum OauthProviders {
  DISCORD
  GITHUB
  GOOGLE
}
