schema.ts 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import { pgTable, text, timestamp, uuid, boolean, integer } from 'drizzle-orm/pg-core';
  2. import { CREDIT_CONFIG } from '@/lib/constants';
  3. export const users = pgTable('users', {
  4. id: uuid('id').primaryKey().defaultRandom(),
  5. email: text('email').notNull().unique(),
  6. password: text('password'),
  7. username: text('username'),
  8. emailVerified: timestamp('email_verified'),
  9. image: text('image'),
  10. isEmailVerified: boolean('is_email_verified').notNull().default(false),
  11. credits: integer('credits').notNull().default(CREDIT_CONFIG.REGISTRATION_BONUS), // 永久积分
  12. subscriptionCredits: integer('subscription_credits').notNull().default(0), // 订阅积分
  13. // 订阅相关字段
  14. subscriptionStatus: text('subscription_status').default('none'), // 'none', 'active', 'canceled', 'expired'
  15. subscriptionPlan: text('subscription_plan'), // 'pro', 'enterprise', etc.
  16. subscriptionStartDate: timestamp('subscription_start_date'),
  17. subscriptionEndDate: timestamp('subscription_end_date'),
  18. stripeCustomerId: text('stripe_customer_id'),
  19. stripeSubscriptionId: text('stripe_subscription_id'),
  20. createdAt: timestamp('created_at').defaultNow(),
  21. updatedAt: timestamp('updated_at').defaultNow(),
  22. });
  23. export const verificationTokens = pgTable('verification_tokens', {
  24. id: uuid('id').primaryKey().defaultRandom(),
  25. email: text('email').notNull(),
  26. token: text('token').notNull().unique(),
  27. expires: timestamp('expires').notNull(),
  28. type: text('type').notNull(), // 'email_verification' | 'password_reset'
  29. createdAt: timestamp('created_at').defaultNow(),
  30. });
  31. export const accounts = pgTable('accounts', {
  32. id: uuid('id').primaryKey().defaultRandom(),
  33. userId: uuid('user_id').notNull().references(() => users.id, { onDelete: 'cascade' }),
  34. type: text('type').notNull(),
  35. provider: text('provider').notNull(),
  36. providerAccountId: text('provider_account_id').notNull(),
  37. refresh_token: text('refresh_token'),
  38. access_token: text('access_token'),
  39. expires_at: integer('expires_at'),
  40. token_type: text('token_type'),
  41. scope: text('scope'),
  42. id_token: text('id_token'),
  43. session_state: text('session_state'),
  44. });
  45. export const sessions = pgTable('sessions', {
  46. id: uuid('id').primaryKey().defaultRandom(),
  47. sessionToken: text('session_token').notNull().unique(),
  48. userId: uuid('user_id').notNull().references(() => users.id, { onDelete: 'cascade' }),
  49. expires: timestamp('expires').notNull(),
  50. });
  51. // 活动记录表
  52. export const userActivities = pgTable('user_activities', {
  53. id: uuid('id').primaryKey().defaultRandom(),
  54. userId: uuid('user_id').notNull().references(() => users.id, { onDelete: 'cascade' }),
  55. type: text('type').notNull(), // 'credit_deduct', 'credit_add', 'image_generation', 'login', etc.
  56. description: text('description').notNull(),
  57. creditAmount: integer('credit_amount'), // 积分变化数量,负数为扣除,正数为增加
  58. metadata: text('metadata'), // JSON格式的额外数据
  59. createdAt: timestamp('created_at').defaultNow(),
  60. });
  61. export type User = typeof users.$inferSelect;
  62. export type NewUser = typeof users.$inferInsert;
  63. export type VerificationToken = typeof verificationTokens.$inferSelect;
  64. export type NewVerificationToken = typeof verificationTokens.$inferInsert;