59 lines
2.0 KiB
JavaScript
59 lines
2.0 KiB
JavaScript
import ky from "ky";
|
|
import Stripe from "stripe";
|
|
import { StatusCodes } from "http-status-codes";
|
|
import { isPaidTier } from "../../../services/tiers";
|
|
|
|
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY);
|
|
|
|
const getStripeCustomer = async (user, cookie) => {
|
|
if (user.stripeCustomerId) {
|
|
return stripe.customers.retrieve(user.stripeCustomerId);
|
|
}
|
|
|
|
const customer = await stripe.customers.create();
|
|
|
|
// update user instance and include the customer id once created
|
|
await ky.put("http://accounts:3000/user", { headers: { cookie }, json: { stripeCustomerId: customer.id } });
|
|
|
|
return customer;
|
|
};
|
|
|
|
export default async function checkoutApi(req, res) {
|
|
if (req.method !== "POST") {
|
|
return res.status(StatusCodes.NOT_FOUND).end();
|
|
}
|
|
|
|
const { price } = req.body;
|
|
|
|
if (!price) {
|
|
return res.status(StatusCodes.BAD_REQUEST).json({ error: { message: "Missing 'price' attribute" } });
|
|
}
|
|
|
|
try {
|
|
const cookie = req.headers.cookie; // cookie header from request
|
|
const user = await ky("http://accounts:3000/user", { headers: { cookie } }).json();
|
|
|
|
if (isPaidTier(user.tier)) {
|
|
const message = `Customer can have only one active subscription at a time, use Stripe Customer Portal to manage active subscription`;
|
|
|
|
return res.status(StatusCodes.BAD_REQUEST).json({ error: { message } });
|
|
}
|
|
|
|
const customer = await getStripeCustomer(user, cookie);
|
|
const session = await stripe.checkout.sessions.create({
|
|
mode: "subscription",
|
|
payment_method_types: ["card"],
|
|
line_items: [{ price, quantity: 1 }],
|
|
customer: customer.id,
|
|
client_reference_id: user.sub,
|
|
allow_promotion_codes: true,
|
|
success_url: `${process.env.SKYNET_DASHBOARD_URL}/payments?session_id={CHECKOUT_SESSION_ID}`,
|
|
cancel_url: `${process.env.SKYNET_DASHBOARD_URL}/payments`,
|
|
});
|
|
|
|
res.json({ sessionId: session.id });
|
|
} catch (error) {
|
|
res.status(StatusCodes.BAD_REQUEST).json({ error: { message: error.message } });
|
|
}
|
|
}
|