Skip to content
schema.prisma 2.76 KiB
Newer Older
Grant's avatar
Grant committed
// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

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

Grant's avatar
Grant committed
generator dbml {
  provider = "prisma-dbml-generator"
}

Grant's avatar
Grant committed
datasource db {
  provider = "postgresql"
Grant's avatar
Grant committed
  url      = env("DATABASE_URL")
}

model User {
Grant's avatar
Grant committed
  sub           String    @id
  lastPixelTime DateTime  @default(now()) // the time the last pixel was placed at
  pixelStack    Int       @default(0) // amount of pixels stacked for this user
  undoExpires   DateTime? // when the undo for the most recent pixel expires at
Grant's avatar
Grant committed

Grant's avatar
Grant committed
  pixels        Pixel[]
  FactionMember FactionMember[]
Grant's avatar
Grant committed
}

model PaletteColor {
Grant's avatar
Grant committed
  id   Int    @id @default(autoincrement())
  name String
  hex  String @unique

  pixels Pixel[]
}

model Pixel {
  id     Int    @id @default(autoincrement())
  userId String
  x      Int
  y      Int
  color  String

  createdAt DateTime @default(now())

  user    User         @relation(fields: [userId], references: [sub])
  pallete PaletteColor @relation(fields: [color], references: [hex])
Grant's avatar
Grant committed
}
Grant's avatar
Grant committed

model Faction {
  id    String  @id @default(uuid())
  name  String
  image String?

  FactionMember  FactionMember[]
  FactionRole    FactionRole[]
  FactionSocial  FactionSocial[]
  FactionSetting FactionSetting[]
}

// people can be apart of multiple factions at once
model FactionMember {
  id        Int    @id @default(autoincrement())
  sub       String
  factionId String

  user    User    @relation(fields: [sub], references: [sub])
  faction Faction @relation(fields: [factionId], references: [id])
}

// future proofing maybe: different roles for the same faction
// factions by default should have LEADER, MODERATOR, MEMBER
model FactionRole {
  id        String @id @default(uuid())
  name      String
  level     Int // permission level (similar to matrix [0 = member, 100 = leader])
  factionId String

  faction Faction @relation(fields: [factionId], references: [id])
}

model FactionSocial {
  id        String  @id @default(uuid())
  factionId String
  title     String? // display name for the link
  url       String // [!] rel=nofollow [!]
  position  Int

  faction Faction @relation(fields: [factionId], references: [id])
}

model FactionSetting {
  id        String @id @default(uuid())
  factionId String
  key       String
  value     String

  definition FactionSettingDefinition @relation(fields: [key], references: [id])
  faction    Faction                  @relation(fields: [factionId], references: [id])
}

// global definition for the faction setting
model FactionSettingDefinition {
  id             String           @id
  name           String
  type           String // enum of type of setting (eg. text, checkbox)
  minimumLevel   Int // what level is needed to modify this setting (>=)
  FactionSetting FactionSetting[]
}