UNPKG

saas-subscription-helper

Version:

A helper package for integrating Stripe Payment Links with Supabase in SaaS applications.

83 lines (68 loc) 2.77 kB
const stripe = require('stripe'); const { fetchUser, updateUser } = require('../supabase'); const fetchSubscription = require('./fetchSubscription'); async function syncSubscription(config, email) { if (config.debug) console.log('[DEBUG] Starting subscription sync...'); try { // Get current data from both services const [supabaseUser, stripeSubscription] = await Promise.all([ fetchUser(config, email), fetchSubscription(config, email) ]); if (!supabaseUser) { throw new Error('User not found in Supabase'); } // Determine the correct status and plan let status, stripePriceId; if (stripeSubscription) { status = stripeSubscription.cancel_at_period_end ? 'canceled' : stripeSubscription.status; stripePriceId = stripeSubscription.items.data[0].price.id; } else { status = 'inactive'; stripePriceId = null; } // Check if update is needed const currentStatus = supabaseUser[config.subscriptionField]; const currentStripePriceId = supabaseUser.stripe_price_id; if (currentStatus !== status || currentStripePriceId !== stripePriceId) { if (config.debug) { console.log('[DEBUG] Subscription data mismatch detected:'); console.log('Supabase:', { status: currentStatus, stripePriceId: currentStripePriceId }); console.log('Stripe:', { status, stripePriceId }); } // Update Supabase with Stripe data const updateData = { [config.subscriptionField]: status, stripe_price_id: stripePriceId }; const result = await updateUser(config, email, updateData); if (config.debug) { console.log('[DEBUG] Subscription synced successfully'); console.log('[DEBUG] Update result:', result); } return { success: true, synced: true, previous: { status: currentStatus, stripe_price_id: currentStripePriceId }, current: { status, stripe_price_id: stripePriceId } }; } if (config.debug) { console.log('[DEBUG] Subscription data already in sync'); } return { success: true, synced: false, current: { status, stripe_price_id: stripePriceId } }; } catch (error) { if (config.debug) { console.error('[DEBUG] Error syncing subscription:', error); } throw error; } } module.exports = syncSubscription;