129 lines
4.7 KiB
TypeScript
129 lines
4.7 KiB
TypeScript
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 }
|