Skip to content

Commit f95faaa

Browse files
committed
Cleanup tier mapping code
1 parent 1b1176c commit f95faaa

File tree

4 files changed

+26
-22
lines changed

4 files changed

+26
-22
lines changed

common/src/constants/subscription-plans.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,19 @@ export const SUBSCRIPTION_TIERS = {
3131
export type SubscriptionTierPrice = keyof typeof SUBSCRIPTION_TIERS
3232

3333
export const DEFAULT_TIER = SUBSCRIPTION_TIERS[200]
34+
35+
export function createSubscriptionPriceMappings(priceIds: Record<SubscriptionTierPrice, string>) {
36+
const priceToTier = Object.fromEntries(
37+
Object.entries(priceIds).map(([tier, priceId]) => [priceId, Number(tier) as SubscriptionTierPrice]),
38+
) as Record<string, SubscriptionTierPrice>
39+
40+
function getTierFromPriceId(priceId: string): SubscriptionTierPrice | null {
41+
return priceToTier[priceId] ?? null
42+
}
43+
44+
function getPriceIdFromTier(tier: SubscriptionTierPrice): string | null {
45+
return priceIds[tier] ?? null
46+
}
47+
48+
return { getTierFromPriceId, getPriceIdFromTier }
49+
}

packages/billing/src/subscription-webhooks.ts

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { trackEvent } from '@codebuff/common/analytics'
22
import { AnalyticsEvent } from '@codebuff/common/constants/analytics-events'
3+
import { createSubscriptionPriceMappings } from '@codebuff/common/constants/subscription-plans'
34
import db from '@codebuff/internal/db'
45
import * as schema from '@codebuff/internal/db/schema'
56
import { env } from '@codebuff/internal/env'
@@ -12,7 +13,6 @@ import { eq } from 'drizzle-orm'
1213

1314
import { expireActiveBlockGrants, handleSubscribe } from './subscription'
1415

15-
import type { SubscriptionTierPrice } from '@codebuff/common/constants/subscription-plans'
1616
import type { Logger } from '@codebuff/common/types/contracts/logger'
1717
import type Stripe from 'stripe'
1818

@@ -27,23 +27,11 @@ function mapStripeStatus(status: Stripe.Subscription.Status): SubscriptionStatus
2727
return 'incomplete'
2828
}
2929

30-
const priceToTier: Record<string, SubscriptionTierPrice> = {
31-
...(env.STRIPE_SUBSCRIPTION_100_PRICE_ID && { [env.STRIPE_SUBSCRIPTION_100_PRICE_ID]: 100 as const }),
32-
...(env.STRIPE_SUBSCRIPTION_200_PRICE_ID && { [env.STRIPE_SUBSCRIPTION_200_PRICE_ID]: 200 as const }),
33-
...(env.STRIPE_SUBSCRIPTION_500_PRICE_ID && { [env.STRIPE_SUBSCRIPTION_500_PRICE_ID]: 500 as const }),
34-
}
35-
36-
function getTierFromPriceId(priceId: string): SubscriptionTierPrice | null {
37-
return priceToTier[priceId] ?? null
38-
}
39-
40-
const tierToPrice = Object.fromEntries(
41-
Object.entries(priceToTier).map(([priceId, tier]) => [tier, priceId]),
42-
) as Partial<Record<SubscriptionTierPrice, string>>
43-
44-
export function getTierPriceId(tier: SubscriptionTierPrice): string | null {
45-
return tierToPrice[tier] ?? null
46-
}
30+
export const { getTierFromPriceId, getPriceIdFromTier } = createSubscriptionPriceMappings({
31+
100: env.STRIPE_SUBSCRIPTION_100_PRICE_ID,
32+
200: env.STRIPE_SUBSCRIPTION_200_PRICE_ID,
33+
500: env.STRIPE_SUBSCRIPTION_500_PRICE_ID,
34+
})
4735

4836
// ---------------------------------------------------------------------------
4937
// invoice.paid

web/src/app/api/stripe/change-subscription-tier/route.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import {
22
expireActiveBlockGrants,
33
getActiveSubscription,
4-
getTierPriceId,
4+
getPriceIdFromTier,
55
} from '@codebuff/billing'
66
import { trackEvent } from '@codebuff/common/analytics'
77
import { AnalyticsEvent } from '@codebuff/common/constants/analytics-events'
@@ -66,7 +66,7 @@ export async function POST(req: NextRequest) {
6666
)
6767
}
6868

69-
const newPriceId = getTierPriceId(tier)
69+
const newPriceId = getPriceIdFromTier(tier)
7070
if (!newPriceId) {
7171
return NextResponse.json(
7272
{ error: 'Subscription tier not available' },

web/src/app/api/stripe/create-subscription/route.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { getActiveSubscription, getTierPriceId } from '@codebuff/billing'
1+
import { getActiveSubscription, getPriceIdFromTier } from '@codebuff/billing'
22
import { SUBSCRIPTION_TIERS } from '@codebuff/common/constants/subscription-plans'
33
import db from '@codebuff/internal/db'
44
import * as schema from '@codebuff/internal/db/schema'
@@ -28,7 +28,7 @@ export async function POST(req: NextRequest) {
2828
? rawTier
2929
: 200) as SubscriptionTierPrice
3030

31-
const priceId = getTierPriceId(tier)
31+
const priceId = getPriceIdFromTier(tier)
3232
if (!priceId) {
3333
return NextResponse.json(
3434
{ error: 'Subscription tier not available' },

0 commit comments

Comments
 (0)