// 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" } generator dbml { provider = "prisma-dbml-generator" } datasource db { provider = "postgresql" url = env("DATABASE_URL") } model User { 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 isAdmin Boolean @default(false) isModerator Boolean @default(false) pixels Pixel[] FactionMember FactionMember[] } model PaletteColor { 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]) } 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[] }