diff options
| author | Frank <[email protected]> | 2026-01-22 16:59:32 -0500 |
|---|---|---|
| committer | Frank <[email protected]> | 2026-01-22 17:02:46 -0500 |
| commit | 5f3ab9395fc8f8543724dcda914d38fba0809049 (patch) | |
| tree | 3be83aa5cc4e4556b62f9ff6b23933f8699eea63 /packages/console/core/script | |
| parent | fdac21688c9acc4087b83e71cb7e0fd1d2d57f00 (diff) | |
| download | opencode-5f3ab9395fc8f8543724dcda914d38fba0809049.tar.gz opencode-5f3ab9395fc8f8543724dcda914d38fba0809049.zip | |
wip: zen black
Diffstat (limited to 'packages/console/core/script')
| -rw-r--r-- | packages/console/core/script/black-gift.ts | 9 | ||||
| -rw-r--r-- | packages/console/core/script/black-onboard.ts | 173 | ||||
| -rw-r--r-- | packages/console/core/script/lookup-user.ts | 2 |
3 files changed, 8 insertions, 176 deletions
diff --git a/packages/console/core/script/black-gift.ts b/packages/console/core/script/black-gift.ts index ec7db8799..c666a1ab6 100644 --- a/packages/console/core/script/black-gift.ts +++ b/packages/console/core/script/black-gift.ts @@ -5,8 +5,11 @@ import { BillingTable, PaymentTable, SubscriptionTable } from "../src/schema/bil import { Identifier } from "../src/identifier.js" import { centsToMicroCents } from "../src/util/price.js" import { AuthTable } from "../src/schema/auth.sql.js" +import { BlackData } from "../src/black.js" +import { Actor } from "../src/actor.js" const plan = "200" +const couponID = "JAIr0Pe1" const workspaceID = process.argv[2] const seats = parseInt(process.argv[3]) @@ -61,16 +64,18 @@ const customerID = .then((customer) => customer.id))()) console.log(`Customer ID: ${customerID}`) -const couponID = "JAIr0Pe1" const subscription = await Billing.stripe().subscriptions.create({ customer: customerID!, items: [ { - price: `price_1SmfyI2StuRr0lbXovxJNeZn`, + price: BlackData.planToPriceID({ plan }), discounts: [{ coupon: couponID }], quantity: seats, }, ], + metadata: { + workspaceID, + }, }) console.log(`Subscription ID: ${subscription.id}`) diff --git a/packages/console/core/script/black-onboard.ts b/packages/console/core/script/black-onboard.ts deleted file mode 100644 index 77e5b779e..000000000 --- a/packages/console/core/script/black-onboard.ts +++ /dev/null @@ -1,173 +0,0 @@ -import { Billing } from "../src/billing.js" -import { and, Database, eq, isNull, sql } from "../src/drizzle/index.js" -import { UserTable } from "../src/schema/user.sql.js" -import { BillingTable, PaymentTable, SubscriptionTable } from "../src/schema/billing.sql.js" -import { Identifier } from "../src/identifier.js" -import { centsToMicroCents } from "../src/util/price.js" -import { AuthTable } from "../src/schema/auth.sql.js" - -const workspaceID = process.argv[2] -const email = process.argv[3] - -console.log(`Onboarding workspace ${workspaceID} for email ${email}`) - -if (!workspaceID || !email) { - console.error("Usage: bun foo.ts <workspaceID> <email>") - process.exit(1) -} - -// Look up the Stripe customer by email -const customers = await Billing.stripe().customers.list({ email, limit: 10, expand: ["data.subscriptions"] }) -if (!customers.data) { - console.error(`Error: No Stripe customer found for email ${email}`) - process.exit(1) -} -const customer = customers.data.find((c) => c.subscriptions?.data[0]?.items.data[0]?.price.unit_amount === 20000) -if (!customer) { - console.error(`Error: No Stripe customer found for email ${email} with $200 subscription`) - process.exit(1) -} - -const customerID = customer.id -const subscription = customer.subscriptions!.data[0] -const subscriptionID = subscription.id - -// Validate the subscription is $200 -const amountInCents = subscription.items.data[0]?.price.unit_amount ?? 0 -if (amountInCents !== 20000) { - console.error(`Error: Subscription amount is $${amountInCents / 100}, expected $200`) - process.exit(1) -} - -const subscriptionData = await Billing.stripe().subscriptions.retrieve(subscription.id, { expand: ["discounts"] }) -const couponID = - typeof subscriptionData.discounts[0] === "string" - ? subscriptionData.discounts[0] - : subscriptionData.discounts[0]?.coupon?.id - -// Check if subscription is already tied to another workspace -const existingSubscription = await Database.use((tx) => - tx - .select({ workspaceID: BillingTable.workspaceID }) - .from(BillingTable) - .where(sql`JSON_EXTRACT(${BillingTable.subscription}, '$.id') = ${subscriptionID}`) - .then((rows) => rows[0]), -) -if (existingSubscription) { - console.error( - `Error: Subscription ${subscriptionID} is already tied to workspace ${existingSubscription.workspaceID}`, - ) - process.exit(1) -} - -// Look up the workspace billing and check if it already has a customer id or subscription -const billing = await Database.use((tx) => - tx - .select({ customerID: BillingTable.customerID, subscriptionID: BillingTable.subscriptionID }) - .from(BillingTable) - .where(eq(BillingTable.workspaceID, workspaceID)) - .then((rows) => rows[0]), -) -if (billing?.subscriptionID) { - console.error(`Error: Workspace ${workspaceID} already has a subscription: ${billing.subscriptionID}`) - process.exit(1) -} -if (billing?.customerID) { - console.warn( - `Warning: Workspace ${workspaceID} already has a customer id: ${billing.customerID}, replacing with ${customerID}`, - ) -} - -// Get the latest invoice and payment from the subscription -const invoices = await Billing.stripe().invoices.list({ - subscription: subscriptionID, - limit: 1, - expand: ["data.payments"], -}) -const invoice = invoices.data[0] -const invoiceID = invoice?.id -const paymentID = invoice?.payments?.data[0]?.payment.payment_intent as string | undefined - -// Get the default payment method from the customer -const paymentMethodID = (customer.invoice_settings.default_payment_method ?? subscription.default_payment_method) as - | string - | null -const paymentMethod = paymentMethodID ? await Billing.stripe().paymentMethods.retrieve(paymentMethodID) : null -const paymentMethodLast4 = paymentMethod?.card?.last4 ?? null -const paymentMethodType = paymentMethod?.type ?? null - -// Look up the user in the workspace -const users = await Database.use((tx) => - tx - .select({ id: UserTable.id, email: AuthTable.subject }) - .from(UserTable) - .innerJoin(AuthTable, and(eq(AuthTable.accountID, UserTable.accountID), eq(AuthTable.provider, "email"))) - .where(and(eq(UserTable.workspaceID, workspaceID), isNull(UserTable.timeDeleted))), -) -if (users.length === 0) { - console.error(`Error: No users found in workspace ${workspaceID}`) - process.exit(1) -} -const user = users.length === 1 ? users[0] : users.find((u) => u.email === email) -if (!user) { - console.error(`Error: User with email ${email} not found in workspace ${workspaceID}`) - process.exit(1) -} - -// Set workspaceID in Stripe customer metadata -await Billing.stripe().customers.update(customerID, { - metadata: { - workspaceID, - }, -}) - -await Database.transaction(async (tx) => { - // Set customer id, subscription id, and payment method on workspace billing - await tx - .update(BillingTable) - .set({ - customerID, - subscriptionID, - paymentMethodID, - paymentMethodLast4, - paymentMethodType, - subscription: { - status: "subscribed", - coupon: couponID, - seats: 1, - plan: "200", - }, - }) - .where(eq(BillingTable.workspaceID, workspaceID)) - - // Create a row in subscription table - await tx.insert(SubscriptionTable).values({ - workspaceID, - id: Identifier.create("subscription"), - userID: user.id, - }) - - // Create a row in payments table - await tx.insert(PaymentTable).values({ - workspaceID, - id: Identifier.create("payment"), - amount: centsToMicroCents(amountInCents), - customerID, - invoiceID, - paymentID, - enrichment: { - type: "subscription", - couponID, - }, - }) -}) - -console.log(`Successfully onboarded workspace ${workspaceID}`) -console.log(` Customer ID: ${customerID}`) -console.log(` Subscription ID: ${subscriptionID}`) -console.log( - ` Payment Method: ${paymentMethodID ?? "(none)"} (${paymentMethodType ?? "unknown"} ending in ${paymentMethodLast4 ?? "????"})`, -) -console.log(` User ID: ${user.id}`) -console.log(` Invoice ID: ${invoiceID ?? "(none)"}`) -console.log(` Payment ID: ${paymentID ?? "(none)"}`) diff --git a/packages/console/core/script/lookup-user.ts b/packages/console/core/script/lookup-user.ts index 6c76d42c9..0a614bc15 100644 --- a/packages/console/core/script/lookup-user.ts +++ b/packages/console/core/script/lookup-user.ts @@ -244,7 +244,7 @@ function getSubscriptionStatus(row: { return { weekly: null, rolling: null, rateLimited: null, retryIn: null } } - const black = BlackData.get({ plan: row.subscription.plan }) + const black = BlackData.getLimits({ plan: row.subscription.plan }) const now = new Date() const week = getWeekBounds(now) |
