saas-subscription-helper
Version:
A helper package for integrating Stripe Payment Links with Supabase in SaaS applications.
83 lines (68 loc) • 2.77 kB
JavaScript
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;