scripts/getStripe.ts
Rama main · réplica de lectura del repositorio original.
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,
})