This repository has been archived on 2022-10-07. You can view files and clone it, but cannot push or open issues or pull requests.
skynet-webportal/packages/dashboard/src/pages/api/stripe/checkout.js

60 lines
2.0 KiB
JavaScript

import ky from "ky/umd";
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, authorization) => {
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: { authorization }, json: { stripeCustomerId: customer.id } });
return customer;
};
export default async (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 authorization = req.headers.authorization; // authorization header from request
const user = await ky("http://accounts:3000/user", { headers: { authorization } }).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, authorization);
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) {
console.log(error);
res.status(StatusCodes.BAD_REQUEST).json({ error: { message: error.message } });
}
};