Skip to content

Commit cf40600

Browse files
authored
Subscription backend (#423)
1 parent 5f8e581 commit cf40600

File tree

29 files changed

+11803
-61
lines changed

29 files changed

+11803
-61
lines changed

.env.example

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ STRIPE_SECRET_KEY=sk_test_dummy_stripe_secret
1818
STRIPE_WEBHOOK_SECRET_KEY=whsec_dummy_webhook_secret
1919
STRIPE_USAGE_PRICE_ID=price_dummy_usage_id
2020
STRIPE_TEAM_FEE_PRICE_ID=price_dummy_team_fee_id
21+
STRIPE_SUBSCRIPTION_100_PRICE_ID=price_dummy_subscription_100_id
22+
STRIPE_SUBSCRIPTION_200_PRICE_ID=price_dummy_subscription_200_id
23+
STRIPE_SUBSCRIPTION_500_PRICE_ID=price_dummy_subscription_500_id
2124

2225
# External Services
2326
LINKUP_API_KEY=dummy_linkup_key

common/src/constants/analytics-events.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,16 @@ export enum AnalyticsEvent {
3030
ADVISORY_LOCK_CONTENTION = 'backend.advisory_lock_contention',
3131
TRANSACTION_RETRY_THRESHOLD_EXCEEDED = 'backend.transaction_retry_threshold_exceeded',
3232

33+
// Backend - Subscription
34+
SUBSCRIPTION_CREATED = 'backend.subscription_created',
35+
SUBSCRIPTION_CANCELED = 'backend.subscription_canceled',
36+
SUBSCRIPTION_PAYMENT_FAILED = 'backend.subscription_payment_failed',
37+
SUBSCRIPTION_BLOCK_CREATED = 'backend.subscription_block_created',
38+
SUBSCRIPTION_BLOCK_LIMIT_HIT = 'backend.subscription_block_limit_hit',
39+
SUBSCRIPTION_WEEKLY_LIMIT_HIT = 'backend.subscription_weekly_limit_hit',
40+
SUBSCRIPTION_CREDITS_MIGRATED = 'backend.subscription_credits_migrated',
41+
SUBSCRIPTION_TIER_CHANGED = 'backend.subscription_tier_changed',
42+
3343
// Web
3444
SIGNUP = 'web.signup',
3545

common/src/constants/grant-priorities.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import type { GrantType } from '@codebuff/common/types/grant'
22

33
export const GRANT_PRIORITIES: Record<GrantType, number> = {
4+
subscription: 10,
45
free: 20,
56
referral: 30,
67
ad: 40,
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
export const SUBSCRIPTION_DISPLAY_NAME = 'Strong' as const
2+
3+
export interface TierConfig {
4+
monthlyPrice: number
5+
creditsPerBlock: number
6+
blockDurationHours: number
7+
weeklyCreditsLimit: number
8+
}
9+
10+
export const SUBSCRIPTION_TIERS = {
11+
100: {
12+
monthlyPrice: 100,
13+
creditsPerBlock: 400,
14+
blockDurationHours: 5,
15+
weeklyCreditsLimit: 4000,
16+
},
17+
200: {
18+
monthlyPrice: 200,
19+
creditsPerBlock: 1200,
20+
blockDurationHours: 5,
21+
weeklyCreditsLimit: 12000,
22+
},
23+
500: {
24+
monthlyPrice: 500,
25+
creditsPerBlock: 3200,
26+
blockDurationHours: 5,
27+
weeklyCreditsLimit: 32000,
28+
},
29+
} as const satisfies Record<number, TierConfig>
30+
31+
export type SubscriptionTierPrice = keyof typeof SUBSCRIPTION_TIERS
32+
33+
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+
}

common/src/types/grant.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
export type GrantType =
22
| 'free'
33
| 'referral'
4+
| 'subscription'
45
| 'purchase'
56
| 'admin'
67
| 'organization'
@@ -9,6 +10,7 @@ export type GrantType =
910
export const GrantTypeValues = [
1011
'free',
1112
'referral',
13+
'subscription',
1214
'purchase',
1315
'admin',
1416
'organization',

0 commit comments

Comments
 (0)