From b1c9d8b2d451feda42749b0bf53ec8eb8bdfa7f2 Mon Sep 17 00:00:00 2001 From: Alessandro Magionami Date: Fri, 21 Mar 2025 11:14:34 +0100 Subject: [PATCH] feat(gatekeeper): on invoice created trigger downscale --- .../server/modules/gatekeeper/rest/billing.ts | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/packages/server/modules/gatekeeper/rest/billing.ts b/packages/server/modules/gatekeeper/rest/billing.ts index 5aefe102e..1b681cd53 100644 --- a/packages/server/modules/gatekeeper/rest/billing.ts +++ b/packages/server/modules/gatekeeper/rest/billing.ts @@ -22,6 +22,7 @@ import { withTransaction } from '@/modules/shared/helpers/dbHelper' import { getStripeClient } from '@/modules/gatekeeper/stripe' import { handleSubscriptionUpdateFactory } from '@/modules/gatekeeper/services/subscriptions' import { getEventBus } from '@/modules/shared/services/eventBus' +import { SubscriptionData } from '@/modules/gatekeeper/domain/billing' export const getBillingRouter = (): Router => { const router = Router() @@ -144,6 +145,19 @@ export const getBillingRouter = (): Router => { })({ subscriptionData: parseSubscriptionData(event.data.object) }) break + case 'invoice.created': + const subscriptionData = await getSubscriptionFromEventFactory({ stripe })( + event + ) + if (!subscriptionData) break + await handleSubscriptionUpdateFactory({ + getWorkspacePlan: getWorkspacePlanFactory({ db }), + upsertPaidWorkspacePlan: upsertPaidWorkspacePlanFactory({ db }), + getWorkspaceSubscriptionBySubscriptionId: + getWorkspaceSubscriptionBySubscriptionIdFactory({ db }), + upsertWorkspaceSubscription: upsertWorkspaceSubscriptionFactory({ db }) + })({ subscriptionData }) + break default: break @@ -154,3 +168,18 @@ export const getBillingRouter = (): Router => { return router } + +const getSubscriptionFromEventFactory = + ({ stripe }: { stripe: Stripe }) => + async (event: Stripe.InvoiceCreatedEvent): Promise => { + const subscription = event.data.object.subscription + if (!subscription) { + return null + } + if (typeof subscription === 'string') { + return await getSubscriptionDataFactory({ stripe })({ + subscriptionId: subscription + }) + } + return parseSubscriptionData(subscription) + }