feat: migrate from lemonsqueezy to polar (#535)

* feat: move from lemonsqueezy to polar

* update lock

* add migration files

* test with demo product id
This commit is contained in:
Rotimi Best
2025-01-06 03:36:00 +01:00
committed by GitHub
parent 32ba251b77
commit de1398b3a2
14 changed files with 398 additions and 94 deletions
@@ -1,9 +1,9 @@
import { env } from '$env/dynamic/private';
import { getServerSupabase } from '$lib/utils/functions/supabase.server';
import { cancelOrgPlan, createOrgPlan } from '$lib/utils/services/org';
import { json } from '@sveltejs/kit';
import crypto from 'crypto';
import { env } from '$env/dynamic/private';
import { createOrgPlan, cancelOrgPlan } from '$lib/utils/services/org';
import { PLAN } from 'shared/src/plans/constants';
import { getServerSupabase } from '$lib/utils/functions/supabase.server';
export async function POST({ request }) {
try {
@@ -30,10 +30,11 @@ export async function POST({ request }) {
if (eventType === 'subscription_created' || eventType === 'subscription_resumed') {
const orgId = body.meta.custom_data.org_id;
const triggeredBy = body.meta.custom_data.triggered_by;
const subscriptionId = body.data.id;
const isSuccessful = body.data.attributes.status === 'active';
console.log({
orgId,
subscriptionId,
triggeredBy,
isSuccessful
});
@@ -41,6 +42,7 @@ export async function POST({ request }) {
if (isSuccessful && orgId) {
const { data, error } = await createOrgPlan({
supabase,
subscriptionId,
orgId,
triggeredBy: parseInt(triggeredBy),
planName: PLAN.EARLY_ADOPTER,
@@ -57,10 +59,10 @@ export async function POST({ request }) {
`${eventType}`
)
) {
const orgId = body.meta.custom_data.org_id;
const subscriptionId = body.data.id;
const { data, error } = await cancelOrgPlan({
orgId,
planName: PLAN.EARLY_ADOPTER
subscriptionId,
data: body.data
});
if (error) console.error('Error canceling org plan', error);
@@ -0,0 +1,14 @@
import { env } from '$env/dynamic/private';
import { Checkout } from 'polar-sveltekit';
export const GET = ({ ...params }) => {
const metadata = JSON.parse(params.url.searchParams.get('metadata') ?? '{}');
const successUrl = `/org/${metadata.orgSlug}?upgrade=true&confirmation=true`;
const request = Checkout({
accessToken: env.POLAR_ACCESS_TOKEN,
successUrl
});
return request(params);
};
@@ -0,0 +1,86 @@
import { env } from '$env/dynamic/private';
import { getServerSupabase } from '$lib/utils/functions/supabase.server';
import { cancelOrgPlan, createOrgPlan, updateOrgPlan } from '$lib/utils/services/org';
import type { PolarWebhookPayload } from '$lib/utils/types/polar';
import { Webhooks } from 'polar-sveltekit';
import { PLAN } from 'shared/src/plans/constants';
export const POST = Webhooks({
webhookSecret: env.POLAR_WEBHOOK_SECRET!,
onPayload
});
async function onPayload(payload: PolarWebhookPayload) {
const supabase = getServerSupabase();
const metadata = payload.data.metadata;
const orgId = metadata.orgId;
const triggeredBy = metadata.triggeredBy;
const subscriptionId = payload.data.id;
const isSubscriptionActive = payload.data.status === 'active';
console.log({
orgId,
triggeredBy,
isSubscriptionActive,
subscriptionId
});
if (!orgId) {
console.error('Org ID is required');
throw new Error('Org ID is required');
}
switch (payload.type) {
case 'checkout.created':
break;
case 'checkout.updated':
break;
case 'subscription.created':
if (isSubscriptionActive) {
const { data, error } = await createOrgPlan({
supabase,
subscriptionId,
orgId,
triggeredBy: parseInt(triggeredBy),
planName: PLAN.EARLY_ADOPTER,
data: payload.data
});
if (error) throw new Error('Error creating org plan');
console.log('Subscription created', data);
}
break;
case 'subscription.updated':
if (!isSubscriptionActive) {
// Handle Cancel Subscription
const { data, error } = await cancelOrgPlan({
subscriptionId,
data: payload.data
});
if (error) throw new Error('Error canceling org plan');
console.log('Subscription canceled', data);
} else {
// Handle Update Subscription
const { data, error } = await updateOrgPlan({
supabase,
subscriptionId,
data: payload.data
});
if (error) throw new Error('Error updating org plan');
console.log('Subscription updated', data);
}
break;
case 'subscription.active':
break;
case 'subscription.revoked':
break;
case 'subscription.canceled':
break;
default:
console.log('Unknown event', payload.type);
break;
}
}