162 lines
4.4 KiB
TypeScript
162 lines
4.4 KiB
TypeScript
import { PrismaClient } from '@prisma/client'
|
|
|
|
const prisma = new PrismaClient()
|
|
|
|
async function main() {
|
|
console.log('🌱 Starting database seeding...')
|
|
|
|
console.log('📦 Ensuring essential subscription plans exist...')
|
|
|
|
// 确保免费套餐存在
|
|
const freePlan = await prisma.subscriptionPlan.upsert({
|
|
where: { id: 'free' },
|
|
update: {
|
|
// 更新现有套餐的关键字段
|
|
name: 'free',
|
|
isActive: true
|
|
},
|
|
create: {
|
|
id: 'free',
|
|
name: 'Free',
|
|
displayName: 'Free Plan',
|
|
description: 'Basic features for getting started with AI prompt management',
|
|
price: 0,
|
|
currency: 'usd',
|
|
interval: 'month',
|
|
stripePriceId: null,
|
|
isActive: true,
|
|
sortOrder: 1,
|
|
features: {
|
|
promptLimit: true,
|
|
versionsPerPrompt: true,
|
|
basicSupport: true,
|
|
publicSharing: true
|
|
},
|
|
limits: {
|
|
maxVersionLimit: 3,
|
|
promptLimit: 500,
|
|
creditMonthly: 0
|
|
}
|
|
}
|
|
})
|
|
|
|
// 确保 Pro 套餐存在
|
|
const proPlan = await prisma.subscriptionPlan.upsert({
|
|
where: { id: 'pro' },
|
|
update: {
|
|
// 更新现有套餐的关键字段
|
|
name: 'pro',
|
|
isActive: true
|
|
},
|
|
create: {
|
|
id: 'pro',
|
|
name: 'pro', // 重要:名称必须是 "pro" 用于查找
|
|
displayName: 'Pro Plan',
|
|
description: 'Advanced features for power users and professionals',
|
|
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,
|
|
teamCollaboration: true,
|
|
exportImport: true,
|
|
customBranding: true
|
|
},
|
|
limits: {
|
|
maxVersionLimit: 10,
|
|
promptLimit: 5000,
|
|
creditMonthly: 20
|
|
}
|
|
}
|
|
})
|
|
|
|
console.log(`✅ Created subscription plan: ${freePlan.displayName}`)
|
|
console.log(`✅ Created subscription plan: ${proPlan.displayName}`)
|
|
|
|
// 更新现有用户的订阅套餐关联
|
|
console.log('👥 Updating existing users...')
|
|
|
|
// 获取所有用户,不管是否已有订阅套餐关联
|
|
const users = await prisma.user.findMany({
|
|
select: {
|
|
id: true,
|
|
subscribePlan: true,
|
|
subscriptionPlanId: true
|
|
}
|
|
})
|
|
|
|
// 获取有效的套餐 ID 列表
|
|
const validPlans = await prisma.subscriptionPlan.findMany({
|
|
where: { isActive: true },
|
|
select: { id: true }
|
|
})
|
|
const validPlanIds = validPlans.map(plan => plan.id)
|
|
|
|
// 过滤出需要更新的用户
|
|
const usersToUpdate = users.filter(user => {
|
|
// 检查 subscribePlan 是否有效
|
|
const hasValidSubscribePlan = validPlanIds.includes(user.subscribePlan)
|
|
// 检查 subscriptionPlanId 是否正确
|
|
const hasValidSubscriptionPlanId = user.subscriptionPlanId && validPlanIds.includes(user.subscriptionPlanId)
|
|
|
|
return !hasValidSubscribePlan || !hasValidSubscriptionPlanId
|
|
})
|
|
|
|
if (usersToUpdate.length > 0) {
|
|
console.log(`📝 Found ${usersToUpdate.length} users to update`)
|
|
|
|
for (const user of usersToUpdate) {
|
|
let planId = 'free'
|
|
|
|
// 如果用户的 subscribePlan 是有效的,使用它;否则默认为 free
|
|
if (validPlanIds.includes(user.subscribePlan)) {
|
|
planId = user.subscribePlan
|
|
}
|
|
|
|
await prisma.user.update({
|
|
where: { id: user.id },
|
|
data: {
|
|
subscribePlan: planId, // 确保 subscribePlan 有效
|
|
subscriptionPlanId: planId // 确保 subscriptionPlanId 有效
|
|
}
|
|
})
|
|
}
|
|
|
|
console.log(`✅ Updated ${usersToUpdate.length} users with subscription plan associations`)
|
|
} else {
|
|
console.log('👥 No users need subscription plan updates')
|
|
}
|
|
|
|
// 验证种子数据
|
|
const planCount = await prisma.subscriptionPlan.count()
|
|
const usersWithPlans = await prisma.user.count({
|
|
where: {
|
|
subscriptionPlanId: {
|
|
not: ''
|
|
}
|
|
}
|
|
})
|
|
|
|
console.log(`\n📊 Seeding completed:`)
|
|
console.log(` • ${planCount} subscription plans created`)
|
|
console.log(` • ${usersWithPlans} users have valid plan associations`)
|
|
console.log(`\n🎉 Database seeding finished successfully!`)
|
|
}
|
|
|
|
main()
|
|
.then(async () => {
|
|
await prisma.$disconnect()
|
|
})
|
|
.catch(async (e) => {
|
|
console.error('❌ Seeding failed:', e)
|
|
await prisma.$disconnect()
|
|
process.exit(1)
|
|
})
|