Ctrl K
ComunidadGuías…

scripts/getStripe.ts

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
import Stripe from 'stripe'

const s = new Stripe('', {
  apiVersion: '2025-07-30.basil',
  httpClient: Stripe.createFetchHttpClient(),
})

// Retrieve a specific subscription by ID
const subscription = await s.subscriptions.retrieve(
  'sub_1RE5vhGH46eYKnWwi0wv2n2q',
  {
    expand: ['items.data.price'], // Expand price details if needed
  }
);

console.log({
  context: 'getSubscriptionData',
  // subscriptionsFound: subscriptions.data.length, // Removed - retrieve returns one or throws
  subscriptionId: subscription.id,
  subscriptionStatus: subscription.status,
})

let productId: string | null = null
if (subscription.items.data.length > 0) {
  const item = subscription.items.data[0]
  // Ensure price and product are objects before accessing properties
  if (typeof item.price === 'object' && item.price !== null && typeof item.price.product === 'string') {
    productId = item.price.product
  }
  else {
    console.warn({ context: 'getSubscriptionData', message: 'Price or product data missing/invalid type in subscription item', itemId: item.id })
  }
}

// Format dates from epoch to ISO string
// Access cycle dates from the first item
const firstItem = subscription.items.data.length > 0 ? subscription.items.data[0] : null;

const cycleStart = firstItem?.current_period_start
  ? new Date(firstItem.current_period_start * 1000).toISOString()
  : null;

const cycleEnd = firstItem?.current_period_end
  ? new Date(firstItem.current_period_end * 1000).toISOString()
  : null;

console.log('subscription', subscription)

const subscriptionData = {
  productId,
  status: subscription.status,
  cycleStart,
  cycleEnd,
  subscriptionId: subscription.id,
  cancel_at_period_end: subscription.cancel_at_period_end,
}
console.log({
  context: 'getSubscriptionData',
  subscriptionData,
})

let dbStatus: 'succeeded' | 'canceled' | undefined

if (subscriptionData) {
  if (subscriptionData.status === 'canceled') {
    // Only apply 'active until period end' logic if Stripe status is 'canceled'
    if (subscriptionData.cycleEnd && new Date(subscriptionData.cycleEnd) > new Date()) {
      dbStatus = 'succeeded' // Still active until period end because cycleEnd is future
    } else {
      dbStatus = 'canceled' // Truly canceled because cycleEnd is past or null
    }
  } else if (subscriptionData.status === 'active') {
    // Active subscriptions are always considered succeeded
    dbStatus = 'succeeded'
  } else {
    // All other statuses (past_due, unpaid, incomplete, incomplete_expired) are considered canceled immediately
    dbStatus = 'canceled'
  }
}
else {
  // No active subscription found in Stripe
  dbStatus = 'canceled'
}

console.log({
  context: 'getSubscriptionData',
  subscriptionData,
  dbStatus,
})