schema.prisma 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. // DoTouch.AI - Prisma Schema
  2. // PostgreSQL 16 datasource, client generated via `pnpm db:generate`
  3. generator client {
  4. provider = "prisma-client-js"
  5. }
  6. datasource db {
  7. provider = "postgresql"
  8. url = env("DATABASE_URL")
  9. }
  10. // ---- 用户 ----
  11. model User {
  12. id String @id @default(cuid())
  13. email String @unique
  14. passwordHash String @map("password_hash")
  15. role String @default("user") // user | admin
  16. currency String @default("USD")
  17. balanceCents BigInt @default(0) @map("balance_cents")
  18. status String @default("active") // active | suspended | banned
  19. createdAt DateTime @default(now()) @map("created_at")
  20. updatedAt DateTime @updatedAt @map("updated_at")
  21. // 用量配额(null = 不限)
  22. dailyRequestLimit Int? @map("daily_request_limit")
  23. dailyTokenLimit BigInt? @map("daily_token_limit")
  24. dailyCostCentsLimit Int? @map("daily_cost_cents_limit")
  25. totalRequestLimit Int? @map("total_request_limit")
  26. totalTokenLimit BigInt? @map("total_token_limit")
  27. totalCostCentsLimit Int? @map("total_cost_cents_limit")
  28. alertPct Int @default(80) @map("alert_pct")
  29. apiKeys ApiKey[]
  30. balanceTransactions BalanceTransaction[]
  31. usageRecords UsageRecord[]
  32. orders Order[]
  33. @@map("users")
  34. }
  35. // ---- API 密钥 ----
  36. model ApiKey {
  37. id String @id @default(cuid())
  38. userId String @map("user_id")
  39. name String
  40. keyHash String @unique @map("key_hash")
  41. prefix String // 前 12 位用于展示(dt_ + 32 hex = 36 chars)
  42. expiresAt DateTime? @map("expires_at")
  43. lastUsedAt DateTime? @map("last_used_at")
  44. status String @default("active") // active | revoked
  45. createdAt DateTime @default(now()) @map("created_at")
  46. updatedAt DateTime @updatedAt @map("updated_at")
  47. // 用量配额(null = 不限)
  48. dailyRequestLimit Int? @map("daily_request_limit")
  49. dailyTokenLimit BigInt? @map("daily_token_limit")
  50. dailyCostCentsLimit Int? @map("daily_cost_cents_limit")
  51. totalRequestLimit Int? @map("total_request_limit")
  52. totalTokenLimit BigInt? @map("total_token_limit")
  53. totalCostCentsLimit Int? @map("total_cost_cents_limit")
  54. alertPct Int @default(80) @map("alert_pct")
  55. user User @relation(fields: [userId], references: [id])
  56. usageRecords UsageRecord[]
  57. events ApiKeyEvent[]
  58. @@map("api_keys")
  59. }
  60. // ---- API Key 事件审计日志 ----
  61. model ApiKeyEvent {
  62. id String @id @default(cuid())
  63. apiKeyId String @map("api_key_id")
  64. userId String @map("user_id")
  65. action String // created | rotated | revoked | used
  66. ip String?
  67. createdAt DateTime @default(now()) @map("created_at")
  68. apiKey ApiKey @relation(fields: [apiKeyId], references: [id])
  69. @@map("api_key_events")
  70. }
  71. // ---- 模型目录(DB-backed) ----
  72. model ModelCatalog {
  73. id String @id @default(cuid())
  74. publicId String @unique @map("public_id")
  75. upstreamId String @map("upstream_id")
  76. name String
  77. provider String // Zhipu | DeepSeek | Alibaba | MiniMax | Kimi | SiliconFlow | Other
  78. category String // chat | vision | image | speech
  79. description String?
  80. contextWindow Int? @map("context_window")
  81. maxOutput Int? @map("max_output")
  82. inputPriceCents Int @default(0) @map("input_price_cents")
  83. outputPriceCents Int @default(0) @map("output_price_cents")
  84. isRecommended Boolean @default(false) @map("is_recommended")
  85. status String @default("active") // active | hidden | disabled
  86. sortOrder Int @default(0) @map("sort_order")
  87. createdAt DateTime @default(now()) @map("created_at")
  88. updatedAt DateTime @updatedAt @map("updated_at")
  89. @@map("models")
  90. }
  91. // ---- 余额变动记录 ----
  92. model BalanceTransaction {
  93. id String @id @default(cuid())
  94. userId String @map("user_id")
  95. amountCents BigInt @map("amount_cents")
  96. type String // topup | charge | refund | usage | refund
  97. refId String? @map("ref_id")
  98. createdAt DateTime @default(now()) @map("created_at")
  99. user User @relation(fields: [userId], references: [id])
  100. @@map("balance_transactions")
  101. }
  102. // ---- 用量记录 ----
  103. model UsageRecord {
  104. id String @id @default(cuid())
  105. userId String @map("user_id")
  106. apiKeyId String @map("api_key_id")
  107. model String
  108. promptTokens Int @map("prompt_tokens")
  109. completionTokens Int @map("completion_tokens")
  110. costCents Int @map("cost_cents")
  111. createdAt DateTime @default(now()) @map("created_at")
  112. user User @relation(fields: [userId], references: [id])
  113. apiKey ApiKey @relation(fields: [apiKeyId], references: [id])
  114. @@map("usage_records")
  115. }
  116. // ---- 配额事件(预警 + 超限审计) ----
  117. model QuotaEvent {
  118. id String @id @default(cuid())
  119. userId String @map("user_id")
  120. apiKeyId String? @map("api_key_id")
  121. dimension String // request | token | cost
  122. windowType String @map("window_type") // daily | total
  123. scopeType String @map("scope_type") // account | key
  124. threshold Int
  125. current BigInt
  126. action String // alert | block
  127. createdAt DateTime @default(now()) @map("created_at")
  128. @@map("quota_events")
  129. }
  130. // ---- 订单 ----
  131. model Order {
  132. id String @id @default(cuid())
  133. userId String @map("user_id")
  134. provider String // alipay | stripe | ...
  135. providerOrderId String? @map("provider_order_id")
  136. amountCents BigInt @map("amount_cents")
  137. status String @default("pending") // pending | paid | failed | refunded
  138. currency String @default("USD")
  139. createdAt DateTime @default(now()) @map("created_at")
  140. user User @relation(fields: [userId], references: [id])
  141. @@map("orders")
  142. }