Bot & Automation

AI Creator Studio Telegram

/root/hermes-projects/AI Creator Studio Telegram

packages/database/prisma/schema.prisma text
generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

enum UserRole {
  USER
  ADMIN
}

enum UserStatus {
  ACTIVE
  SUSPENDED
}

enum ProjectStatus {
  DRAFT
  ACTIVE
  ARCHIVED
}

enum JobStatus {
  DRAFT
  ESTIMATED
  CONFIRMED
  QUEUED
  RUNNING
  VALIDATING
  STORING
  COMPLETED
  RETRYING
  FAILED
  CANCELLED
}

model User {
  id             String         @id @default(uuid())
  telegramId     BigInt         @unique
  username       String?
  displayName    String?
  role           UserRole       @default(USER)
  status         UserStatus     @default(ACTIVE)
  defaultPreset  String         @default("cinematic")
  preferences    Json           @default("{}")
  projects       Project[]
  generationJobs GenerationJob[]
  creditLedger   CreditLedger[]
  usageRecords   UsageRecord[]
  createdAt      DateTime       @default(now())
  updatedAt      DateTime       @updatedAt
}

model Project {
  id               String          @id @default(uuid())
  userId           String
  user             User            @relation(fields: [userId], references: [id])
  title            String
  type             String
  status           ProjectStatus   @default(DRAFT)
  preset           String
  isFavorite       Boolean         @default(false)
  duplicatedFromId String?
  settings         Json            @default("{}")
  promptSnapshot   Json            @default("{}")
  jobs             GenerationJob[]
  mediaAssets      MediaAsset[]
  createdAt        DateTime        @default(now())
  updatedAt        DateTime        @updatedAt
}

model GenerationJob {
  id               String        @id @default(uuid())
  projectId        String
  project          Project       @relation(fields: [projectId], references: [id])
  userId           String
  user             User          @relation(fields: [userId], references: [id])
  mode             String
  status           JobStatus     @default(DRAFT)
  providerId       String?
  providerJobId    String?
  progress         Int           @default(0)
  retryCount       Int           @default(0)
  requestPayload   Json          @default("{}")
  enhancedPrompt   Json          @default("{}")
  resourceEstimate Json          @default("{}")
  resourceActual   Json          @default("{}")
  errorCode        String?
  errorMessage     String?
  queuedAt         DateTime?
  startedAt        DateTime?
  completedAt      DateTime?
  mediaAssets      MediaAsset[]
  events           JobEvent[]
  usageRecords     UsageRecord[]
  createdAt        DateTime      @default(now())
  updatedAt        DateTime      @updatedAt
}

model MediaAsset {
  id          String        @id @default(uuid())
  projectId   String
  project     Project       @relation(fields: [projectId], references: [id])
  jobId       String?
  job         GenerationJob? @relation(fields: [jobId], references: [id])
  kind        String
  mimeType    String
  storageKey  String
  publicUrl   String?
  width       Int?
  height      Int?
  durationMs  Int?
  sizeBytes   Int
  checksum    String?
  metadata    Json          @default("{}")
  createdAt   DateTime      @default(now())
}

model CreditLedger {
  id            String   @id @default(uuid())
  userId        String
  user          User     @relation(fields: [userId], references: [id])
  type          String
  creditsDelta  Int
  tokensDelta   Int
  balanceAfter  Int
  referenceType String?
  referenceId   String?
  note          String?
  createdAt     DateTime @default(now())
}

model UsageRecord {
  id               String        @id @default(uuid())
  userId           String
  user             User          @relation(fields: [userId], references: [id])
  jobId            String?
  job              GenerationJob? @relation(fields: [jobId], references: [id])
  providerId       String?
  creditsUsed      Int
  tokensUsed       Int
  storageBytesUsed Int
  usageDetail      Json          @default("{}")
  createdAt        DateTime      @default(now())
}

model Provider {
  id             String            @id
  displayName    String
  status         String
  capabilities   Json              @default("[]")
  pricingConfig  Json              @default("{}")
  limitsConfig   Json              @default("{}")
  accounts       ProviderAccount[]
  updatedAt      DateTime          @updatedAt
}

model ProviderAccount {
  id                String   @id @default(uuid())
  providerId        String
  provider          Provider @relation(fields: [providerId], references: [id])
  status            String
  secretRef         String
  priority          Int      @default(100)
  balanceSnapshot   Json     @default("{}")
  rateLimitSnapshot Json     @default("{}")
  lastSyncedAt      DateTime?
}

model JobEvent {
  id        String        @id @default(uuid())
  jobId     String
  job       GenerationJob @relation(fields: [jobId], references: [id])
  eventType String
  payload   Json          @default("{}")
  createdAt DateTime      @default(now())
}

model WebhookEvent {
  id          String   @id @default(uuid())
  source      String
  externalId  String
  payload     Json     @default("{}")
  processedAt DateTime?
  createdAt   DateTime @default(now())

  @@unique([source, externalId])
}

model AuditLog {
  id        String   @id @default(uuid())
  actorId   String?
  action    String
  target    String
  payload   Json     @default("{}")
  createdAt DateTime @default(now())
}