import { webhooks } from "@polar-sh/better-auth";
export const auth = betterAuth({
plugins: [
webhooks({
secret: process.env.POLAR_WEBHOOK_SECRET ||
(() => {
throw new Error("POLAR_WEBHOOK_SECRET environment variable is required",);})(),
onPayload: async ({ data, type }) => {
if (
type === "subscription.created" ||
type === "subscription.active" ||
type === "subscription.canceled" ||
type === "subscription.revoked" ||
type === "subscription.uncanceled" ||
type === "subscription.updated"
) {
console.log(
"🎯 Processing subscription webhook:",
type,
);
console.log(
"📦 Payload data:",
JSON.stringify(data, null, 2),
);
try {
const userId = data.customer?.externalId;
const subscriptionData = {
id: data.id,
provider: Provider.POLAR,
providerSubscriptionId: data.id,
providerCustomerId: data.customerId,
userId: userId as string,
plan: products.find(
(p) => p.productId === data.productId,
)?.slug ?? "default",
amount: data.amount,
currency: data.currency,
status: data.status,
cancelAtPeriodEnd: data.cancelAtPeriodEnd,
currentPeriodStart: new Date(
data.currentPeriodStart,
),
currentPeriodEnd: data.currentPeriodEnd
? new Date(data.currentPeriodEnd)
: undefined,
createdAt: new Date(data.createdAt),
updatedAt: data.modifiedAt
? new Date(data.modifiedAt)
: undefined,
metadata: data.metadata ?? {},
};
console.log("💾 Final subscription data:", {
id: subscriptionData.id,
status: subscriptionData.status,
userId: subscriptionData.userId,
amount: subscriptionData.amount,
});
console.log(
"🔍 Checking for existing subscription:",
data.id,
);
const existingSubscription = await prisma
.subscription.findUnique({
where: {
id: data.id,
},
});
if (existingSubscription) {
console.log(
"🔄 Updating existing subscription:",
data.id,
);
await prisma.subscription.update({
where: {
id: data.id,
},
data: subscriptionData,
});
} else {
console.log(
"🆕 Creating new subscription:",
data.id,
);
await prisma.subscription.create({
data: subscriptionData,
});
}
console.log(
"✅ Subscription processed:",
data.id,
);
} catch (error) {
console.error(
"💥 Error processing subscription webhook:",
error,
);
}
}
},
}),