Phase7
Some checks failed
CI / Node — lint, typecheck, test, build (push) Failing after 9s
CI / Go — node-agent tests (push) Failing after 8s
CI / Go — edge-gateway build (push) Successful in 14s

This commit is contained in:
smueller
2026-06-26 13:20:55 +02:00
parent 49a98ee31d
commit ab21f53cdd
86 changed files with 1207 additions and 63 deletions

View File

@@ -121,6 +121,13 @@ enum AddonInstallStatus {
REMOVED
}
enum CreditTransactionType {
GRANT
USAGE_DEBIT
ADJUSTMENT
EXPIRE
}
model User {
id String @id @default(uuid())
email String @unique
@@ -141,6 +148,7 @@ model User {
emailVerificationTokens EmailVerificationToken[]
passwordResetTokens PasswordResetToken[]
totpCredential TotpCredential?
creditWallet CreditWallet?
@@map("users")
}
@@ -276,10 +284,15 @@ model GameServer {
hostPort Int?
containerId String?
dataPath String?
ramMb Int @default(1024)
activeWorldName String @default("world")
createdAt DateTime @default(now()) @db.Timestamptz(3)
updatedAt DateTime @updatedAt @db.Timestamptz(3)
ramMb Int @default(1024)
activeWorldName String @default("world")
idleShutdownEnabled Boolean @default(true)
lastPlayerSeenAt DateTime? @db.Timestamptz(3)
idleStopAt DateTime? @db.Timestamptz(3)
runningSince DateTime? @db.Timestamptz(3)
lastMeteredAt DateTime? @db.Timestamptz(3)
createdAt DateTime @default(now()) @db.Timestamptz(3)
updatedAt DateTime @updatedAt @db.Timestamptz(3)
user User @relation(fields: [userId], references: [id])
plan Plan? @relation(fields: [planId], references: [id])
@@ -292,6 +305,7 @@ model GameServer {
worldUploads WorldUpload[]
installedAddons InstalledAddon[]
startQueueEntry ServerStartQueueEntry?
usageRecords UsageRecord[]
@@index([userId])
@@index([nodeId])
@@ -397,18 +411,24 @@ model ServerStartQueueEntry {
}
model Plan {
id String @id @default(uuid())
name String @unique
slug String @unique
description String?
isFree Boolean @default(false)
isActive Boolean @default(true)
maxRamMb Int
maxCpuCores Float
maxStorageMb Int
metadata Json?
createdAt DateTime @default(now()) @db.Timestamptz(3)
updatedAt DateTime @updatedAt @db.Timestamptz(3)
id String @id @default(uuid())
name String @unique
slug String @unique
description String?
isFree Boolean @default(false)
isActive Boolean @default(true)
maxRamMb Int
maxCpuCores Float
maxStorageMb Int
maxServersPerUser Int?
idleTimeoutMinutes Int @default(15)
idleGraceAfterStartMinutes Int @default(3)
idleCountdownSeconds Int @default(120)
queuePriority Int @default(0)
monthlyCreditGrant Int @default(0)
metadata Json?
createdAt DateTime @default(now()) @db.Timestamptz(3)
updatedAt DateTime @updatedAt @db.Timestamptz(3)
gameServers GameServer[]
@@ -475,6 +495,56 @@ model JobRecord {
@@map("job_records")
}
model CreditWallet {
id String @id @default(uuid())
userId String @unique
balance Int @default(0)
periodStart DateTime @default(now()) @db.Timestamptz(3)
createdAt DateTime @default(now()) @db.Timestamptz(3)
updatedAt DateTime @updatedAt @db.Timestamptz(3)
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
transactions CreditTransaction[]
@@map("credit_wallets")
}
model CreditTransaction {
id String @id @default(uuid())
walletId String
amount Int
type CreditTransactionType
referenceType String?
referenceId String?
idempotencyKey String @unique
metadata Json?
createdAt DateTime @default(now()) @db.Timestamptz(3)
wallet CreditWallet @relation(fields: [walletId], references: [id], onDelete: Cascade)
@@index([walletId, createdAt])
@@map("credit_transactions")
}
model UsageRecord {
id String @id @default(uuid())
serverId String
userId String
ramMb Int
durationSeconds Int
creditsCharged Int
periodStart DateTime @db.Timestamptz(3)
periodEnd DateTime @db.Timestamptz(3)
idempotencyKey String @unique
createdAt DateTime @default(now()) @db.Timestamptz(3)
server GameServer @relation(fields: [serverId], references: [id], onDelete: Cascade)
@@index([serverId, periodStart])
@@index([userId, periodStart])
@@map("usage_records")
}
model ServerBackup {
id String @id @default(uuid())
serverId String