148 lines
3.7 KiB
TypeScript
148 lines
3.7 KiB
TypeScript
import { PrismaClient } from '@prisma/client'
|
|
|
|
const prisma = new PrismaClient()
|
|
|
|
async function migrateSubscriptionSystem() {
|
|
console.log('Starting subscription system migration...')
|
|
|
|
try {
|
|
// 1. 创建默认的订阅套餐
|
|
console.log('Creating default subscription plans...')
|
|
|
|
// 免费套餐
|
|
await prisma.subscriptionPlan.upsert({
|
|
where: { id: 'free' },
|
|
update: {},
|
|
create: {
|
|
id: 'free',
|
|
name: 'Free',
|
|
displayName: 'Free Plan',
|
|
description: 'Basic features for getting started',
|
|
price: 0,
|
|
currency: 'usd',
|
|
interval: 'month',
|
|
stripePriceId: null,
|
|
isActive: true,
|
|
sortOrder: 1,
|
|
features: {
|
|
promptLimit: true,
|
|
versionsPerPrompt: true,
|
|
basicSupport: true
|
|
},
|
|
limits: {
|
|
maxVersionLimit: 3,
|
|
promptLimit: 500,
|
|
creditMonthly: 0
|
|
}
|
|
}
|
|
})
|
|
|
|
// Pro 套餐
|
|
await prisma.subscriptionPlan.upsert({
|
|
where: { id: 'pro' },
|
|
update: {},
|
|
create: {
|
|
id: 'pro',
|
|
name: 'pro', // 重要:名称必须是 "pro" 用于查找
|
|
displayName: 'Pro Plan',
|
|
description: 'Advanced features for power users',
|
|
price: 19.9,
|
|
currency: 'usd',
|
|
interval: 'month',
|
|
stripePriceId: null, // 需要手动在数据库中设置 Stripe 价格 ID
|
|
isActive: true,
|
|
sortOrder: 2,
|
|
features: {
|
|
promptLimit: true,
|
|
versionsPerPrompt: true,
|
|
prioritySupport: true,
|
|
advancedAnalytics: true,
|
|
apiAccess: true
|
|
},
|
|
limits: {
|
|
maxVersionLimit: 10,
|
|
promptLimit: 5000,
|
|
creditMonthly: 20
|
|
}
|
|
}
|
|
})
|
|
|
|
console.log('Default subscription plans created successfully')
|
|
|
|
// 2. 更新现有用户的订阅套餐关联
|
|
console.log('Updating existing users...')
|
|
|
|
// 获取所有用户
|
|
const users = await prisma.user.findMany({
|
|
select: {
|
|
id: true,
|
|
subscribePlan: true
|
|
}
|
|
})
|
|
|
|
console.log(`Found ${users.length} users to update`)
|
|
|
|
// 批量更新用户的订阅套餐关联
|
|
for (const user of users) {
|
|
let planId = 'free'
|
|
|
|
// 根据现有的 subscribePlan 字段确定新的套餐 ID
|
|
if (user.subscribePlan === 'pro') {
|
|
planId = 'pro'
|
|
}
|
|
|
|
await prisma.user.update({
|
|
where: { id: user.id },
|
|
data: {
|
|
subscriptionPlanId: planId
|
|
}
|
|
})
|
|
}
|
|
|
|
console.log('User subscription plan associations updated successfully')
|
|
|
|
// 3. 验证迁移结果
|
|
console.log('Verifying migration results...')
|
|
|
|
const planCount = await prisma.subscriptionPlan.count()
|
|
const userCount = await prisma.user.count()
|
|
const usersWithValidPlans = await prisma.user.count({
|
|
where: {
|
|
subscriptionPlanId: {
|
|
not: ''
|
|
}
|
|
}
|
|
})
|
|
|
|
console.log(`Migration completed successfully:`)
|
|
console.log(`- Created ${planCount} subscription plans`)
|
|
console.log(`- Updated ${userCount} users`)
|
|
console.log(`- ${usersWithValidPlans} users have valid plan associations`)
|
|
|
|
if (userCount !== usersWithValidPlans) {
|
|
console.warn(`Warning: ${userCount - usersWithValidPlans} users don't have valid plan associations`)
|
|
}
|
|
|
|
} catch (error) {
|
|
console.error('Migration failed:', error)
|
|
throw error
|
|
} finally {
|
|
await prisma.$disconnect()
|
|
}
|
|
}
|
|
|
|
// 运行迁移
|
|
if (require.main === module) {
|
|
migrateSubscriptionSystem()
|
|
.then(() => {
|
|
console.log('Migration completed successfully')
|
|
process.exit(0)
|
|
})
|
|
.catch((error) => {
|
|
console.error('Migration failed:', error)
|
|
process.exit(1)
|
|
})
|
|
}
|
|
|
|
export { migrateSubscriptionSystem }
|