From 830e49c5b17da42d27aa0f543c72e38d52447b6a Mon Sep 17 00:00:00 2001 From: Etienne <45695613+etiennejouan@users.noreply.github.com> Date: Fri, 20 Jun 2025 18:18:50 +0200 Subject: [PATCH] Onboarding - delete PENDING_CREATION workspace if billing is deactivated (#12704) [More context details](https://discord.com/channels/1130383047699738754/1384834012882927637/1384834143673778226) --- .../stripe-subscription-updated-events.ts | 0 .../billing-webhook.controller.ts} | 18 ++--- .../billing-webhook/billing-webhook.module.ts | 66 +++++++++++++++++++ .../services/billing-webhook-alert.service.ts | 0 .../billing-webhook-customer.service.ts | 0 .../billing-webhook-entitlement.service.ts | 3 +- .../billing-webhook-invoice.service.ts | 0 .../services/billing-webhook-price.service.ts | 2 +- .../billing-webhook-product.service.ts | 2 +- .../billing-webhook-subscription.service.ts | 21 ++++-- ...rom-stripe-subscription-event.util.spec.ts | 4 +- ...event-to-database-entitlement.util.spec.ts | 2 +- ...price-event-to-database-price.util.spec.ts | 2 +- ...uct-event-to-database-product.util.spec.ts | 2 +- ...on-event-to-database-customer.util.spec.ts | 3 +- ...vent-to-database-subscription.util.spec.ts | 2 +- ...ids-from-stripe-subscription-event.util.ts | 0 ...ated-event-to-database-entitlement.util.ts | 0 ...ripe-price-event-to-database-price.util.ts | 0 ...-product-event-to-database-product.util.ts | 0 ...ription-event-to-database-customer.util.ts | 0 ...vent-to-database-subscription-item.util.ts | 0 ...ion-event-to-database-subscription.util.ts | 0 .../core-modules/billing/billing.module.ts | 16 ----- .../services/billing-subscription.service.ts | 4 +- .../engine/core-modules/core-engine.module.ts | 2 + 26 files changed, 105 insertions(+), 44 deletions(-) rename packages/twenty-server/src/engine/core-modules/{billing/webhooks => billing-webhook}/__mocks__/stripe-subscription-updated-events.ts (100%) rename packages/twenty-server/src/engine/core-modules/{billing/billing.controller.ts => billing-webhook/billing-webhook.controller.ts} (89%) create mode 100644 packages/twenty-server/src/engine/core-modules/billing-webhook/billing-webhook.module.ts rename packages/twenty-server/src/engine/core-modules/{billing/webhooks => billing-webhook}/services/billing-webhook-alert.service.ts (100%) rename packages/twenty-server/src/engine/core-modules/{billing/webhooks => billing-webhook}/services/billing-webhook-customer.service.ts (100%) rename packages/twenty-server/src/engine/core-modules/{billing/webhooks => billing-webhook}/services/billing-webhook-entitlement.service.ts (92%) rename packages/twenty-server/src/engine/core-modules/{billing/webhooks => billing-webhook}/services/billing-webhook-invoice.service.ts (100%) rename packages/twenty-server/src/engine/core-modules/{billing/webhooks => billing-webhook}/services/billing-webhook-price.service.ts (96%) rename packages/twenty-server/src/engine/core-modules/{billing/webhooks => billing-webhook}/services/billing-webhook-product.service.ts (93%) rename packages/twenty-server/src/engine/core-modules/{billing/webhooks => billing-webhook}/services/billing-webhook-subscription.service.ts (88%) rename packages/twenty-server/src/engine/core-modules/{billing/webhooks => billing-webhook}/utils/__tests__/get-deleted-stripe-subscription-item-ids-from-stripe-subscription-event.util.spec.ts (83%) rename packages/twenty-server/src/engine/core-modules/{billing/webhooks => billing-webhook}/utils/__tests__/transform-stripe-entitlement-updated-event-to-database-entitlement.util.spec.ts (95%) rename packages/twenty-server/src/engine/core-modules/{billing/webhooks => billing-webhook}/utils/__tests__/transform-stripe-price-event-to-database-price.util.spec.ts (98%) rename packages/twenty-server/src/engine/core-modules/{billing/webhooks => billing-webhook}/utils/__tests__/transform-stripe-product-event-to-database-product.util.spec.ts (95%) rename packages/twenty-server/src/engine/core-modules/{billing/webhooks => billing-webhook}/utils/__tests__/transform-stripe-subscription-event-to-database-customer.util.spec.ts (95%) rename packages/twenty-server/src/engine/core-modules/{billing/webhooks => billing-webhook}/utils/__tests__/transform-stripe-subscription-event-to-database-subscription.util.spec.ts (97%) rename packages/twenty-server/src/engine/core-modules/{billing/webhooks => billing-webhook}/utils/get-deleted-stripe-subscription-item-ids-from-stripe-subscription-event.util.ts (100%) rename packages/twenty-server/src/engine/core-modules/{billing/webhooks => billing-webhook}/utils/transform-stripe-entitlement-updated-event-to-database-entitlement.util.ts (100%) rename packages/twenty-server/src/engine/core-modules/{billing/webhooks => billing-webhook}/utils/transform-stripe-price-event-to-database-price.util.ts (100%) rename packages/twenty-server/src/engine/core-modules/{billing/webhooks => billing-webhook}/utils/transform-stripe-product-event-to-database-product.util.ts (100%) rename packages/twenty-server/src/engine/core-modules/{billing/webhooks => billing-webhook}/utils/transform-stripe-subscription-event-to-database-customer.util.ts (100%) rename packages/twenty-server/src/engine/core-modules/{billing/webhooks => billing-webhook}/utils/transform-stripe-subscription-event-to-database-subscription-item.util.ts (100%) rename packages/twenty-server/src/engine/core-modules/{billing/webhooks => billing-webhook}/utils/transform-stripe-subscription-event-to-database-subscription.util.ts (100%) diff --git a/packages/twenty-server/src/engine/core-modules/billing/webhooks/__mocks__/stripe-subscription-updated-events.ts b/packages/twenty-server/src/engine/core-modules/billing-webhook/__mocks__/stripe-subscription-updated-events.ts similarity index 100% rename from packages/twenty-server/src/engine/core-modules/billing/webhooks/__mocks__/stripe-subscription-updated-events.ts rename to packages/twenty-server/src/engine/core-modules/billing-webhook/__mocks__/stripe-subscription-updated-events.ts diff --git a/packages/twenty-server/src/engine/core-modules/billing/billing.controller.ts b/packages/twenty-server/src/engine/core-modules/billing-webhook/billing-webhook.controller.ts similarity index 89% rename from packages/twenty-server/src/engine/core-modules/billing/billing.controller.ts rename to packages/twenty-server/src/engine/core-modules/billing-webhook/billing-webhook.controller.ts index 383569a7f..e32c28a8c 100644 --- a/packages/twenty-server/src/engine/core-modules/billing/billing.controller.ts +++ b/packages/twenty-server/src/engine/core-modules/billing-webhook/billing-webhook.controller.ts @@ -15,6 +15,13 @@ import { import { Response } from 'express'; import Stripe from 'stripe'; +import { BillingWebhookAlertService } from 'src/engine/core-modules/billing-webhook/services/billing-webhook-alert.service'; +import { BillingWebhookCustomerService } from 'src/engine/core-modules/billing-webhook/services/billing-webhook-customer.service'; +import { BillingWebhookEntitlementService } from 'src/engine/core-modules/billing-webhook/services/billing-webhook-entitlement.service'; +import { BillingWebhookInvoiceService } from 'src/engine/core-modules/billing-webhook/services/billing-webhook-invoice.service'; +import { BillingWebhookPriceService } from 'src/engine/core-modules/billing-webhook/services/billing-webhook-price.service'; +import { BillingWebhookProductService } from 'src/engine/core-modules/billing-webhook/services/billing-webhook-product.service'; +import { BillingWebhookSubscriptionService } from 'src/engine/core-modules/billing-webhook/services/billing-webhook-subscription.service'; import { BillingException, BillingExceptionCode, @@ -23,19 +30,12 @@ import { BillingWebhookEvent } from 'src/engine/core-modules/billing/enums/billi import { BillingRestApiExceptionFilter } from 'src/engine/core-modules/billing/filters/billing-api-exception.filter'; import { BillingSubscriptionService } from 'src/engine/core-modules/billing/services/billing-subscription.service'; import { StripeWebhookService } from 'src/engine/core-modules/billing/stripe/services/stripe-webhook.service'; -import { BillingWebhookAlertService } from 'src/engine/core-modules/billing/webhooks/services/billing-webhook-alert.service'; -import { BillingWebhookCustomerService } from 'src/engine/core-modules/billing/webhooks/services/billing-webhook-customer.service'; -import { BillingWebhookEntitlementService } from 'src/engine/core-modules/billing/webhooks/services/billing-webhook-entitlement.service'; -import { BillingWebhookInvoiceService } from 'src/engine/core-modules/billing/webhooks/services/billing-webhook-invoice.service'; -import { BillingWebhookPriceService } from 'src/engine/core-modules/billing/webhooks/services/billing-webhook-price.service'; -import { BillingWebhookProductService } from 'src/engine/core-modules/billing/webhooks/services/billing-webhook-product.service'; -import { BillingWebhookSubscriptionService } from 'src/engine/core-modules/billing/webhooks/services/billing-webhook-subscription.service'; import { PublicEndpointGuard } from 'src/engine/guards/public-endpoint.guard'; @Controller() @UseFilters(BillingRestApiExceptionFilter) -export class BillingController { - protected readonly logger = new Logger(BillingController.name); +export class BillingWebhookController { + protected readonly logger = new Logger(BillingWebhookController.name); constructor( private readonly stripeWebhookService: StripeWebhookService, diff --git a/packages/twenty-server/src/engine/core-modules/billing-webhook/billing-webhook.module.ts b/packages/twenty-server/src/engine/core-modules/billing-webhook/billing-webhook.module.ts new file mode 100644 index 000000000..87c9abd72 --- /dev/null +++ b/packages/twenty-server/src/engine/core-modules/billing-webhook/billing-webhook.module.ts @@ -0,0 +1,66 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; + +import { BillingWebhookController } from 'src/engine/core-modules/billing-webhook/billing-webhook.controller'; +import { BillingWebhookAlertService } from 'src/engine/core-modules/billing-webhook/services/billing-webhook-alert.service'; +import { BillingWebhookCustomerService } from 'src/engine/core-modules/billing-webhook/services/billing-webhook-customer.service'; +import { BillingWebhookEntitlementService } from 'src/engine/core-modules/billing-webhook/services/billing-webhook-entitlement.service'; +import { BillingWebhookInvoiceService } from 'src/engine/core-modules/billing-webhook/services/billing-webhook-invoice.service'; +import { BillingWebhookPriceService } from 'src/engine/core-modules/billing-webhook/services/billing-webhook-price.service'; +import { BillingWebhookProductService } from 'src/engine/core-modules/billing-webhook/services/billing-webhook-product.service'; +import { BillingWebhookSubscriptionService } from 'src/engine/core-modules/billing-webhook/services/billing-webhook-subscription.service'; +import { BillingModule } from 'src/engine/core-modules/billing/billing.module'; +import { BillingCustomer } from 'src/engine/core-modules/billing/entities/billing-customer.entity'; +import { BillingEntitlement } from 'src/engine/core-modules/billing/entities/billing-entitlement.entity'; +import { BillingMeter } from 'src/engine/core-modules/billing/entities/billing-meter.entity'; +import { BillingPrice } from 'src/engine/core-modules/billing/entities/billing-price.entity'; +import { BillingProduct } from 'src/engine/core-modules/billing/entities/billing-product.entity'; +import { BillingSubscriptionItem } from 'src/engine/core-modules/billing/entities/billing-subscription-item.entity'; +import { BillingSubscription } from 'src/engine/core-modules/billing/entities/billing-subscription.entity'; +import { StripeModule } from 'src/engine/core-modules/billing/stripe/stripe.module'; +import { DomainManagerModule } from 'src/engine/core-modules/domain-manager/domain-manager.module'; +import { FeatureFlag } from 'src/engine/core-modules/feature-flag/feature-flag.entity'; +import { FeatureFlagModule } from 'src/engine/core-modules/feature-flag/feature-flag.module'; +import { MessageQueueModule } from 'src/engine/core-modules/message-queue/message-queue.module'; +import { UserWorkspace } from 'src/engine/core-modules/user-workspace/user-workspace.entity'; +import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; +import { WorkspaceModule } from 'src/engine/core-modules/workspace/workspace.module'; +import { PermissionsModule } from 'src/engine/metadata-modules/permissions/permissions.module'; + +@Module({ + imports: [ + FeatureFlagModule, + StripeModule, + DomainManagerModule, + MessageQueueModule, + PermissionsModule, + WorkspaceModule, + BillingModule, + TypeOrmModule.forFeature( + [ + BillingSubscription, + BillingSubscriptionItem, + BillingCustomer, + BillingProduct, + BillingPrice, + BillingMeter, + BillingEntitlement, + Workspace, + UserWorkspace, + FeatureFlag, + ], + 'core', + ), + ], + controllers: [BillingWebhookController], + providers: [ + BillingWebhookProductService, + BillingWebhookPriceService, + BillingWebhookAlertService, + BillingWebhookInvoiceService, + BillingWebhookCustomerService, + BillingWebhookSubscriptionService, + BillingWebhookEntitlementService, + ], +}) +export class BillingWebhookModule {} diff --git a/packages/twenty-server/src/engine/core-modules/billing/webhooks/services/billing-webhook-alert.service.ts b/packages/twenty-server/src/engine/core-modules/billing-webhook/services/billing-webhook-alert.service.ts similarity index 100% rename from packages/twenty-server/src/engine/core-modules/billing/webhooks/services/billing-webhook-alert.service.ts rename to packages/twenty-server/src/engine/core-modules/billing-webhook/services/billing-webhook-alert.service.ts diff --git a/packages/twenty-server/src/engine/core-modules/billing/webhooks/services/billing-webhook-customer.service.ts b/packages/twenty-server/src/engine/core-modules/billing-webhook/services/billing-webhook-customer.service.ts similarity index 100% rename from packages/twenty-server/src/engine/core-modules/billing/webhooks/services/billing-webhook-customer.service.ts rename to packages/twenty-server/src/engine/core-modules/billing-webhook/services/billing-webhook-customer.service.ts diff --git a/packages/twenty-server/src/engine/core-modules/billing/webhooks/services/billing-webhook-entitlement.service.ts b/packages/twenty-server/src/engine/core-modules/billing-webhook/services/billing-webhook-entitlement.service.ts similarity index 92% rename from packages/twenty-server/src/engine/core-modules/billing/webhooks/services/billing-webhook-entitlement.service.ts rename to packages/twenty-server/src/engine/core-modules/billing-webhook/services/billing-webhook-entitlement.service.ts index 000bf3316..df3761390 100644 --- a/packages/twenty-server/src/engine/core-modules/billing/webhooks/services/billing-webhook-entitlement.service.ts +++ b/packages/twenty-server/src/engine/core-modules/billing-webhook/services/billing-webhook-entitlement.service.ts @@ -6,13 +6,14 @@ import { InjectRepository } from '@nestjs/typeorm'; import Stripe from 'stripe'; import { Repository } from 'typeorm'; +import { transformStripeEntitlementUpdatedEventToDatabaseEntitlement } from 'src/engine/core-modules/billing-webhook/utils/transform-stripe-entitlement-updated-event-to-database-entitlement.util'; import { BillingException, BillingExceptionCode, } from 'src/engine/core-modules/billing/billing.exception'; import { BillingCustomer } from 'src/engine/core-modules/billing/entities/billing-customer.entity'; import { BillingEntitlement } from 'src/engine/core-modules/billing/entities/billing-entitlement.entity'; -import { transformStripeEntitlementUpdatedEventToDatabaseEntitlement } from 'src/engine/core-modules/billing/webhooks/utils/transform-stripe-entitlement-updated-event-to-database-entitlement.util'; + @Injectable() export class BillingWebhookEntitlementService { constructor( diff --git a/packages/twenty-server/src/engine/core-modules/billing/webhooks/services/billing-webhook-invoice.service.ts b/packages/twenty-server/src/engine/core-modules/billing-webhook/services/billing-webhook-invoice.service.ts similarity index 100% rename from packages/twenty-server/src/engine/core-modules/billing/webhooks/services/billing-webhook-invoice.service.ts rename to packages/twenty-server/src/engine/core-modules/billing-webhook/services/billing-webhook-invoice.service.ts diff --git a/packages/twenty-server/src/engine/core-modules/billing/webhooks/services/billing-webhook-price.service.ts b/packages/twenty-server/src/engine/core-modules/billing-webhook/services/billing-webhook-price.service.ts similarity index 96% rename from packages/twenty-server/src/engine/core-modules/billing/webhooks/services/billing-webhook-price.service.ts rename to packages/twenty-server/src/engine/core-modules/billing-webhook/services/billing-webhook-price.service.ts index 50579f0ab..52cba4b81 100644 --- a/packages/twenty-server/src/engine/core-modules/billing/webhooks/services/billing-webhook-price.service.ts +++ b/packages/twenty-server/src/engine/core-modules/billing-webhook/services/billing-webhook-price.service.ts @@ -6,6 +6,7 @@ import { InjectRepository } from '@nestjs/typeorm'; import Stripe from 'stripe'; import { Repository } from 'typeorm'; +import { transformStripePriceEventToDatabasePrice } from 'src/engine/core-modules/billing-webhook/utils/transform-stripe-price-event-to-database-price.util'; import { BillingException, BillingExceptionCode, @@ -15,7 +16,6 @@ import { BillingPrice } from 'src/engine/core-modules/billing/entities/billing-p import { BillingProduct } from 'src/engine/core-modules/billing/entities/billing-product.entity'; import { StripeBillingMeterService } from 'src/engine/core-modules/billing/stripe/services/stripe-billing-meter.service'; import { transformStripeMeterToDatabaseMeter } from 'src/engine/core-modules/billing/utils/transform-stripe-meter-to-database-meter.util'; -import { transformStripePriceEventToDatabasePrice } from 'src/engine/core-modules/billing/webhooks/utils/transform-stripe-price-event-to-database-price.util'; @Injectable() export class BillingWebhookPriceService { diff --git a/packages/twenty-server/src/engine/core-modules/billing/webhooks/services/billing-webhook-product.service.ts b/packages/twenty-server/src/engine/core-modules/billing-webhook/services/billing-webhook-product.service.ts similarity index 93% rename from packages/twenty-server/src/engine/core-modules/billing/webhooks/services/billing-webhook-product.service.ts rename to packages/twenty-server/src/engine/core-modules/billing-webhook/services/billing-webhook-product.service.ts index 333e88033..1f06d31e8 100644 --- a/packages/twenty-server/src/engine/core-modules/billing/webhooks/services/billing-webhook-product.service.ts +++ b/packages/twenty-server/src/engine/core-modules/billing-webhook/services/billing-webhook-product.service.ts @@ -6,9 +6,9 @@ import { InjectRepository } from '@nestjs/typeorm'; import Stripe from 'stripe'; import { Repository } from 'typeorm'; +import { transformStripeProductEventToDatabaseProduct } from 'src/engine/core-modules/billing-webhook/utils/transform-stripe-product-event-to-database-product.util'; import { BillingProduct } from 'src/engine/core-modules/billing/entities/billing-product.entity'; import { isStripeValidProductMetadata } from 'src/engine/core-modules/billing/utils/is-stripe-valid-product-metadata.util'; -import { transformStripeProductEventToDatabaseProduct } from 'src/engine/core-modules/billing/webhooks/utils/transform-stripe-product-event-to-database-product.util'; @Injectable() export class BillingWebhookProductService { protected readonly logger = new Logger(BillingWebhookProductService.name); diff --git a/packages/twenty-server/src/engine/core-modules/billing/webhooks/services/billing-webhook-subscription.service.ts b/packages/twenty-server/src/engine/core-modules/billing-webhook/services/billing-webhook-subscription.service.ts similarity index 88% rename from packages/twenty-server/src/engine/core-modules/billing/webhooks/services/billing-webhook-subscription.service.ts rename to packages/twenty-server/src/engine/core-modules/billing-webhook/services/billing-webhook-subscription.service.ts index 225dcdd59..21cc773e2 100644 --- a/packages/twenty-server/src/engine/core-modules/billing/webhooks/services/billing-webhook-subscription.service.ts +++ b/packages/twenty-server/src/engine/core-modules/billing-webhook/services/billing-webhook-subscription.service.ts @@ -8,6 +8,10 @@ import { isDefined } from 'twenty-shared/utils'; import { WorkspaceActivationStatus } from 'twenty-shared/workspace'; import { In, Repository } from 'typeorm'; +import { getDeletedStripeSubscriptionItemIdsFromStripeSubscriptionEvent } from 'src/engine/core-modules/billing-webhook/utils/get-deleted-stripe-subscription-item-ids-from-stripe-subscription-event.util'; +import { transformStripeSubscriptionEventToDatabaseCustomer } from 'src/engine/core-modules/billing-webhook/utils/transform-stripe-subscription-event-to-database-customer.util'; +import { transformStripeSubscriptionEventToDatabaseSubscriptionItem } from 'src/engine/core-modules/billing-webhook/utils/transform-stripe-subscription-event-to-database-subscription-item.util'; +import { transformStripeSubscriptionEventToDatabaseSubscription } from 'src/engine/core-modules/billing-webhook/utils/transform-stripe-subscription-event-to-database-subscription.util'; import { BillingCustomer } from 'src/engine/core-modules/billing/entities/billing-customer.entity'; import { BillingSubscriptionItem } from 'src/engine/core-modules/billing/entities/billing-subscription-item.entity'; import { BillingSubscription } from 'src/engine/core-modules/billing/entities/billing-subscription.entity'; @@ -15,14 +19,10 @@ import { SubscriptionStatus } from 'src/engine/core-modules/billing/enums/billin import { BillingWebhookEvent } from 'src/engine/core-modules/billing/enums/billing-webhook-events.enum'; import { BillingSubscriptionService } from 'src/engine/core-modules/billing/services/billing-subscription.service'; import { StripeCustomerService } from 'src/engine/core-modules/billing/stripe/services/stripe-customer.service'; -import { getDeletedStripeSubscriptionItemIdsFromStripeSubscriptionEvent } from 'src/engine/core-modules/billing/webhooks/utils/get-deleted-stripe-subscription-item-ids-from-stripe-subscription-event.util'; -import { transformStripeSubscriptionEventToDatabaseCustomer } from 'src/engine/core-modules/billing/webhooks/utils/transform-stripe-subscription-event-to-database-customer.util'; -import { transformStripeSubscriptionEventToDatabaseSubscriptionItem } from 'src/engine/core-modules/billing/webhooks/utils/transform-stripe-subscription-event-to-database-subscription-item.util'; -import { transformStripeSubscriptionEventToDatabaseSubscription } from 'src/engine/core-modules/billing/webhooks/utils/transform-stripe-subscription-event-to-database-subscription.util'; -import { FeatureFlag } from 'src/engine/core-modules/feature-flag/feature-flag.entity'; import { InjectMessageQueue } from 'src/engine/core-modules/message-queue/decorators/message-queue.decorator'; import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants'; import { MessageQueueService } from 'src/engine/core-modules/message-queue/services/message-queue.service'; +import { WorkspaceService } from 'src/engine/core-modules/workspace/services/workspace.service'; import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { CleanWorkspaceDeletionWarningUserVarsJob, @@ -30,6 +30,7 @@ import { } from 'src/engine/workspace-manager/workspace-cleaner/jobs/clean-workspace-deletion-warning-user-vars.job'; @Injectable() +// eslint-disable-next-line @nx/workspace-inject-workspace-repository export class BillingWebhookSubscriptionService { protected readonly logger = new Logger( BillingWebhookSubscriptionService.name, @@ -47,8 +48,7 @@ export class BillingWebhookSubscriptionService { @InjectRepository(BillingCustomer, 'core') private readonly billingCustomerRepository: Repository, private readonly billingSubscriptionService: BillingSubscriptionService, - @InjectRepository(FeatureFlag, 'core') - private readonly featureFlagRepository: Repository, + private readonly workspaceService: WorkspaceService, ) {} async processStripeEvent( @@ -115,6 +115,13 @@ export class BillingWebhookSubscriptionService { }); } + if ( + this.shouldSuspendWorkspace(data) && + workspace.activationStatus === WorkspaceActivationStatus.PENDING_CREATION + ) { + await this.workspaceService.deleteWorkspace(workspace.id); + } + if ( !this.shouldSuspendWorkspace(data) && workspace.activationStatus == WorkspaceActivationStatus.SUSPENDED diff --git a/packages/twenty-server/src/engine/core-modules/billing/webhooks/utils/__tests__/get-deleted-stripe-subscription-item-ids-from-stripe-subscription-event.util.spec.ts b/packages/twenty-server/src/engine/core-modules/billing-webhook/utils/__tests__/get-deleted-stripe-subscription-item-ids-from-stripe-subscription-event.util.spec.ts similarity index 83% rename from packages/twenty-server/src/engine/core-modules/billing/webhooks/utils/__tests__/get-deleted-stripe-subscription-item-ids-from-stripe-subscription-event.util.spec.ts rename to packages/twenty-server/src/engine/core-modules/billing-webhook/utils/__tests__/get-deleted-stripe-subscription-item-ids-from-stripe-subscription-event.util.spec.ts index 75c0863bb..7e9a98e1a 100644 --- a/packages/twenty-server/src/engine/core-modules/billing/webhooks/utils/__tests__/get-deleted-stripe-subscription-item-ids-from-stripe-subscription-event.util.spec.ts +++ b/packages/twenty-server/src/engine/core-modules/billing-webhook/utils/__tests__/get-deleted-stripe-subscription-item-ids-from-stripe-subscription-event.util.spec.ts @@ -2,8 +2,8 @@ import { mockStripeSubscriptionUpdatedEventWithDeletedItem, mockStripeSubscriptionUpdatedEventWithoutUpdatedItem, mockStripeSubscriptionUpdatedEventWithUpdatedItemOnly, -} from 'src/engine/core-modules/billing/webhooks/__mocks__/stripe-subscription-updated-events'; -import { getDeletedStripeSubscriptionItemIdsFromStripeSubscriptionEvent } from 'src/engine/core-modules/billing/webhooks/utils/get-deleted-stripe-subscription-item-ids-from-stripe-subscription-event.util'; +} from 'src/engine/core-modules/billing-webhook/__mocks__/stripe-subscription-updated-events'; +import { getDeletedStripeSubscriptionItemIdsFromStripeSubscriptionEvent } from 'src/engine/core-modules/billing-webhook/utils/get-deleted-stripe-subscription-item-ids-from-stripe-subscription-event.util'; describe('getDeletedStripeSubscriptionItemIdsFromStripeSubscriptionEvent', () => { it('should return an empty array if subscription items are not updated', () => { diff --git a/packages/twenty-server/src/engine/core-modules/billing/webhooks/utils/__tests__/transform-stripe-entitlement-updated-event-to-database-entitlement.util.spec.ts b/packages/twenty-server/src/engine/core-modules/billing-webhook/utils/__tests__/transform-stripe-entitlement-updated-event-to-database-entitlement.util.spec.ts similarity index 95% rename from packages/twenty-server/src/engine/core-modules/billing/webhooks/utils/__tests__/transform-stripe-entitlement-updated-event-to-database-entitlement.util.spec.ts rename to packages/twenty-server/src/engine/core-modules/billing-webhook/utils/__tests__/transform-stripe-entitlement-updated-event-to-database-entitlement.util.spec.ts index cd11c11c7..a63e6027d 100644 --- a/packages/twenty-server/src/engine/core-modules/billing/webhooks/utils/__tests__/transform-stripe-entitlement-updated-event-to-database-entitlement.util.spec.ts +++ b/packages/twenty-server/src/engine/core-modules/billing-webhook/utils/__tests__/transform-stripe-entitlement-updated-event-to-database-entitlement.util.spec.ts @@ -2,8 +2,8 @@ import Stripe from 'stripe'; +import { transformStripeEntitlementUpdatedEventToDatabaseEntitlement } from 'src/engine/core-modules/billing-webhook/utils/transform-stripe-entitlement-updated-event-to-database-entitlement.util'; import { BillingEntitlementKey } from 'src/engine/core-modules/billing/enums/billing-entitlement-key.enum'; -import { transformStripeEntitlementUpdatedEventToDatabaseEntitlement } from 'src/engine/core-modules/billing/webhooks/utils/transform-stripe-entitlement-updated-event-to-database-entitlement.util'; describe('transformStripeEntitlementUpdatedEventToDatabaseEntitlement', () => { it('should return the SSO key with true value', () => { diff --git a/packages/twenty-server/src/engine/core-modules/billing/webhooks/utils/__tests__/transform-stripe-price-event-to-database-price.util.spec.ts b/packages/twenty-server/src/engine/core-modules/billing-webhook/utils/__tests__/transform-stripe-price-event-to-database-price.util.spec.ts similarity index 98% rename from packages/twenty-server/src/engine/core-modules/billing/webhooks/utils/__tests__/transform-stripe-price-event-to-database-price.util.spec.ts rename to packages/twenty-server/src/engine/core-modules/billing-webhook/utils/__tests__/transform-stripe-price-event-to-database-price.util.spec.ts index bd2167694..45eac166b 100644 --- a/packages/twenty-server/src/engine/core-modules/billing/webhooks/utils/__tests__/transform-stripe-price-event-to-database-price.util.spec.ts +++ b/packages/twenty-server/src/engine/core-modules/billing-webhook/utils/__tests__/transform-stripe-price-event-to-database-price.util.spec.ts @@ -1,12 +1,12 @@ /* @license Enterprise */ +import { transformStripePriceEventToDatabasePrice } from 'src/engine/core-modules/billing-webhook/utils/transform-stripe-price-event-to-database-price.util'; import { BillingPriceBillingScheme } from 'src/engine/core-modules/billing/enums/billing-price-billing-scheme.enum'; import { BillingPriceTaxBehavior } from 'src/engine/core-modules/billing/enums/billing-price-tax-behavior.enum'; import { BillingPriceTiersMode } from 'src/engine/core-modules/billing/enums/billing-price-tiers-mode.enum'; import { BillingPriceType } from 'src/engine/core-modules/billing/enums/billing-price-type.enum'; import { SubscriptionInterval } from 'src/engine/core-modules/billing/enums/billing-subscription-interval.enum'; import { BillingUsageType } from 'src/engine/core-modules/billing/enums/billing-usage-type.enum'; -import { transformStripePriceEventToDatabasePrice } from 'src/engine/core-modules/billing/webhooks/utils/transform-stripe-price-event-to-database-price.util'; describe('transformStripePriceEventToDatabasePrice', () => { const createMockPriceData = (overrides = {}) => ({ diff --git a/packages/twenty-server/src/engine/core-modules/billing/webhooks/utils/__tests__/transform-stripe-product-event-to-database-product.util.spec.ts b/packages/twenty-server/src/engine/core-modules/billing-webhook/utils/__tests__/transform-stripe-product-event-to-database-product.util.spec.ts similarity index 95% rename from packages/twenty-server/src/engine/core-modules/billing/webhooks/utils/__tests__/transform-stripe-product-event-to-database-product.util.spec.ts rename to packages/twenty-server/src/engine/core-modules/billing-webhook/utils/__tests__/transform-stripe-product-event-to-database-product.util.spec.ts index f1bf50deb..4f57328fc 100644 --- a/packages/twenty-server/src/engine/core-modules/billing/webhooks/utils/__tests__/transform-stripe-product-event-to-database-product.util.spec.ts +++ b/packages/twenty-server/src/engine/core-modules/billing-webhook/utils/__tests__/transform-stripe-product-event-to-database-product.util.spec.ts @@ -2,7 +2,7 @@ import Stripe from 'stripe'; -import { transformStripeProductEventToDatabaseProduct } from 'src/engine/core-modules/billing/webhooks/utils/transform-stripe-product-event-to-database-product.util'; +import { transformStripeProductEventToDatabaseProduct } from 'src/engine/core-modules/billing-webhook/utils/transform-stripe-product-event-to-database-product.util'; describe('transformStripeProductEventToDatabaseProduct', () => { it('should return the correct data', () => { diff --git a/packages/twenty-server/src/engine/core-modules/billing/webhooks/utils/__tests__/transform-stripe-subscription-event-to-database-customer.util.spec.ts b/packages/twenty-server/src/engine/core-modules/billing-webhook/utils/__tests__/transform-stripe-subscription-event-to-database-customer.util.spec.ts similarity index 95% rename from packages/twenty-server/src/engine/core-modules/billing/webhooks/utils/__tests__/transform-stripe-subscription-event-to-database-customer.util.spec.ts rename to packages/twenty-server/src/engine/core-modules/billing-webhook/utils/__tests__/transform-stripe-subscription-event-to-database-customer.util.spec.ts index 4dd4fb795..64eff2344 100644 --- a/packages/twenty-server/src/engine/core-modules/billing/webhooks/utils/__tests__/transform-stripe-subscription-event-to-database-customer.util.spec.ts +++ b/packages/twenty-server/src/engine/core-modules/billing-webhook/utils/__tests__/transform-stripe-subscription-event-to-database-customer.util.spec.ts @@ -1,6 +1,7 @@ /* @license Enterprise */ -import { transformStripeSubscriptionEventToDatabaseCustomer } from 'src/engine/core-modules/billing/webhooks/utils/transform-stripe-subscription-event-to-database-customer.util'; +import { transformStripeSubscriptionEventToDatabaseCustomer } from 'src/engine/core-modules/billing-webhook/utils/transform-stripe-subscription-event-to-database-customer.util'; + describe('transformStripeSubscriptionEventToDatabaseCustomer', () => { const mockWorkspaceId = 'workspace_123'; const mockTimestamp = 1672531200; // 2023-01-01 00:00:00 UTC diff --git a/packages/twenty-server/src/engine/core-modules/billing/webhooks/utils/__tests__/transform-stripe-subscription-event-to-database-subscription.util.spec.ts b/packages/twenty-server/src/engine/core-modules/billing-webhook/utils/__tests__/transform-stripe-subscription-event-to-database-subscription.util.spec.ts similarity index 97% rename from packages/twenty-server/src/engine/core-modules/billing/webhooks/utils/__tests__/transform-stripe-subscription-event-to-database-subscription.util.spec.ts rename to packages/twenty-server/src/engine/core-modules/billing-webhook/utils/__tests__/transform-stripe-subscription-event-to-database-subscription.util.spec.ts index f5ed31a42..0926d875a 100644 --- a/packages/twenty-server/src/engine/core-modules/billing/webhooks/utils/__tests__/transform-stripe-subscription-event-to-database-subscription.util.spec.ts +++ b/packages/twenty-server/src/engine/core-modules/billing-webhook/utils/__tests__/transform-stripe-subscription-event-to-database-subscription.util.spec.ts @@ -1,8 +1,8 @@ /* @license Enterprise */ +import { transformStripeSubscriptionEventToDatabaseSubscription } from 'src/engine/core-modules/billing-webhook/utils/transform-stripe-subscription-event-to-database-subscription.util'; import { BillingSubscriptionCollectionMethod } from 'src/engine/core-modules/billing/enums/billing-subscription-collection-method.enum'; import { SubscriptionStatus } from 'src/engine/core-modules/billing/enums/billing-subscription-status.enum'; -import { transformStripeSubscriptionEventToDatabaseSubscription } from 'src/engine/core-modules/billing/webhooks/utils/transform-stripe-subscription-event-to-database-subscription.util'; describe('transformStripeSubscriptionEventToDatabaseSubscription', () => { const mockWorkspaceId = 'workspace-123'; diff --git a/packages/twenty-server/src/engine/core-modules/billing/webhooks/utils/get-deleted-stripe-subscription-item-ids-from-stripe-subscription-event.util.ts b/packages/twenty-server/src/engine/core-modules/billing-webhook/utils/get-deleted-stripe-subscription-item-ids-from-stripe-subscription-event.util.ts similarity index 100% rename from packages/twenty-server/src/engine/core-modules/billing/webhooks/utils/get-deleted-stripe-subscription-item-ids-from-stripe-subscription-event.util.ts rename to packages/twenty-server/src/engine/core-modules/billing-webhook/utils/get-deleted-stripe-subscription-item-ids-from-stripe-subscription-event.util.ts diff --git a/packages/twenty-server/src/engine/core-modules/billing/webhooks/utils/transform-stripe-entitlement-updated-event-to-database-entitlement.util.ts b/packages/twenty-server/src/engine/core-modules/billing-webhook/utils/transform-stripe-entitlement-updated-event-to-database-entitlement.util.ts similarity index 100% rename from packages/twenty-server/src/engine/core-modules/billing/webhooks/utils/transform-stripe-entitlement-updated-event-to-database-entitlement.util.ts rename to packages/twenty-server/src/engine/core-modules/billing-webhook/utils/transform-stripe-entitlement-updated-event-to-database-entitlement.util.ts diff --git a/packages/twenty-server/src/engine/core-modules/billing/webhooks/utils/transform-stripe-price-event-to-database-price.util.ts b/packages/twenty-server/src/engine/core-modules/billing-webhook/utils/transform-stripe-price-event-to-database-price.util.ts similarity index 100% rename from packages/twenty-server/src/engine/core-modules/billing/webhooks/utils/transform-stripe-price-event-to-database-price.util.ts rename to packages/twenty-server/src/engine/core-modules/billing-webhook/utils/transform-stripe-price-event-to-database-price.util.ts diff --git a/packages/twenty-server/src/engine/core-modules/billing/webhooks/utils/transform-stripe-product-event-to-database-product.util.ts b/packages/twenty-server/src/engine/core-modules/billing-webhook/utils/transform-stripe-product-event-to-database-product.util.ts similarity index 100% rename from packages/twenty-server/src/engine/core-modules/billing/webhooks/utils/transform-stripe-product-event-to-database-product.util.ts rename to packages/twenty-server/src/engine/core-modules/billing-webhook/utils/transform-stripe-product-event-to-database-product.util.ts diff --git a/packages/twenty-server/src/engine/core-modules/billing/webhooks/utils/transform-stripe-subscription-event-to-database-customer.util.ts b/packages/twenty-server/src/engine/core-modules/billing-webhook/utils/transform-stripe-subscription-event-to-database-customer.util.ts similarity index 100% rename from packages/twenty-server/src/engine/core-modules/billing/webhooks/utils/transform-stripe-subscription-event-to-database-customer.util.ts rename to packages/twenty-server/src/engine/core-modules/billing-webhook/utils/transform-stripe-subscription-event-to-database-customer.util.ts diff --git a/packages/twenty-server/src/engine/core-modules/billing/webhooks/utils/transform-stripe-subscription-event-to-database-subscription-item.util.ts b/packages/twenty-server/src/engine/core-modules/billing-webhook/utils/transform-stripe-subscription-event-to-database-subscription-item.util.ts similarity index 100% rename from packages/twenty-server/src/engine/core-modules/billing/webhooks/utils/transform-stripe-subscription-event-to-database-subscription-item.util.ts rename to packages/twenty-server/src/engine/core-modules/billing-webhook/utils/transform-stripe-subscription-event-to-database-subscription-item.util.ts diff --git a/packages/twenty-server/src/engine/core-modules/billing/webhooks/utils/transform-stripe-subscription-event-to-database-subscription.util.ts b/packages/twenty-server/src/engine/core-modules/billing-webhook/utils/transform-stripe-subscription-event-to-database-subscription.util.ts similarity index 100% rename from packages/twenty-server/src/engine/core-modules/billing/webhooks/utils/transform-stripe-subscription-event-to-database-subscription.util.ts rename to packages/twenty-server/src/engine/core-modules/billing-webhook/utils/transform-stripe-subscription-event-to-database-subscription.util.ts diff --git a/packages/twenty-server/src/engine/core-modules/billing/billing.module.ts b/packages/twenty-server/src/engine/core-modules/billing/billing.module.ts index c4d388033..ebb230410 100644 --- a/packages/twenty-server/src/engine/core-modules/billing/billing.module.ts +++ b/packages/twenty-server/src/engine/core-modules/billing/billing.module.ts @@ -3,7 +3,6 @@ import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; -import { BillingController } from 'src/engine/core-modules/billing/billing.controller'; import { BillingResolver } from 'src/engine/core-modules/billing/billing.resolver'; import { BillingAddWorkflowSubscriptionItemCommand } from 'src/engine/core-modules/billing/commands/billing-add-workflow-subscription-item.command'; import { BillingSyncCustomerDataCommand } from 'src/engine/core-modules/billing/commands/billing-sync-customer-data.command'; @@ -27,13 +26,6 @@ import { BillingSubscriptionService } from 'src/engine/core-modules/billing/serv import { BillingUsageService } from 'src/engine/core-modules/billing/services/billing-usage.service'; import { BillingService } from 'src/engine/core-modules/billing/services/billing.service'; import { StripeModule } from 'src/engine/core-modules/billing/stripe/stripe.module'; -import { BillingWebhookAlertService } from 'src/engine/core-modules/billing/webhooks/services/billing-webhook-alert.service'; -import { BillingWebhookCustomerService } from 'src/engine/core-modules/billing/webhooks/services/billing-webhook-customer.service'; -import { BillingWebhookEntitlementService } from 'src/engine/core-modules/billing/webhooks/services/billing-webhook-entitlement.service'; -import { BillingWebhookInvoiceService } from 'src/engine/core-modules/billing/webhooks/services/billing-webhook-invoice.service'; -import { BillingWebhookPriceService } from 'src/engine/core-modules/billing/webhooks/services/billing-webhook-price.service'; -import { BillingWebhookProductService } from 'src/engine/core-modules/billing/webhooks/services/billing-webhook-product.service'; -import { BillingWebhookSubscriptionService } from 'src/engine/core-modules/billing/webhooks/services/billing-webhook-subscription.service'; import { DomainManagerModule } from 'src/engine/core-modules/domain-manager/domain-manager.module'; import { FeatureFlag } from 'src/engine/core-modules/feature-flag/feature-flag.entity'; import { FeatureFlagModule } from 'src/engine/core-modules/feature-flag/feature-flag.module'; @@ -65,12 +57,9 @@ import { PermissionsModule } from 'src/engine/metadata-modules/permissions/permi 'core', ), ], - controllers: [BillingController], providers: [ BillingSubscriptionService, BillingSubscriptionItemService, - BillingWebhookSubscriptionService, - BillingWebhookEntitlementService, BillingPortalWorkspaceService, BillingProductService, BillingResolver, @@ -78,11 +67,6 @@ import { PermissionsModule } from 'src/engine/metadata-modules/permissions/permi BillingWorkspaceMemberListener, BillingFeatureUsedListener, BillingService, - BillingWebhookProductService, - BillingWebhookPriceService, - BillingWebhookAlertService, - BillingWebhookInvoiceService, - BillingWebhookCustomerService, BillingRestApiExceptionFilter, BillingSyncCustomerDataCommand, BillingUpdateSubscriptionPriceCommand, diff --git a/packages/twenty-server/src/engine/core-modules/billing/services/billing-subscription.service.ts b/packages/twenty-server/src/engine/core-modules/billing/services/billing-subscription.service.ts index 8b39fc4f9..28586fe51 100644 --- a/packages/twenty-server/src/engine/core-modules/billing/services/billing-subscription.service.ts +++ b/packages/twenty-server/src/engine/core-modules/billing/services/billing-subscription.service.ts @@ -10,6 +10,7 @@ import Stripe from 'stripe'; import { isDefined } from 'twenty-shared/utils'; import { Not, Repository } from 'typeorm'; +import { getSubscriptionStatus } from 'src/engine/core-modules/billing-webhook/utils/transform-stripe-subscription-event-to-database-subscription.util'; import { BillingException, BillingExceptionCode, @@ -19,6 +20,7 @@ import { BillingPrice } from 'src/engine/core-modules/billing/entities/billing-p import { BillingSubscriptionItem } from 'src/engine/core-modules/billing/entities/billing-subscription-item.entity'; import { BillingSubscription } from 'src/engine/core-modules/billing/entities/billing-subscription.entity'; import { BillingEntitlementKey } from 'src/engine/core-modules/billing/enums/billing-entitlement-key.enum'; +import { BillingPlanKey } from 'src/engine/core-modules/billing/enums/billing-plan-key.enum'; import { BillingProductKey } from 'src/engine/core-modules/billing/enums/billing-product-key.enum'; import { SubscriptionInterval } from 'src/engine/core-modules/billing/enums/billing-subscription-interval.enum'; import { SubscriptionStatus } from 'src/engine/core-modules/billing/enums/billing-subscription-status.enum'; @@ -28,10 +30,8 @@ import { StripeCustomerService } from 'src/engine/core-modules/billing/stripe/se import { StripeSubscriptionItemService } from 'src/engine/core-modules/billing/stripe/services/stripe-subscription-item.service'; import { StripeSubscriptionService } from 'src/engine/core-modules/billing/stripe/services/stripe-subscription.service'; import { getPlanKeyFromSubscription } from 'src/engine/core-modules/billing/utils/get-plan-key-from-subscription.util'; -import { getSubscriptionStatus } from 'src/engine/core-modules/billing/webhooks/utils/transform-stripe-subscription-event-to-database-subscription.util'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service'; import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; -import { BillingPlanKey } from 'src/engine/core-modules/billing/enums/billing-plan-key.enum'; @Injectable() export class BillingSubscriptionService { diff --git a/packages/twenty-server/src/engine/core-modules/core-engine.module.ts b/packages/twenty-server/src/engine/core-modules/core-engine.module.ts index fad36a0d8..4db4114fc 100644 --- a/packages/twenty-server/src/engine/core-modules/core-engine.module.ts +++ b/packages/twenty-server/src/engine/core-modules/core-engine.module.ts @@ -10,6 +10,7 @@ import { aiModuleFactory } from 'src/engine/core-modules/ai/ai.module-factory'; import { AppTokenModule } from 'src/engine/core-modules/app-token/app-token.module'; import { ApprovedAccessDomainModule } from 'src/engine/core-modules/approved-access-domain/approved-access-domain.module'; import { AuthModule } from 'src/engine/core-modules/auth/auth.module'; +import { BillingWebhookModule } from 'src/engine/core-modules/billing-webhook/billing-webhook.module'; import { BillingModule } from 'src/engine/core-modules/billing/billing.module'; import { CacheStorageModule } from 'src/engine/core-modules/cache-storage/cache-storage.module'; import { TimelineCalendarEventModule } from 'src/engine/core-modules/calendar/timeline-calendar-event.module'; @@ -58,6 +59,7 @@ import { FileModule } from './file/file.module'; AuditModule, AuthModule, BillingModule, + BillingWebhookModule, ClientConfigModule, FeatureFlagModule, FileModule,