el.xwx.moe/lib/api/stripe/verifySubscription.ts

71 lines
1.7 KiB
TypeScript
Raw Normal View History

import { prisma } from "../db";
import { Subscription, User } from "@prisma/client";
import checkSubscriptionByEmail from "./checkSubscriptionByEmail";
interface UserIncludingSubscription extends User {
subscriptions: Subscription | null;
2024-10-26 08:42:21 -05:00
parentSubscription: Subscription | null;
}
export default async function verifySubscription(
user?: UserIncludingSubscription | null
) {
2024-10-26 08:42:21 -05:00
if (!user || (!user.subscriptions && !user.parentSubscription)) {
return null;
}
2024-10-26 08:42:21 -05:00
if (user.parentSubscription?.active) {
return user;
}
2024-10-06 23:57:36 -05:00
if (
2024-10-26 08:42:21 -05:00
!user.subscriptions?.active ||
2024-10-06 23:57:36 -05:00
new Date() > user.subscriptions.currentPeriodEnd
) {
const subscription = await checkSubscriptionByEmail(user.email as string);
2024-10-06 23:57:36 -05:00
if (
!subscription ||
!subscription.stripeSubscriptionId ||
!subscription.currentPeriodEnd ||
!subscription.currentPeriodStart ||
!subscription.quantity
) {
return null;
}
const {
active,
stripeSubscriptionId,
currentPeriodStart,
currentPeriodEnd,
2024-10-06 23:57:36 -05:00
quantity,
} = subscription;
2024-10-06 23:57:36 -05:00
await prisma.subscription
.upsert({
2024-03-16 19:09:58 -05:00
where: {
userId: user.id,
},
2024-10-06 23:57:36 -05:00
create: {
active,
stripeSubscriptionId,
currentPeriodStart: new Date(currentPeriodStart),
currentPeriodEnd: new Date(currentPeriodEnd),
quantity,
userId: user.id,
},
update: {
active,
stripeSubscriptionId,
currentPeriodStart: new Date(currentPeriodStart),
currentPeriodEnd: new Date(currentPeriodEnd),
quantity,
},
})
.catch((err) => console.log(err));
}
return user;
}