import Stripe from "stripe";
import { StripeApiError, getStripeClient } from "./client";
import type {
CheckoutSessionResult,
CreateCheckoutSessionParams,
} from "./types";
export async function createCheckoutSession(
params: CreateCheckoutSessionParams,
): Promise<CheckoutSessionResult> {
const stripe = getStripeClient();
const metadata = {
user_id: params.userId,
plan_id: params.planId,
...(params.metadata || {}),
};
try {
const sessionParams: Stripe.Checkout.SessionCreateParams = {
mode: "subscription",
line_items: [
{
price: params.priceId,
quantity: 1,
},
],
success_url: params.successUrl,
cancel_url: params.cancelUrl,
metadata,
subscription_data: {
metadata,
},
allow_promotion_codes: params.allowPromotionCodes ?? true,
billing_address_collection: "auto",
};
if (params.customerId) {
sessionParams.customer = params.customerId;
} else if (params.email) {
sessionParams.customer_email = params.email;
}
if (params.trialPeriodDays && params.trialPeriodDays > 0) {
sessionParams.subscription_data!.trial_period_days =
params.trialPeriodDays;
}
const session = await stripe.checkout.sessions.create(sessionParams);
return {
sessionId: session.id,
url: session.url,
};
} catch (error) {
if (error instanceof Stripe.errors.StripeError) {
throw StripeApiError.fromStripeError(error);
}
throw error;
}
}
export async function getCheckoutSession(
sessionId: string,
): Promise<Stripe.Checkout.Session> {
const stripe = getStripeClient();
try {
return await stripe.checkout.sessions.retrieve(sessionId, {
expand: ["subscription", "customer", "line_items"],
});
} catch (error) {
if (error instanceof Stripe.errors.StripeError) {
throw StripeApiError.fromStripeError(error);
}
throw error;
}
}
export async function expireCheckoutSession(
sessionId: string,
): Promise<Stripe.Checkout.Session> {
const stripe = getStripeClient();
try {
return await stripe.checkout.sessions.expire(sessionId);
} catch (error) {
if (error instanceof Stripe.errors.StripeError) {
throw StripeApiError.fromStripeError(error);
}
throw error;
}
}