Files
sign/packages/ee/server-only/stripe/webhook/on-subscription-updated.ts

60 lines
1.7 KiB
TypeScript
Raw Normal View History

2025-03-03 14:49:28 +11:00
import type { Prisma } from '@prisma/client';
import { SubscriptionStatus } from '@prisma/client';
2023-10-15 20:26:32 +11:00
import { match } from 'ts-pattern';
import type { Stripe } from '@documenso/lib/server-only/stripe';
2023-10-15 20:26:32 +11:00
import { prisma } from '@documenso/prisma';
export type OnSubscriptionUpdatedOptions = {
userId?: number;
teamId?: number;
2023-10-15 20:26:32 +11:00
subscription: Stripe.Subscription;
};
export const onSubscriptionUpdated = async ({
userId,
teamId,
2023-10-15 20:26:32 +11:00
subscription,
}: OnSubscriptionUpdatedOptions) => {
await prisma.subscription.upsert(
mapStripeSubscriptionToPrismaUpsertAction(subscription, userId, teamId),
);
};
export const mapStripeSubscriptionToPrismaUpsertAction = (
subscription: Stripe.Subscription,
userId?: number,
teamId?: number,
): Prisma.SubscriptionUpsertArgs => {
if ((!userId && !teamId) || (userId && teamId)) {
throw new Error('Either userId or teamId must be provided.');
}
2023-10-15 20:26:32 +11:00
const status = match(subscription.status)
.with('active', () => SubscriptionStatus.ACTIVE)
.with('past_due', () => SubscriptionStatus.PAST_DUE)
.otherwise(() => SubscriptionStatus.INACTIVE);
return {
2023-10-15 20:26:32 +11:00
where: {
planId: subscription.id,
2023-10-15 20:26:32 +11:00
},
create: {
status: status,
planId: subscription.id,
priceId: subscription.items.data[0].price.id,
periodEnd: new Date(subscription.current_period_end * 1000),
userId: userId ?? null,
teamId: teamId ?? null,
cancelAtPeriodEnd: subscription.cancel_at_period_end,
2023-10-15 20:26:32 +11:00
},
update: {
status: status,
planId: subscription.id,
priceId: subscription.items.data[0].price.id,
periodEnd: new Date(subscription.current_period_end * 1000),
cancelAtPeriodEnd: subscription.cancel_at_period_end,
2023-10-15 20:26:32 +11:00
},
};
2023-10-15 20:26:32 +11:00
};