From 58dde562a39ef0d8eb45a528c5c1c2a665991e14 Mon Sep 17 00:00:00 2001 From: Peer Richelsen Date: Mon, 27 Sep 2021 23:57:23 +0100 Subject: [PATCH] switching to stripes customer portal (#772) --- .../api/integrations/stripepayment/portal.ts | 59 +++++++++++++++++++ .../api/integrations/stripepayment/portal.ts | 1 + pages/settings/billing.tsx | 12 ++-- 3 files changed, 67 insertions(+), 5 deletions(-) create mode 100644 ee/pages/api/integrations/stripepayment/portal.ts create mode 100644 pages/api/integrations/stripepayment/portal.ts diff --git a/ee/pages/api/integrations/stripepayment/portal.ts b/ee/pages/api/integrations/stripepayment/portal.ts new file mode 100644 index 0000000000..01d7b4d4e9 --- /dev/null +++ b/ee/pages/api/integrations/stripepayment/portal.ts @@ -0,0 +1,59 @@ +import type { NextApiRequest, NextApiResponse } from "next"; + +import stripe from "@ee/lib/stripe/server"; + +import { getSession } from "@lib/auth"; +import prisma from "@lib/prisma"; + +export default async function handler(req: NextApiRequest, res: NextApiResponse) { + if (req.method === "POST") { + // Check that user is authenticated + const session = await getSession({ req }); + + if (!session) { + res.status(401).json({ message: "You must be logged in to do this" }); + return; + } + + // Get user + const user = await prisma.user.findUnique({ + where: { + id: session.user?.id, + }, + select: { + email: true, + name: true, + }, + }); + + if (!user?.email) + return res.status(404).json({ + message: "User email not found", + }); + + /** + * TODO: We need to find a better way to get our users customer id from Stripe, + * since the email is not an unique field in Stripe and we don't save them + * in our DB as of now. + **/ + const customersReponse = await stripe.customers.list({ + email: user?.email || "", + limit: 1, + }); + + const [customer] = customersReponse.data; + + if (!customer?.id) + return res.status(404).json({ + message: "Stripe customer id not found", + }); + + const return_url = `${process.env.NEXT_PUBLIC_APP_URL}/settings/billing`; + const stripeSession = await stripe.billingPortal.sessions.create({ + customer: customer.id, + return_url, + }); + + res.redirect(stripeSession.url); + } +} diff --git a/pages/api/integrations/stripepayment/portal.ts b/pages/api/integrations/stripepayment/portal.ts new file mode 100644 index 0000000000..eca9d1d0ec --- /dev/null +++ b/pages/api/integrations/stripepayment/portal.ts @@ -0,0 +1 @@ +export { default } from "@ee/pages/api/integrations/stripepayment/portal"; diff --git a/pages/settings/billing.tsx b/pages/settings/billing.tsx index 41df34a607..8bc41acf91 100644 --- a/pages/settings/billing.tsx +++ b/pages/settings/billing.tsx @@ -1,8 +1,11 @@ +import { GetServerSidePropsContext } from "next"; + import { getSession } from "@lib/auth"; import prisma from "@lib/prisma"; import SettingsShell from "@components/Settings"; import Shell from "@components/Shell"; +import Button from "@components/ui/Button"; export default function Billing() { return ( @@ -10,10 +13,9 @@ export default function Billing() {
-