Files
calendar/packages/features/ee/billing/api/webhook/_customer.subscription.updated.ts
T
Benny JooandGitHub 7bf5d9cf64 perf: import enums from @calcom/prisma/enums (#23582)
* wip

* fix imports in the rest

* rest

* fix mistake
2025-09-04 11:44:54 +00:00

61 lines
1.9 KiB
TypeScript

import { PrismaPhoneNumberRepository } from "@calcom/lib/server/repository/PrismaPhoneNumberRepository";
import { prisma } from "@calcom/prisma";
import { PhoneNumberSubscriptionStatus } from "@calcom/prisma/enums";
import type { SWHMap } from "./__handler";
import { HttpCode } from "./__handler";
type Data = SWHMap["customer.subscription.updated"]["data"];
const handler = async (data: Data) => {
const subscription = data.object;
if (!subscription.id) {
throw new HttpCode(400, "Subscription ID not found");
}
const phoneNumber = await PrismaPhoneNumberRepository.findByStripeSubscriptionId({
stripeSubscriptionId: subscription.id,
});
if (!phoneNumber) {
throw new HttpCode(202, "Phone number not found");
}
return await handleCalAIPhoneNumberSubscriptionUpdate(subscription, phoneNumber);
};
type Subscription = Data["object"];
async function handleCalAIPhoneNumberSubscriptionUpdate(
subscription: Subscription,
phoneNumber: { id: number; phoneNumber: string }
) {
// Map Stripe subscription status to our enum
const statusMap: Record<string, PhoneNumberSubscriptionStatus> = {
active: PhoneNumberSubscriptionStatus.ACTIVE,
past_due: PhoneNumberSubscriptionStatus.PAST_DUE,
canceled: PhoneNumberSubscriptionStatus.CANCELLED,
incomplete: PhoneNumberSubscriptionStatus.INCOMPLETE,
incomplete_expired: PhoneNumberSubscriptionStatus.INCOMPLETE_EXPIRED,
trialing: PhoneNumberSubscriptionStatus.TRIALING,
unpaid: PhoneNumberSubscriptionStatus.UNPAID,
paused: PhoneNumberSubscriptionStatus.CANCELLED,
};
const subscriptionStatus = statusMap[subscription.status] || PhoneNumberSubscriptionStatus.UNPAID;
await prisma.calAiPhoneNumber.update({
where: {
id: phoneNumber.id,
},
data: {
subscriptionStatus,
},
});
return { success: true, subscriptionId: subscription.id, status: subscriptionStatus };
}
export default handler;