🛂 Add setCustomPlan script
This commit is contained in:
@@ -1,2 +1,8 @@
|
|||||||
DATABASE_URL=postgresql://postgres:typebot@localhost:5432/typebot
|
DATABASE_URL=postgresql://postgres:typebot@localhost:5432/typebot
|
||||||
ENCRYPTION_SECRET=
|
ENCRYPTION_SECRET=
|
||||||
|
|
||||||
|
# For setCustomPlan
|
||||||
|
STRIPE_SECRET_KEY=
|
||||||
|
STRIPE_SUBSCRIPTION_ID=
|
||||||
|
STRIPE_PRODUCT_ID=
|
||||||
|
WORKSPACE_ID=
|
||||||
@@ -1,23 +1,22 @@
|
|||||||
import { PrismaClient } from 'db'
|
import { PrismaClient } from 'db'
|
||||||
import path from 'path'
|
import path from 'path'
|
||||||
|
import { setCustomPlan } from './setCustomPlan'
|
||||||
|
|
||||||
require('dotenv').config({
|
require('dotenv').config({
|
||||||
path: path.join(
|
path: path.join(
|
||||||
__dirname,
|
__dirname,
|
||||||
process.env.NODE_ENV === 'staging' ? '.env.staging' : '.env.local'
|
process.env.NODE_ENV === 'production'
|
||||||
|
? '.env.production'
|
||||||
|
: process.env.NODE_ENV === 'staging'
|
||||||
|
? '.env.staging'
|
||||||
|
: '.env.local'
|
||||||
),
|
),
|
||||||
})
|
})
|
||||||
|
|
||||||
const prisma = new PrismaClient({ log: ['query', 'info', 'warn', 'error'] })
|
const prisma = new PrismaClient({ log: ['query', 'info', 'warn', 'error'] })
|
||||||
|
|
||||||
const main = async () => {
|
const main = async () => {
|
||||||
const workspaces = await prisma.workspace.findMany({
|
setCustomPlan()
|
||||||
where: {
|
|
||||||
members: { some: { userId: 'coucou' } },
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
console.log(workspaces)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
main().then()
|
main().then()
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
"emails": "workspace:*",
|
"emails": "workspace:*",
|
||||||
"got": "12.5.2",
|
"got": "12.5.2",
|
||||||
"models": "workspace:*",
|
"models": "workspace:*",
|
||||||
|
"stripe": "10.17.0",
|
||||||
"tsx": "3.12.1",
|
"tsx": "3.12.1",
|
||||||
"typescript": "4.8.4",
|
"typescript": "4.8.4",
|
||||||
"utils": "workspace:*"
|
"utils": "workspace:*"
|
||||||
|
|||||||
83
packages/scripts/setCustomPlan.ts
Normal file
83
packages/scripts/setCustomPlan.ts
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
import { Plan, PrismaClient } from 'db'
|
||||||
|
import Stripe from 'stripe'
|
||||||
|
|
||||||
|
const prisma = new PrismaClient()
|
||||||
|
|
||||||
|
export const setCustomPlan = async () => {
|
||||||
|
if (
|
||||||
|
!process.env.STRIPE_SECRET_KEY ||
|
||||||
|
!process.env.STRIPE_PRODUCT_ID ||
|
||||||
|
!process.env.STRIPE_SUBSCRIPTION_ID ||
|
||||||
|
!process.env.WORKSPACE_ID
|
||||||
|
)
|
||||||
|
throw Error(
|
||||||
|
'STRIPE_SECRET_KEY or STRIPE_SUBSCRIPTION_ID or STRIPE_PRODUCT_ID or process.env.WORKSPACE_ID var is missing'
|
||||||
|
)
|
||||||
|
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY, {
|
||||||
|
apiVersion: '2022-08-01',
|
||||||
|
})
|
||||||
|
|
||||||
|
const claimablePlan = await prisma.claimableCustomPlan.findFirst({
|
||||||
|
where: { workspaceId: process.env.WORKSPACE_ID, claimedAt: null },
|
||||||
|
})
|
||||||
|
|
||||||
|
if (!claimablePlan) throw Error('No claimable plan found')
|
||||||
|
|
||||||
|
console.log('Claimable plan found')
|
||||||
|
|
||||||
|
const { items: existingItems } = await stripe.subscriptions.retrieve(
|
||||||
|
process.env.STRIPE_SUBSCRIPTION_ID
|
||||||
|
)
|
||||||
|
if (existingItems.data.length === 0) return
|
||||||
|
|
||||||
|
const planItem = existingItems.data.find(
|
||||||
|
(item) => item.plan.product === process.env.STRIPE_PRODUCT_ID
|
||||||
|
)
|
||||||
|
|
||||||
|
if (!planItem) throw Error("Couldn't find plan item")
|
||||||
|
|
||||||
|
console.log('Updating subscription...')
|
||||||
|
|
||||||
|
await stripe.subscriptions.update(process.env.STRIPE_SUBSCRIPTION_ID, {
|
||||||
|
items: [
|
||||||
|
{
|
||||||
|
id: planItem.id,
|
||||||
|
price_data: {
|
||||||
|
currency: 'usd',
|
||||||
|
tax_behavior: 'exclusive',
|
||||||
|
recurring: { interval: 'month' },
|
||||||
|
product: process.env.STRIPE_PRODUCT_ID,
|
||||||
|
unit_amount: claimablePlan.price * 100,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
...existingItems.data
|
||||||
|
.filter((item) => item.plan.product !== process.env.STRIPE_PRODUCT_ID)
|
||||||
|
.map((item) => ({ id: item.id, deleted: true })),
|
||||||
|
],
|
||||||
|
})
|
||||||
|
|
||||||
|
console.log('Subscription updated!')
|
||||||
|
|
||||||
|
console.log('Updating workspace...')
|
||||||
|
|
||||||
|
await prisma.workspace.update({
|
||||||
|
where: { id: process.env.WORKSPACE_ID },
|
||||||
|
data: {
|
||||||
|
plan: Plan.CUSTOM,
|
||||||
|
customChatsLimit: claimablePlan.chatsLimit,
|
||||||
|
customSeatsLimit: claimablePlan.seatsLimit,
|
||||||
|
customStorageLimit: claimablePlan.storageLimit,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
console.log('Workspace updated!')
|
||||||
|
|
||||||
|
console.log('Updating claimable plan...')
|
||||||
|
|
||||||
|
await prisma.claimableCustomPlan.update({
|
||||||
|
where: { id: claimablePlan.id },
|
||||||
|
data: { claimedAt: new Date() },
|
||||||
|
})
|
||||||
|
|
||||||
|
console.log('Claimable plan updated!')
|
||||||
|
}
|
||||||
3
pnpm-lock.yaml
generated
3
pnpm-lock.yaml
generated
@@ -549,6 +549,7 @@ importers:
|
|||||||
emails: workspace:*
|
emails: workspace:*
|
||||||
got: 12.5.2
|
got: 12.5.2
|
||||||
models: workspace:*
|
models: workspace:*
|
||||||
|
stripe: 10.17.0
|
||||||
tsx: 3.12.1
|
tsx: 3.12.1
|
||||||
typescript: 4.8.4
|
typescript: 4.8.4
|
||||||
utils: workspace:*
|
utils: workspace:*
|
||||||
@@ -559,6 +560,7 @@ importers:
|
|||||||
emails: link:../emails
|
emails: link:../emails
|
||||||
got: 12.5.2
|
got: 12.5.2
|
||||||
models: link:../models
|
models: link:../models
|
||||||
|
stripe: 10.17.0
|
||||||
tsx: 3.12.1
|
tsx: 3.12.1
|
||||||
typescript: 4.8.4
|
typescript: 4.8.4
|
||||||
utils: link:../utils
|
utils: link:../utils
|
||||||
@@ -16933,7 +16935,6 @@ packages:
|
|||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 18.11.9
|
'@types/node': 18.11.9
|
||||||
qs: 6.11.0
|
qs: 6.11.0
|
||||||
dev: false
|
|
||||||
|
|
||||||
/strnum/1.0.5:
|
/strnum/1.0.5:
|
||||||
resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==}
|
resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==}
|
||||||
|
|||||||
Reference in New Issue
Block a user