From bfb94acc4241084501b61dc20c5b919662c256c3 Mon Sep 17 00:00:00 2001 From: forehalo Date: Wed, 16 Apr 2025 08:18:29 +0000 Subject: [PATCH] fix(server): subscription delete race condition (#11729) --- .../server/src/plugins/payment/manager/user.ts | 16 +++++++++------- .../src/plugins/payment/manager/workspace.ts | 16 +++++++++------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/packages/backend/server/src/plugins/payment/manager/user.ts b/packages/backend/server/src/plugins/payment/manager/user.ts index d7a2a713f..19b37611b 100644 --- a/packages/backend/server/src/plugins/payment/manager/user.ts +++ b/packages/backend/server/src/plugins/payment/manager/user.ts @@ -256,17 +256,19 @@ export class UserSubscriptionManager extends SubscriptionManager { stripeSubscription, }: KnownStripeSubscription) { this.assertUserIdExists(userId); - this.event.emit('user.subscription.canceled', { - userId, - plan: lookupKey.plan, - recurring: lookupKey.recurring, - }); - - await this.db.subscription.deleteMany({ + const result = await this.db.subscription.deleteMany({ where: { stripeSubscriptionId: stripeSubscription.id, }, }); + + if (result.count > 0) { + this.event.emit('user.subscription.canceled', { + userId, + plan: lookupKey.plan, + recurring: lookupKey.recurring, + }); + } } async cancelSubscription(subscription: Subscription) { diff --git a/packages/backend/server/src/plugins/payment/manager/workspace.ts b/packages/backend/server/src/plugins/payment/manager/workspace.ts index f46fa2f83..244cb3b0b 100644 --- a/packages/backend/server/src/plugins/payment/manager/workspace.ts +++ b/packages/backend/server/src/plugins/payment/manager/workspace.ts @@ -187,15 +187,17 @@ export class WorkspaceSubscriptionManager extends SubscriptionManager { ); } - this.event.emit('workspace.subscription.canceled', { - workspaceId, - plan: lookupKey.plan, - recurring: lookupKey.recurring, - }); - - await this.db.subscription.deleteMany({ + const result = await this.db.subscription.deleteMany({ where: { stripeSubscriptionId: stripeSubscription.id }, }); + + if (result.count > 0) { + this.event.emit('workspace.subscription.canceled', { + workspaceId, + plan: lookupKey.plan, + recurring: lookupKey.recurring, + }); + } } getSubscription(identity: z.infer) {