53 lines
1.8 KiB
TypeScript
53 lines
1.8 KiB
TypeScript
import { getStripeCustomerIdFromUserId } from "@calcom/app-store/stripepayment/lib/customer";
|
|
import stripe from "@calcom/app-store/stripepayment/lib/server";
|
|
import { WEBAPP_URL } from "@calcom/lib/constants";
|
|
import prisma from "@calcom/prisma";
|
|
import { teamMetadataSchema } from "@calcom/prisma/zod-utils";
|
|
|
|
export const purchaseTeamSubscription = async (input: { teamId: number; seats: number; userId: number }) => {
|
|
const { teamId, seats, userId } = input;
|
|
const customer = await getStripeCustomerIdFromUserId(userId);
|
|
return await stripe.checkout.sessions.create({
|
|
customer,
|
|
mode: "subscription",
|
|
success_url: `${WEBAPP_URL}/api/teams/${teamId}/upgrade?session_id={CHECKOUT_SESSION_ID}`,
|
|
cancel_url: `${WEBAPP_URL}/settings/profile`,
|
|
locale: "en",
|
|
line_items: [
|
|
{
|
|
/** We only need to set the base price and we can upsell it directly on Stripe's checkout */
|
|
price: process.env.STRIPE_TEAM_MONTHLY_PRICE_ID,
|
|
quantity: seats,
|
|
},
|
|
],
|
|
metadata: {
|
|
teamId,
|
|
},
|
|
payment_method_types: ["card"],
|
|
subscription_data: {
|
|
metadata: {
|
|
teamId,
|
|
},
|
|
},
|
|
});
|
|
};
|
|
|
|
export const cancelTeamSubscriptionFromStripe = async (teamId: number) => {
|
|
try {
|
|
const team = await prisma.team.findUniqueOrThrow({
|
|
where: { id: teamId },
|
|
select: { metadata: true },
|
|
});
|
|
const metadata = teamMetadataSchema.parse(team.metadata);
|
|
if (!metadata?.subscriptionId)
|
|
throw Error(
|
|
`Couldn't cancelTeamSubscriptionFromStripe, Team id: ${teamId} didn't have a subscriptionId`
|
|
);
|
|
return await stripe.subscriptions.cancel(metadata.subscriptionId);
|
|
} catch (error) {
|
|
let message = "Unknown error on cancelTeamSubscriptionFromStripe";
|
|
if (error instanceof Error) message = error.message;
|
|
console.error(message);
|
|
}
|
|
};
|