tenantpilot/lib/stripe/subscription.ts
2025-11-18 23:24:41 +01:00

62 lines
1.7 KiB
TypeScript

import { storeSubscriptionPlans } from "@/config/subscriptions";
import { db } from "@/lib/db/index";
import { subscriptions } from "@/lib/db/schema/subscriptions";
import { eq } from "drizzle-orm";
import { stripe } from "@/lib/stripe/index";
import { getUserAuth } from "@/lib/auth/utils";
export async function getUserSubscriptionPlan() {
const { session } = await getUserAuth();
if (!session || !session.user) {
throw new Error("User not found.");
}
const [ subscription ] = await db
.select()
.from(subscriptions)
.where(eq(subscriptions.userId, session.user.id));
if (!subscription)
return {
id: undefined,
name: undefined,
description: undefined,
stripePriceId: undefined,
price: undefined,
stripeSubscriptionId: null,
stripeCurrentPeriodEnd: null,
stripeCustomerId: null,
isSubscribed: false,
isCanceled: false,
};
const isSubscribed =
subscription.stripePriceId &&
subscription.stripeCurrentPeriodEnd &&
subscription.stripeCurrentPeriodEnd.getTime() + 86_400_000 > Date.now();
const plan = isSubscribed
? storeSubscriptionPlans.find(
(plan) => plan.stripePriceId === subscription.stripePriceId
)
: null;
let isCanceled = false;
if (isSubscribed && subscription.stripeSubscriptionId) {
const stripePlan = await stripe.subscriptions.retrieve(
subscription.stripeSubscriptionId
);
isCanceled = stripePlan.cancel_at_period_end;
}
return {
...plan,
stripeSubscriptionId: subscription.stripeSubscriptionId,
stripeCurrentPeriodEnd: subscription.stripeCurrentPeriodEnd,
stripeCustomerId: subscription.stripeCustomerId,
isSubscribed,
isCanceled,
};
}