Prmbr/scripts/debug-pricing-plans.ts
2025-08-05 23:29:32 +08:00

129 lines
4.7 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { PrismaClient } from '@prisma/client'
import { SubscriptionService } from '../src/lib/subscription-service'
import { isPlanFree } from '../src/lib/subscription-utils'
const prisma = new PrismaClient()
async function debugPricingPlans() {
console.log('🔍 Debugging pricing plans visibility...')
try {
// 1. 获取所有套餐的详细信息
console.log('\n1. All plans in database:')
const allPlans = await SubscriptionService.getAvailablePlans()
allPlans.forEach((plan, index) => {
console.log(`\n${index + 1}. Plan Details:`)
console.log(` - ID: "${plan.id}"`)
console.log(` - Name: "${plan.name}"`)
console.log(` - Display Name: "${plan.displayName}"`)
console.log(` - Price: $${plan.price}`)
console.log(` - Stripe Price ID: "${plan.stripePriceId || 'NULL'}"`)
console.log(` - Is Active: ${plan.isActive}`)
console.log(` - Is Free: ${isPlanFree(plan)}`)
console.log(` - Has Valid Price ID: ${!!(plan.stripePriceId && plan.stripePriceId.trim() !== '')}`)
})
// 2. 模拟未登录用户的过滤逻辑
console.log('\n2. Filtering logic for anonymous user:')
const filteredPlans = allPlans.filter(plan => {
console.log(`\nChecking plan: ${plan.displayName} (${plan.id})`)
// 只显示官方的免费套餐ID为'free'或名称为'free'
if (isPlanFree(plan) && (plan.id === 'free' || plan.name.toLowerCase() === 'free')) {
console.log(` ✅ Showing: Official free plan`)
return true
} else if (isPlanFree(plan)) {
console.log(` ❌ Hidden: Free plan but not official (${plan.id}, ${plan.name})`)
}
// 用户当前套餐总是显示 (对于未登录用户userData = null)
const userData = null as { subscriptionPlanId: string } | null // 模拟未登录用户
if (userData && userData.subscriptionPlanId === plan.id) {
console.log(` ✅ Showing: Current plan`)
return true
} else {
console.log(` ❌ Not current plan (user not logged in)`)
}
// 付费套餐必须有 stripePriceId 才能显示(可订阅)
if (!isPlanFree(plan) && plan.stripePriceId && plan.stripePriceId.trim() !== '') {
console.log(` ✅ Showing: Paid plan with valid Stripe Price ID`)
return true
} else if (!isPlanFree(plan)) {
console.log(` ❌ Hidden: Paid plan without valid Stripe Price ID`)
}
return false
})
console.log('\n3. Plans visible to anonymous user:')
filteredPlans.forEach((plan, index) => {
console.log(` ${index + 1}. ${plan.displayName} (${plan.id}) - $${plan.price}`)
})
// 3. 检查可能的问题
console.log('\n4. Potential issues:')
const problematicPlans = allPlans.filter(plan =>
!isPlanFree(plan) && (!plan.stripePriceId || plan.stripePriceId.trim() === '')
)
if (problematicPlans.length > 0) {
console.log(` ⚠️ Found ${problematicPlans.length} paid plans without valid Stripe Price ID:`)
problematicPlans.forEach(plan => {
console.log(` - ${plan.displayName} (${plan.id}): $${plan.price}`)
console.log(` Should be hidden for anonymous users unless it's their current plan`)
})
} else {
console.log(' ✅ All paid plans have valid Stripe Price IDs')
}
// 4. 检查是否有奇怪的套餐
console.log('\n5. Checking for unusual plans:')
const plansWithoutId = allPlans.filter(plan => !plan.id || plan.id.trim() === '')
if (plansWithoutId.length > 0) {
console.log(` ⚠️ Found ${plansWithoutId.length} plans without proper ID:`)
plansWithoutId.forEach(plan => {
console.log(` - Display Name: "${plan.displayName}"`)
console.log(` - ID: "${plan.id}"`)
})
}
const plansWithEmptyName = allPlans.filter(plan => !plan.name || plan.name.trim() === '')
if (plansWithEmptyName.length > 0) {
console.log(` ⚠️ Found ${plansWithEmptyName.length} plans without proper name:`)
plansWithEmptyName.forEach(plan => {
console.log(` - Display Name: "${plan.displayName}"`)
console.log(` - Name: "${plan.name}"`)
console.log(` - ID: "${plan.id}"`)
})
}
console.log('\n🎉 Debug completed!')
} catch (error) {
console.error('❌ Debug failed:', error)
throw error
} finally {
await prisma.$disconnect()
}
}
// 运行调试
if (require.main === module) {
debugPricingPlans()
.then(() => {
console.log('✅ Debug completed!')
process.exit(0)
})
.catch((error) => {
console.error('❌ Debug failed:', error)
process.exit(1)
})
}
export { debugPricingPlans }