File size: 1,547 Bytes
60faa09 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | import { stripe } from "../stripe";
import config from "../config";
import { UserService } from "./user";
export const BillingService = {
async createCheckoutSession(userId, planId) {
const plan = config.stripe.plans[planId];
if (!plan) throw new Error("Invalid plan selected");
const session = await stripe.checkout.sessions.create({
payment_method_types: ["card"],
line_items: [
{
price_data: {
currency: "usd",
product_data: {
name: `${config.stripe.plans[planId].name}`,
description: `Purchase ${plan.credits} credits to perform AI generations.`,
},
unit_amount: plan.price,
},
quantity: 1,
},
],
mode: "payment",
success_url: `${config.auth.url}/pricing?success=true`,
cancel_url: `${config.auth.url}/pricing?canceled=true`,
metadata: { userId, credits: plan.credits.toString() },
});
return session.url;
},
async handleWebhook(body, signature) {
const event = stripe.webhooks.constructEvent(body, signature, config.stripe.webhookSecret);
if (event.type === "checkout.session.completed") {
const session = event.data.object;
const userId = session.metadata.userId;
const credits = parseInt(session.metadata.credits || "0", 10);
if (userId && credits > 0) {
await UserService.addCredits(userId, credits);
return { success: true, userId, credits };
}
}
return { success: false };
}
};
|