summaryrefslogtreecommitdiffhomepage
path: root/packages/console/core/script
diff options
context:
space:
mode:
authorFrank <[email protected]>2026-01-22 16:59:32 -0500
committerFrank <[email protected]>2026-01-22 17:02:46 -0500
commit5f3ab9395fc8f8543724dcda914d38fba0809049 (patch)
tree3be83aa5cc4e4556b62f9ff6b23933f8699eea63 /packages/console/core/script
parentfdac21688c9acc4087b83e71cb7e0fd1d2d57f00 (diff)
downloadopencode-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.ts9
-rw-r--r--packages/console/core/script/black-onboard.ts173
-rw-r--r--packages/console/core/script/lookup-user.ts2
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)