// This is your Prisma schema file, // learn more about it in the docs: https://pris.ly/d/prisma-schema // Get a free hosted Postgres database in seconds: `npx create-db` generator client { provider = "prisma-client" output = "../app/generated/prisma" } datasource db { provider = "mysql" } enum ImageGenerationStatus { QUEUED RUNNING SUCCEEDED FAILED } enum ImageArchiveStatus { NOT_REQUIRED PENDING RUNNING SUCCEEDED FAILED } enum PlazaPostStatus { PUBLIC HIDDEN REMOVED } model User { id Int @id username String @default("") @db.VarChar(191) displayName String @default("") @map("display_name") @db.VarChar(191) group String @default("") @db.VarChar(191) role Int @default(0) status Int @default(0) createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") imageGenerations ImageGeneration[] plazaPosts PlazaPost[] @@map("users") } model ImageGeneration { id BigInt @id @default(autoincrement()) @db.UnsignedBigInt userId Int @map("user_id") prompt String @db.Text status ImageGenerationStatus @default(RUNNING) model String @default("gpt-image-2") @db.VarChar(64) startedAt DateTime @default(now()) @map("started_at") endedAt DateTime? @map("ended_at") durationMs Int? @map("duration_ms") imageUrl String? @map("image_url") @db.VarChar(2048) hostedImageUrl String? @map("hosted_image_url") @db.VarChar(2048) imageMimeType String? @map("image_mime_type") @db.VarChar(191) revisedPrompt String? @map("revised_prompt") @db.Text upstreamResponse Json? @map("upstream_response") hostedResponse Json? @map("hosted_response") errorMessage String? @map("error_message") @db.Text archiveStatus ImageArchiveStatus @default(NOT_REQUIRED) @map("archive_status") archiveAttempts Int @default(0) @map("archive_attempts") archiveNextRunAt DateTime? @map("archive_next_run_at") archiveLockedAt DateTime? @map("archive_locked_at") archiveLockedBy String? @map("archive_locked_by") @db.VarChar(191) archiveLastError String? @map("archive_last_error") @db.Text createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") deletedAt DateTime? @map("deleted_at") user User @relation(fields: [userId], references: [id], onDelete: Cascade) plazaPost PlazaPost? @@index([userId, createdAt]) @@index([status]) @@index([archiveStatus, archiveNextRunAt]) @@index([archiveLockedAt]) @@index([deletedAt]) @@map("image_generations") } model PlazaPost { id BigInt @id @default(autoincrement()) @db.UnsignedBigInt imageGenerationId BigInt @unique @map("image_generation_id") @db.UnsignedBigInt userId Int @map("user_id") status PlazaPostStatus @default(PUBLIC) publishedAt DateTime @default(now()) @map("published_at") hiddenAt DateTime? @map("hidden_at") removedAt DateTime? @map("removed_at") createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") imageGeneration ImageGeneration @relation(fields: [imageGenerationId], references: [id], onDelete: Cascade) user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@index([status, publishedAt]) @@index([userId, publishedAt]) @@map("plaza_posts") } model GenerationStats { id String @id @db.VarChar(32) totalRequests Int @default(0) @map("total_requests") successRequests Int @default(0) @map("success_requests") failedRequests Int @default(0) @map("failed_requests") queuedRequests Int @default(0) @map("queued_requests") runningRequests Int @default(0) @map("running_requests") totalImages Int @default(0) @map("total_images") createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") @@map("generation_stats") }