From dacb9f0b90490f224a9a30ccf421f5422736637c Mon Sep 17 00:00:00 2001 From: Vins Date: Thu, 18 Apr 2024 11:31:00 +0200 Subject: [PATCH] Fixed webhooks by env --- src/common/webhooks/stripeWebhooks.ts | 29 +++++++++++++++---- .../common/StripeService/StripeService.ts | 1 + 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/common/webhooks/stripeWebhooks.ts b/src/common/webhooks/stripeWebhooks.ts index 85fc45f7..5885b85c 100644 --- a/src/common/webhooks/stripeWebhooks.ts +++ b/src/common/webhooks/stripeWebhooks.ts @@ -24,10 +24,14 @@ export default class StripeWebhooks extends ApiController { const event = req.body; switch (event.type) { - case "invoice.payment_succeeded": - if (event.data.object.billing_reason !== "subscription_update") break; + //Manage plan switch + recurring payment + case "invoice.payment_succeeded": + if (event.data.object.billing_reason !== "subscription_update" && event.data.object.billing_reason !== "subscription_cycle") break; const stripeSubscription = await this.stripeService.getClient().subscriptions.retrieve(event.data.object.subscription); + if(stripeSubscription.metadata['env'] !== this.backendVariables.ENV) break; + const existingSubscription = await this.subscriptionsService.get({where : {stripe_subscription_id : stripeSubscription.id}}); + if(!existingSubscription[0]) break; const subscriptionUpdate: any = {}; @@ -42,19 +46,30 @@ export default class StripeWebhooks extends ApiController { subscriptionUpdate.type = "UNLIMITED"; } - const subscriptionEntityUpdate = Subscription.hydrate(subscriptionUpdate); + const subscriptionEntityUpdate = Subscription.hydrate(subscriptionUpdate); - await validateOrReject(subscriptionEntityUpdate, { groups: ["updateSubscription"], forbidUnknownValues: false }); + await validateOrReject(subscriptionEntityUpdate, { groups: ["updateSubscription"], forbidUnknownValues: false }); await this.subscriptionsService.update(existingSubscription[0].uid ,subscriptionEntityUpdate); - + + //Manage subscription creation and first payment case "checkout.session.completed": if (event.data.object.status !== "complete") break; const subscription = JSON.parse(event.data.object.metadata.subscription); + const env = event.data.object.metadata.env; + + if (env !== this.backendVariables.ENV) break; subscription.stripe_subscription_id = event.data.object.subscription; + await this.stripeService.getClient().subscriptions.update(subscription.stripe_subscription_id, { + metadata: { + env: env, + }, + } + ) + const subscriptionInfo = await this.stripeService .getClient() .subscriptions.retrieve(subscription.stripe_subscription_id); @@ -65,10 +80,14 @@ export default class StripeWebhooks extends ApiController { const subscriptionEntity = Subscription.hydrate(subscription); await validateOrReject(subscriptionEntity, { groups: ["createSubscription"], forbidUnknownValues: false }); + await this.subscriptionsService.create(subscriptionEntity); break; + //Manage plan expiration case "customer.subscription.deleted": + const currentSubscription = await this.stripeService.getClient().subscriptions.retrieve(event.data.object.id); + if(currentSubscription.metadata['env'] !== this.backendVariables.ENV) break; const subscriptionToDelete = await this.subscriptionsService.get({where : {stripe_subscription_id : event.data.object.id}}); if(!subscriptionToDelete[0]) break; await this.subscriptionsService.delete(subscriptionToDelete[0].uid); diff --git a/src/services/common/StripeService/StripeService.ts b/src/services/common/StripeService/StripeService.ts index e8e1ee8e..8087b5a5 100644 --- a/src/services/common/StripeService/StripeService.ts +++ b/src/services/common/StripeService/StripeService.ts @@ -30,6 +30,7 @@ export default class StripeService { cancel_url: this.variables.APP_HOST + "/subscription/error", metadata: { subscription: JSON.stringify(subscription), + env: this.variables.ENV, }, });