generator client { provider = "prisma-client-js" output = "../src/generated/prisma" } datasource db { provider = "postgresql" } model User { id String @id name String email String @unique emailVerified Boolean @default(false) @map("email_verified") image String? role String @default("user") isSuspended Boolean @default(false) @map("is_suspended") suspendedUntil DateTime? @map("suspended_until") banned Boolean @default(false) @map("banned") createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") sessions Session[] accounts Account[] @@map("user") } model Session { id String @id expiresAt DateTime @map("expires_at") token String @unique createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") ipAddress String? @map("ip_address") userAgent String? @map("user_agent") userId String @map("user_id") user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@map("session") } model Account { id String @id accountId String @map("account_id") providerId String @map("provider_id") userId String @map("user_id") user User @relation(fields: [userId], references: [id], onDelete: Cascade) accessToken String? @map("access_token") refreshToken String? @map("refresh_token") idToken String? @map("id_token") expiresAt DateTime? @map("expires_at") password String? createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") @@map("account") } model Verification { id String @id identifier String value String expiresAt DateTime @map("expires_at") createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") @@map("verification") } enum ServerType { STATEFUL STATELESS } enum ReverseProxyServerType { VELOCITY BUNGEECORD } enum ServiceType { CLUSTER_IP NODE_PORT LOAD_BALANCER } enum GameMode { SURVIVAL CREATIVE ADVENTURE SPECTATOR } enum ServerDifficulty { PEACEFUL EASY NORMAL HARD } model ReverseProxyServer { id String @id @default(cuid()) type ReverseProxyServerType description String? external_address String external_port Int listen_port Int @default(25565) memory Int @default(512) // MB cpu_request String? @default("250m") cpu_limit String? @default("500m") service_type ServiceType @default(LOAD_BALANCER) node_port Int? api_key String @unique env_variables CustomEnvironmentVariable[] @relation("ReverseProxyServerEnvVars") created_at DateTime @default(now()) updated_at DateTime @updatedAt } enum MinecraftServerJarType { VANILLA PAPER SPIGOT PURPUR FABRIC FORGE FOLIA } enum PluginProvider { MODRINTH HANGAR UPLOAD } enum PluginStorageMode { REMOTE S3 } model Server { id String @id @default(cuid()) type ServerType description String? listen_port Int @default(25565) memory Int @default(2048) // MB limit memory_request Int @default(1024) // MB request cpu_request String? @default("500m") cpu_limit String? @default("2") service_type ServiceType @default(CLUSTER_IP) node_port Int? env_variables CustomEnvironmentVariable[] @relation("ServerEnvVars") plugins ServerPlugin[] api_key String @unique running Boolean @default(true) jar_type MinecraftServerJarType @default(VANILLA) minecraft_version String @default("LATEST") jvm_opts String? use_aikar_flags Boolean @default(false) use_meowice_flags Boolean @default(false) difficulty ServerDifficulty @default(EASY) game_mode GameMode @default(SURVIVAL) max_players Int @default(20) pvp Boolean @default(true) online_mode Boolean @default(true) motd String? level_seed String? level_type String? // default | flat | largeBiomes | amplified created_at DateTime @default(now()) updated_at DateTime @updatedAt } model PluginArtifact { id String @id @default(cuid()) provider PluginProvider provider_project_id String provider_version_id String name String version String platform String minecraft_versions String[] filename String size Int sha256 String source_url String? storage_mode PluginStorageMode @default(REMOTE) object_key String? download_token String @unique @default(cuid()) license String? description String? author String? icon_url String? project_url String? categories String[] provider_updated_at DateTime? created_at DateTime @default(now()) server_plugins ServerPlugin[] @@unique([provider, provider_version_id, platform, filename]) @@index([sha256]) } model ServerPlugin { id String @id @default(cuid()) server_id String artifact_id String enabled Boolean @default(true) created_at DateTime @default(now()) server Server @relation(fields: [server_id], references: [id], onDelete: Cascade) artifact PluginArtifact @relation(fields: [artifact_id], references: [id], onDelete: Restrict) @@unique([server_id, artifact_id]) @@index([server_id, enabled]) } model CustomEnvironmentVariable { id String @id @default(cuid()) key String value String created_at DateTime @default(now()) updated_at DateTime @updatedAt server_id String? server Server? @relation("ServerEnvVars", fields: [server_id], references: [id], onDelete: Cascade) reverse_proxy_id String? reverse_proxy_server ReverseProxyServer? @relation("ReverseProxyServerEnvVars", fields: [reverse_proxy_id], references: [id], onDelete: Cascade) @@unique([key, server_id]) @@unique([key, reverse_proxy_id]) }