From 9cdf0dd8976bf00b1b509074dd850ad333127ad7 Mon Sep 17 00:00:00 2001 From: pradeepkumar Date: Mon, 30 Mar 2026 15:13:35 +0530 Subject: [PATCH] feat: mask contact info for non-connected profiles and enable real-time Stripe subscription synchronization --- src/stripe/stripe.controller.ts | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/src/stripe/stripe.controller.ts b/src/stripe/stripe.controller.ts index fd8a2f4..b204878 100644 --- a/src/stripe/stripe.controller.ts +++ b/src/stripe/stripe.controller.ts @@ -12,7 +12,7 @@ import { } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; import { ApiTags, ApiOperation, ApiBearerAuth } from '@nestjs/swagger'; -import { UserRole } from '@prisma/client'; +import { UserRole, SubscriptionStatus } from '@prisma/client'; import { StripeService } from './stripe.service'; import { SubscriptionService } from './subscription.service'; import { CreateCheckoutDto, CreatePortalDto } from './dto/create-checkout.dto'; @@ -94,28 +94,36 @@ export class StripeController { const subscription = await this.subscriptionService.getActivePlan(user.id); if (!subscription) return null; - // Sync from Stripe if key fields are missing - if ( - subscription.stripeSubscriptionId && - (!subscription.currentPeriodEnd || - subscription.cancelAtPeriodEnd === null) - ) { + // Always sync with Stripe to get latest state (cancel/uncancel, period changes) + if (subscription.stripeSubscriptionId) { try { const stripeSub = await this.stripeService.getSubscription( subscription.stripeSubscriptionId, ); + + const statusMap: Record = { + active: SubscriptionStatus.ACTIVE, + past_due: SubscriptionStatus.PAST_DUE, + canceled: SubscriptionStatus.CANCELED, + unpaid: SubscriptionStatus.UNPAID, + trialing: SubscriptionStatus.TRIALING, + incomplete: SubscriptionStatus.INCOMPLETE, + }; + + const stripeStatus = statusMap[stripeSub.status] || subscription.status; + const periodEnd = stripeSub.items?.data?.[0]?.current_period_end + || (stripeSub as any).current_period_end; + const updated = await this.subscriptionService.updateSubscriptionStatus( subscription.stripeSubscriptionId, - subscription.status, + stripeStatus, { - currentPeriodEnd: new Date( - stripeSub.items.data[0].current_period_end * 1000, - ), + currentPeriodEnd: new Date(periodEnd * 1000), cancelAtPeriodEnd: stripeSub.cancel_at_period_end, }, ); return updated; - } catch { + } catch (_err) { // Fall through to return existing data } }