From 1dade81299a9beee1da72869763e50e661c98cdb Mon Sep 17 00:00:00 2001 From: Rajiv Sahal Date: Tue, 28 Oct 2025 12:42:22 +0100 Subject: [PATCH] refactor: team and org billing portal service (#24497) * refactor: team and org billing portal service * fix: implement coderabbit feedback * fix: move core logic to base service * remove unused comments --- .../lib/services/base/BillingPortalService.ts | 19 +++++++++++++++ .../OrganizationBillingPortalService.ts | 24 ++----------------- .../services/team/TeamBillingPortalService.ts | 24 ++----------------- 3 files changed, 23 insertions(+), 44 deletions(-) diff --git a/packages/app-store/stripepayment/lib/services/base/BillingPortalService.ts b/packages/app-store/stripepayment/lib/services/base/BillingPortalService.ts index 9f3ade6b73..72243024ff 100644 --- a/packages/app-store/stripepayment/lib/services/base/BillingPortalService.ts +++ b/packages/app-store/stripepayment/lib/services/base/BillingPortalService.ts @@ -6,6 +6,8 @@ import { WEBAPP_URL } from "@calcom/lib/constants"; import { getSafeRedirectUrl } from "@calcom/lib/getSafeRedirectUrl"; import logger from "@calcom/lib/logger"; import prisma from "@calcom/prisma"; +import type { Prisma } from "@calcom/prisma/client"; +import { teamMetadataSchema } from "@calcom/prisma/zod-utils"; import stripe from "../../server"; @@ -62,6 +64,23 @@ export abstract class BillingPortalService { return safeRedirectUrl || defaultUrl; } + protected getValidatedTeamSubscriptionId(metadata: Prisma.JsonValue) { + const teamMetadataParsed = teamMetadataSchema.safeParse(metadata); + + if (!teamMetadataParsed.success || !teamMetadataParsed.data?.subscriptionId) { + return null; + } + + return teamMetadataParsed.data.subscriptionId; + } + + protected getValidatedTeamSubscriptionIdForPlatform(subscriptionId?: string | null) { + if (!subscriptionId) { + return null; + } + return subscriptionId; + } + /** * Abstract method to check permissions - implemented by subclasses */ diff --git a/packages/app-store/stripepayment/lib/services/organization/OrganizationBillingPortalService.ts b/packages/app-store/stripepayment/lib/services/organization/OrganizationBillingPortalService.ts index 844a74683c..3588dad1e8 100644 --- a/packages/app-store/stripepayment/lib/services/organization/OrganizationBillingPortalService.ts +++ b/packages/app-store/stripepayment/lib/services/organization/OrganizationBillingPortalService.ts @@ -1,7 +1,5 @@ import logger from "@calcom/lib/logger"; -import type { Prisma } from "@calcom/prisma/client"; import { MembershipRole } from "@calcom/prisma/enums"; -import { teamMetadataSchema } from "@calcom/prisma/zod-utils"; import { getSubscriptionFromId } from "../../subscriptions"; import { BillingPortalService } from "../base/BillingPortalService"; @@ -24,24 +22,6 @@ export class OrganizationBillingPortalService extends BillingPortalService { }); } - async getValidatedTeamSubscriptionId(metadata: Prisma.JsonValue) { - const teamMetadataParsed = teamMetadataSchema.safeParse(metadata); - - if (!teamMetadataParsed.success || !teamMetadataParsed.data?.subscriptionId) { - return null; - } - - return teamMetadataParsed.data.subscriptionId; - } - - async getValidatedTeamSubscriptionIdForPlatform(subscriptionId?: string | null) { - if (!subscriptionId) { - return null; - } - - return subscriptionId; - } - async getCustomerId(teamId: number): Promise { const log = logger.getSubLogger({ prefix: ["OrganizationBillingPortalService", "getCustomerId"] }); @@ -51,14 +31,14 @@ export class OrganizationBillingPortalService extends BillingPortalService { let teamSubscriptionId = ""; if (team.isPlatform) { - const subscriptionId = await this.getValidatedTeamSubscriptionIdForPlatform( + const subscriptionId = this.getValidatedTeamSubscriptionIdForPlatform( team.platformBilling?.subscriptionId ); if (!subscriptionId) return null; teamSubscriptionId = subscriptionId; } else { - const subscriptionId = await this.getValidatedTeamSubscriptionId(team.metadata); + const subscriptionId = this.getValidatedTeamSubscriptionId(team.metadata); if (!subscriptionId) return null; teamSubscriptionId = subscriptionId; diff --git a/packages/app-store/stripepayment/lib/services/team/TeamBillingPortalService.ts b/packages/app-store/stripepayment/lib/services/team/TeamBillingPortalService.ts index 2d22babd49..8c87d21ee4 100644 --- a/packages/app-store/stripepayment/lib/services/team/TeamBillingPortalService.ts +++ b/packages/app-store/stripepayment/lib/services/team/TeamBillingPortalService.ts @@ -1,7 +1,5 @@ import logger from "@calcom/lib/logger"; -import type { Prisma } from "@calcom/prisma/client"; import { MembershipRole } from "@calcom/prisma/enums"; -import { teamMetadataSchema } from "@calcom/prisma/zod-utils"; import { getSubscriptionFromId } from "../../subscriptions"; import { BillingPortalService } from "../base/BillingPortalService"; @@ -19,24 +17,6 @@ export class TeamBillingPortalService extends BillingPortalService { }); } - async getValidatedTeamSubscriptionId(metadata: Prisma.JsonValue) { - const teamMetadataParsed = teamMetadataSchema.safeParse(metadata); - - if (!teamMetadataParsed.success || !teamMetadataParsed.data?.subscriptionId) { - return null; - } - - return teamMetadataParsed.data.subscriptionId; - } - - async getValidatedTeamSubscriptionIdForPlatform(subscriptionId?: string | null) { - if (!subscriptionId) { - return null; - } - - return subscriptionId; - } - async getCustomerId(teamId: number): Promise { const log = logger.getSubLogger({ prefix: ["TeamBillingPortalService", "getCustomerId"] }); @@ -46,14 +26,14 @@ export class TeamBillingPortalService extends BillingPortalService { let teamSubscriptionId = ""; if (team.isPlatform) { - const subscriptionId = await this.getValidatedTeamSubscriptionIdForPlatform( + const subscriptionId = this.getValidatedTeamSubscriptionIdForPlatform( team.platformBilling?.subscriptionId ); if (!subscriptionId) return null; teamSubscriptionId = subscriptionId; } else { - const subscriptionId = await this.getValidatedTeamSubscriptionId(team.metadata); + const subscriptionId = this.getValidatedTeamSubscriptionId(team.metadata); if (!subscriptionId) return null; teamSubscriptionId = subscriptionId;