110 lines
2.8 KiB
TypeScript
110 lines
2.8 KiB
TypeScript
import { PrismaClient } from '@typebot.io/prisma'
|
|
import { promptAndSetEnvironment } from './utils'
|
|
import { writeFileSync } from 'fs'
|
|
import Stripe from 'stripe'
|
|
|
|
const migrateSubscriptionItemPriceId = async () => {
|
|
await promptAndSetEnvironment()
|
|
const prisma = new PrismaClient({
|
|
log: [{ emit: 'event', level: 'query' }, 'info', 'warn', 'error'],
|
|
})
|
|
|
|
prisma.$on('query', (e) => {
|
|
console.log(e.query)
|
|
console.log(e.params)
|
|
console.log(e.duration, 'ms')
|
|
})
|
|
|
|
if (
|
|
!process.env.STRIPE_STARTER_CHATS_PRICE_ID_OLD ||
|
|
!process.env.STRIPE_STARTER_CHATS_PRICE_ID ||
|
|
!process.env.STRIPE_PRO_CHATS_PRICE_ID_OLD ||
|
|
!process.env.STRIPE_PRO_CHATS_PRICE_ID ||
|
|
!process.env.STRIPE_SECRET_KEY
|
|
)
|
|
throw new Error('Missing some env variables')
|
|
|
|
const workspacesWithPaidPlan = await prisma.workspace.findMany({
|
|
where: {
|
|
plan: {
|
|
in: ['PRO', 'STARTER'],
|
|
},
|
|
isSuspended: false,
|
|
},
|
|
select: {
|
|
plan: true,
|
|
name: true,
|
|
id: true,
|
|
stripeId: true,
|
|
isQuarantined: true,
|
|
members: {
|
|
select: {
|
|
user: {
|
|
select: { email: true },
|
|
},
|
|
},
|
|
},
|
|
},
|
|
})
|
|
|
|
writeFileSync(
|
|
'./workspacesWithPaidPlan.json',
|
|
JSON.stringify(workspacesWithPaidPlan, null, 2)
|
|
)
|
|
|
|
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY, {
|
|
apiVersion: '2022-11-15',
|
|
})
|
|
|
|
let i = 0
|
|
for (const workspace of workspacesWithPaidPlan) {
|
|
i += 1
|
|
console.log(
|
|
`(${i} / ${workspacesWithPaidPlan.length})`,
|
|
'Migrating workspace:',
|
|
workspace.id,
|
|
workspace.name,
|
|
workspace.stripeId,
|
|
JSON.stringify(workspace.members.map((member) => member.user.email))
|
|
)
|
|
if (!workspace.stripeId) {
|
|
console.log('No stripe ID, skipping...')
|
|
continue
|
|
}
|
|
|
|
const subscriptions = await stripe.subscriptions.list({
|
|
customer: workspace.stripeId,
|
|
})
|
|
|
|
const currentSubscription = subscriptions.data
|
|
.filter((sub) => ['past_due', 'active'].includes(sub.status))
|
|
.sort((a, b) => a.created - b.created)
|
|
.shift()
|
|
|
|
if (!currentSubscription) {
|
|
console.log('No current subscription in workspace:', workspace.id)
|
|
continue
|
|
}
|
|
|
|
const subscriptionItem = currentSubscription.items.data.find(
|
|
(item) =>
|
|
item.price.id === process.env.STRIPE_STARTER_CHATS_PRICE_ID_OLD ||
|
|
item.price.id === process.env.STRIPE_PRO_CHATS_PRICE_ID_OLD
|
|
)
|
|
|
|
if (!subscriptionItem) {
|
|
console.log('Could not find subscriptio item. Skipping...')
|
|
continue
|
|
}
|
|
|
|
await stripe.subscriptionItems.update(subscriptionItem.id, {
|
|
price:
|
|
workspace.plan === 'STARTER'
|
|
? process.env.STRIPE_STARTER_CHATS_PRICE_ID
|
|
: process.env.STRIPE_PRO_CHATS_PRICE_ID,
|
|
})
|
|
}
|
|
}
|
|
|
|
migrateSubscriptionItemPriceId()
|