// 由现有 v3.5 PostgreSQL 结构反向映射。 // CHECK、C 排序规则与部分唯一索引以 migrations 中保留的原始 SQL 为准。 generator client { provider = "prisma-client" output = "../src/generated/prisma" previewFeatures = ["partialIndexes"] importFileExtension = "js" moduleFormat = "cjs" } datasource db { provider = "postgresql" } /// This table contains check constraints and requires additional setup for migrations. Visit https://pris.ly/d/check-constraints for more info. /// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model AdminAuditLog { id String @id @db.VarChar(128) actorUserId String? @map("actor_user_id") @db.VarChar(128) actorType String @map("actor_type") @db.VarChar(16) action String @db.VarChar(64) resourceType String @map("resource_type") @db.VarChar(64) resourceId String? @map("resource_id") @db.VarChar(128) requestId String @map("request_id") @db.VarChar(128) beforeData Json? @map("before_data") afterData Json? @map("after_data") reason String? createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(3) @@index([actorUserId, createdAt(sort: Desc)], map: "admin_audit_logs_actor_created_at_idx") @@index([requestId]) @@index([resourceType, resourceId, createdAt(sort: Desc)], map: "admin_audit_logs_resource_created_at_idx") @@map("admin_audit_logs") } /// This table contains check constraints and requires additional setup for migrations. Visit https://pris.ly/d/check-constraints for more info. /// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model Asset { id String @id @db.VarChar(128) sourceRef String? @map("source_ref") sourceRefHash String? @unique @map("source_ref_hash") @db.Char(64) provider String @default("qiniu") @db.VarChar(16) bucket String? @db.VarChar(128) objectKey String? @map("object_key") objectRefHash String? @unique @map("object_ref_hash") @db.Char(64) externalUrl String? @map("external_url") purpose String @db.VarChar(32) ownerUserId String? @map("owner_user_id") @db.VarChar(128) visibility String @db.VarChar(16) mimeType String? @map("mime_type") @db.VarChar(128) sizeBytes BigInt? @map("size_bytes") checksum String? @db.Char(64) status String @default("pending") @db.VarChar(16) lastError String? @map("last_error") createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(3) updatedAt DateTime @default(now()) @map("updated_at") @db.Timestamptz(3) usersAssetsOwnerUserIdTousers User? @relation("assets_owner_user_idTousers", fields: [ownerUserId], references: [id], onUpdate: Restrict) categories Category[] usersUsersAvatarAssetIdToassets User[] @relation("users_avatar_asset_idToassets") worksheetResourceAssets WorksheetResourceAsset[] worksheetResources WorksheetResource[] worksheets Worksheet[] @@index([ownerUserId, purpose, status], map: "assets_owner_purpose_status_idx") @@index([status, updatedAt]) @@map("assets") } /// This table contains check constraints and requires additional setup for migrations. Visit https://pris.ly/d/check-constraints for more info. /// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model Category { status String @default("draft") @db.VarChar(16) id String @id @db.VarChar(128) name String @db.VarChar(100) icon String @db.VarChar(1024) iconAssetId String? @map("icon_asset_id") @db.VarChar(128) color String @db.VarChar(32) sortOrder Int @default(0) @map("sort_order") parentId String? @map("parent_id") @db.VarChar(128) createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(3) updatedAt DateTime @default(now()) @map("updated_at") @db.Timestamptz(3) assets Asset? @relation(fields: [iconAssetId], references: [id], onDelete: Restrict, onUpdate: Restrict) categories Category? @relation("categoriesTocategories", fields: [parentId], references: [id], onDelete: Restrict, onUpdate: Restrict) otherCategories Category[] @relation("categoriesTocategories") worksheets Worksheet[] @@index([parentId, sortOrder, id], map: "categories_parent_sort_idx") @@index([status, parentId, sortOrder, id], map: "categories_status_parent_sort_idx") @@map("categories") } /// This table contains check constraints and requires additional setup for migrations. Visit https://pris.ly/d/check-constraints for more info. /// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model DownloadLog { id String @id @db.VarChar(128) userId String @map("user_id") @db.VarChar(128) worksheetId String @map("worksheet_id") @db.VarChar(128) exportId String? @map("export_id") @db.VarChar(128) source String @default("mini") @db.VarChar(16) params Json? createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(3) worksheetResourceId String? @map("worksheet_resource_id") @db.VarChar(128) users User @relation(fields: [userId], references: [id], onUpdate: Restrict) @@unique([userId, exportId], map: "download_logs_user_export_key") @@index([userId, createdAt(sort: Desc), id(sort: Desc)], map: "download_logs_user_created_at_idx") @@index([worksheetId, createdAt(sort: Desc), id(sort: Desc)], map: "download_logs_worksheet_created_at_idx") @@map("download_logs") } /// This table contains check constraints and requires additional setup for migrations. Visit https://pris.ly/d/check-constraints for more info. /// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model Favorite { id String @id @db.VarChar(128) userId String @map("user_id") @db.VarChar(128) worksheetId String @map("worksheet_id") @db.VarChar(128) createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(3) worksheetResourceId String? @map("worksheet_resource_id") @db.VarChar(128) users User @relation(fields: [userId], references: [id], onUpdate: Restrict) @@unique([userId, worksheetResourceId], map: "favorites_user_resource_key", where: raw("(worksheet_resource_id IS NOT NULL)")) @@unique([userId, worksheetId], map: "favorites_user_worksheet_key", where: raw("(worksheet_resource_id IS NULL)")) @@index([userId, createdAt(sort: Desc), id(sort: Desc)], map: "favorites_user_created_at_idx") @@map("favorites") } /// This table contains check constraints and requires additional setup for migrations. Visit https://pris.ly/d/check-constraints for more info. /// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model JobRun { id String @id @db.VarChar(128) jobName String @map("job_name") @db.VarChar(64) runKey String @map("run_key") @db.VarChar(128) triggerType String @map("trigger_type") @db.VarChar(16) status String @default("pending") @db.VarChar(16) scheduledAt DateTime? @map("scheduled_at") @db.Timestamptz(3) startedAt DateTime? @map("started_at") @db.Timestamptz(3) finishedAt DateTime? @map("finished_at") @db.Timestamptz(3) attempt Int @default(0) lockToken String? @map("lock_token") @db.VarChar(128) lockedUntil DateTime? @map("locked_until") @db.Timestamptz(3) result Json? errorMessage String? @map("error_message") createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(3) updatedAt DateTime @default(now()) @map("updated_at") @db.Timestamptz(3) @@unique([jobName, runKey], map: "job_runs_job_run_key") @@index([jobName, createdAt(sort: Desc)], map: "job_runs_job_created_at_idx") @@index([status, lockedUntil]) @@map("job_runs") } /// This table contains check constraints and requires additional setup for migrations. Visit https://pris.ly/d/check-constraints for more info. /// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model PageConfig { id String @id @db.VarChar(128) home Json? category Json? age Json? version BigInt @default(0) updatedAt DateTime @default(now()) @map("updated_at") @db.Timestamptz(3) publishedVersion BigInt? @map("published_version") publishedAt DateTime? @map("published_at") @db.Timestamptz(3) @@map("page_configs") } /// This table contains check constraints and requires additional setup for migrations. Visit https://pris.ly/d/check-constraints for more info. /// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model Setting { id String @id @db.VarChar(128) value Json version BigInt @default(0) updatedAt DateTime @default(now()) @map("updated_at") @db.Timestamptz(3) @@map("settings") } /// This table contains check constraints and requires additional setup for migrations. Visit https://pris.ly/d/check-constraints for more info. /// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model User { id String @id @db.VarChar(128) openid String @unique @db.VarChar(128) unionid String? @db.VarChar(128) nickName String? @map("nick_name") @db.VarChar(100) avatarAssetId String? @map("avatar_asset_id") @db.VarChar(128) totalDownloads BigInt @default(0) @map("total_downloads") role String @default("user") @db.VarChar(16) status String @default("active") @db.VarChar(16) authVersion Int @default(1) @map("auth_version") createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(3) lastActiveAt DateTime @default(now()) @map("last_active_at") @db.Timestamptz(3) updatedAt DateTime @default(now()) @map("updated_at") @db.Timestamptz(3) assetsAssetsOwnerUserIdTousers Asset[] @relation("assets_owner_user_idTousers") downloadLogs DownloadLog[] favorites Favorite[] assetsUsersAvatarAssetIdToassets Asset? @relation("users_avatar_asset_idToassets", fields: [avatarAssetId], references: [id], onDelete: Restrict, onUpdate: Restrict) @@index([unionid]) @@map("users") } /// This table contains check constraints and requires additional setup for migrations. Visit https://pris.ly/d/check-constraints for more info. /// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model WorksheetGrade { worksheetId String @map("worksheet_id") @db.VarChar(128) grade Int @db.SmallInt worksheets Worksheet @relation(fields: [worksheetId], references: [id], onUpdate: Restrict) @@id([worksheetId, grade]) @@index([grade, worksheetId], map: "worksheet_grades_grade_worksheet_idx") @@map("worksheet_grades") } /// This table contains check constraints and requires additional setup for migrations. Visit https://pris.ly/d/check-constraints for more info. /// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model WorksheetResourceAsset { id String @id @db.VarChar(128) worksheetResourceId String @map("worksheet_resource_id") @db.VarChar(128) assetId String @map("asset_id") @db.VarChar(128) role String @db.VarChar(16) sortOrder Int @default(0) @map("sort_order") assets Asset @relation(fields: [assetId], references: [id], onUpdate: Restrict) worksheetResources WorksheetResource @relation(fields: [worksheetResourceId], references: [id], onUpdate: Restrict, map: "worksheet_resource_assets_resource_id_fkey") @@unique([worksheetResourceId, role, assetId], map: "worksheet_resource_assets_resource_role_asset_key") @@index([assetId], map: "worksheet_resource_assets_asset_idx") @@index([worksheetResourceId, role, sortOrder, id], map: "worksheet_resource_assets_resource_role_sort_idx") @@map("worksheet_resource_assets") } /// This table contains check constraints and requires additional setup for migrations. Visit https://pris.ly/d/check-constraints for more info. /// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model WorksheetResource { id String @id @db.VarChar(128) worksheetId String @map("worksheet_id") @db.VarChar(128) title String @db.VarChar(100) previewAssetId String @map("preview_asset_id") @db.VarChar(128) configOverride Json? @map("config_override") status String @default("draft") @db.VarChar(16) sortOrder Int @default(0) @map("sort_order") createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(3) updatedAt DateTime @default(now()) @map("updated_at") @db.Timestamptz(3) firstPublishedAt DateTime? @map("first_published_at") @db.Timestamptz(3) downloads BigInt @default(0) worksheetResourceAssets WorksheetResourceAsset[] assets Asset @relation(fields: [previewAssetId], references: [id], onUpdate: Restrict) worksheets Worksheet @relation(fields: [worksheetId], references: [id], onUpdate: Restrict) @@index([previewAssetId], map: "worksheet_resources_preview_asset_idx") @@index([worksheetId, status, sortOrder, id], map: "worksheet_resources_worksheet_status_sort_idx") @@map("worksheet_resources") } /// This table contains check constraints and requires additional setup for migrations. Visit https://pris.ly/d/check-constraints for more info. /// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model Worksheet { id String @id @db.VarChar(128) title String @db.VarChar(100) subtitle String @db.VarChar(500) categoryId String @map("category_id") @db.VarChar(128) subcategory String? @db.VarChar(100) path String @db.VarChar(1024) ageMin Int @map("age_min") @db.SmallInt ageMax Int @map("age_max") @db.SmallInt grade Int @default(0) @db.SmallInt difficulty Int @db.SmallInt previewAssetId String @map("preview_asset_id") @db.VarChar(128) tags Json @default("[]") isNew Boolean @default(false) @map("is_new") isHot Boolean @default(false) @map("is_hot") sortOrder Int @default(0) @map("sort_order") downloads BigInt @default(0) likes BigInt @default(0) downloadsSeed BigInt @default(0) @map("downloads_seed") likesSeed BigInt @default(0) @map("likes_seed") status String @default("draft") @db.VarChar(16) createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(3) contentUpdatedAt DateTime? @map("content_updated_at") @db.Timestamptz(3) updatedAt DateTime @default(now()) @map("updated_at") @db.Timestamptz(3) generationMode String @default("procedural") @map("generation_mode") @db.VarChar(16) rendererKey String? @map("renderer_key") @db.VarChar(64) renderConfig Json @default("{}") @map("render_config") firstPublishedAt DateTime? @map("first_published_at") @db.Timestamptz(3) worksheetGrades WorksheetGrade[] worksheetResources WorksheetResource[] categories Category @relation(fields: [categoryId], references: [id], onUpdate: Restrict) assets Asset @relation(fields: [previewAssetId], references: [id], onUpdate: Restrict) @@index([categoryId, status, sortOrder, updatedAt(sort: Desc), id], map: "worksheets_category_status_sort_idx") @@index([status, ageMin, ageMax], map: "worksheets_status_age_idx") @@index([status, sortOrder, updatedAt(sort: Desc), id], map: "worksheets_status_sort_idx") @@map("worksheets") }