From 6fdbf98eedb0c15138383ae258ba57c7dd4b08a5 Mon Sep 17 00:00:00 2001 From: Baptiste Arnaud Date: Wed, 16 Nov 2022 09:04:37 +0100 Subject: [PATCH] :passport_control: Add setCustomPlan script --- packages/scripts/.env.local.example | 8 ++- packages/scripts/index.ts | 15 +++--- packages/scripts/package.json | 1 + packages/scripts/setCustomPlan.ts | 83 +++++++++++++++++++++++++++++ pnpm-lock.yaml | 3 +- 5 files changed, 100 insertions(+), 10 deletions(-) create mode 100644 packages/scripts/setCustomPlan.ts diff --git a/packages/scripts/.env.local.example b/packages/scripts/.env.local.example index 71c1af2d4d1..7f890f9deb8 100644 --- a/packages/scripts/.env.local.example +++ b/packages/scripts/.env.local.example @@ -1,2 +1,8 @@ DATABASE_URL=postgresql://postgres:typebot@localhost:5432/typebot -ENCRYPTION_SECRET= \ No newline at end of file +ENCRYPTION_SECRET= + +# For setCustomPlan +STRIPE_SECRET_KEY= +STRIPE_SUBSCRIPTION_ID= +STRIPE_PRODUCT_ID= +WORKSPACE_ID= \ No newline at end of file diff --git a/packages/scripts/index.ts b/packages/scripts/index.ts index 227ccaacf41..fab1b5e0520 100644 --- a/packages/scripts/index.ts +++ b/packages/scripts/index.ts @@ -1,23 +1,22 @@ import { PrismaClient } from 'db' import path from 'path' +import { setCustomPlan } from './setCustomPlan' require('dotenv').config({ path: path.join( __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 main = async () => { - const workspaces = await prisma.workspace.findMany({ - where: { - members: { some: { userId: 'coucou' } }, - }, - }) - - console.log(workspaces) + setCustomPlan() } main().then() diff --git a/packages/scripts/package.json b/packages/scripts/package.json index 4d820deccb0..e679eab9caa 100644 --- a/packages/scripts/package.json +++ b/packages/scripts/package.json @@ -16,6 +16,7 @@ "emails": "workspace:*", "got": "12.5.2", "models": "workspace:*", + "stripe": "10.17.0", "tsx": "3.12.1", "typescript": "4.8.4", "utils": "workspace:*" diff --git a/packages/scripts/setCustomPlan.ts b/packages/scripts/setCustomPlan.ts new file mode 100644 index 00000000000..5512c4cce54 --- /dev/null +++ b/packages/scripts/setCustomPlan.ts @@ -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!') +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bb38d2aff5e..fdd78934c97 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -549,6 +549,7 @@ importers: emails: workspace:* got: 12.5.2 models: workspace:* + stripe: 10.17.0 tsx: 3.12.1 typescript: 4.8.4 utils: workspace:* @@ -559,6 +560,7 @@ importers: emails: link:../emails got: 12.5.2 models: link:../models + stripe: 10.17.0 tsx: 3.12.1 typescript: 4.8.4 utils: link:../utils @@ -16933,7 +16935,6 @@ packages: dependencies: '@types/node': 18.11.9 qs: 6.11.0 - dev: false /strnum/1.0.5: resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==}