@@ -13,6 +13,17 @@ import type { Logger } from '@codebuff/common/types/contracts/logger'
1313import type { PlanConfig } from '@codebuff/common/constants/subscription-plans'
1414import type Stripe from 'stripe'
1515
16+ type SubscriptionStatus = ( typeof schema . subscriptionStatusEnum . enumValues ) [ number ]
17+
18+ /**
19+ * Maps a Stripe subscription status to our local enum.
20+ */
21+ function mapStripeStatus ( status : Stripe . Subscription . Status ) : SubscriptionStatus {
22+ if ( status === 'past_due' ) return 'past_due'
23+ if ( status === 'canceled' ) return 'canceled'
24+ return 'active'
25+ }
26+
1627/**
1728 * Looks up a user ID by Stripe customer ID.
1829 */
@@ -137,7 +148,7 @@ export async function handleSubscriptionInvoicePaid(params: {
137148 target : schema . subscription . stripe_subscription_id ,
138149 set : {
139150 status : 'active' ,
140- user_id : userId ,
151+ ... ( userId ? { user_id : userId } : { } ) ,
141152 stripe_price_id : priceId ,
142153 plan_name : plan . name ,
143154 billing_period_start : new Date (
@@ -250,6 +261,8 @@ export async function handleSubscriptionUpdated(params: {
250261 : stripeSubscription . customer . id
251262 const userId = await getUserIdByCustomerId ( customerId )
252263
264+ const status = mapStripeStatus ( stripeSubscription . status )
265+
253266 // Upsert — webhook ordering is not guaranteed by Stripe, so this event
254267 // may arrive before invoice.paid creates the row.
255268 await db
@@ -260,6 +273,7 @@ export async function handleSubscriptionUpdated(params: {
260273 user_id : userId ,
261274 stripe_price_id : priceId ,
262275 plan_name : planName ,
276+ status,
263277 cancel_at_period_end : stripeSubscription . cancel_at_period_end ,
264278 billing_period_start : new Date (
265279 stripeSubscription . current_period_start * 1000 ,
@@ -271,9 +285,10 @@ export async function handleSubscriptionUpdated(params: {
271285 . onConflictDoUpdate ( {
272286 target : schema . subscription . stripe_subscription_id ,
273287 set : {
274- user_id : userId ,
288+ ... ( userId ? { user_id : userId } : { } ) ,
275289 stripe_price_id : priceId ,
276290 plan_name : planName ,
291+ status,
277292 cancel_at_period_end : stripeSubscription . cancel_at_period_end ,
278293 billing_period_start : new Date (
279294 stripeSubscription . current_period_start * 1000 ,
0 commit comments