Files
doodle-store/apps/server/prisma/schema.prisma
T

294 lines
19 KiB
Plaintext

// 由现有 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")
}