From 445faa406a8898662fdf2f0a6bb8fc180df5cd2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Omar=20L=C3=B3pez?= Date: Thu, 30 Dec 2021 09:42:06 -0700 Subject: [PATCH] Zomars/cal 798 issue with billing portal (#1392) * Uses stripeCustomerId from used metadata in billing portal * Uses stripeCustomerId from used metadata in billing portal # Conflicts: # ee/pages/api/integrations/stripepayment/portal.ts --- .../api/integrations/stripepayment/portal.ts | 29 +++++++++++-------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/ee/pages/api/integrations/stripepayment/portal.ts b/ee/pages/api/integrations/stripepayment/portal.ts index 17c68085c8cd33..759a985d5b3c7e 100644 --- a/ee/pages/api/integrations/stripepayment/portal.ts +++ b/ee/pages/api/integrations/stripepayment/portal.ts @@ -1,3 +1,4 @@ +import { Prisma } from "@prisma/client"; import type { NextApiRequest, NextApiResponse } from "next"; import stripe from "@ee/lib/stripe/server"; @@ -23,6 +24,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) select: { email: true, name: true, + metadata: true, }, }); @@ -31,26 +33,29 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) 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, - }); + let customerId = ""; - const [customer] = customersReponse.data; + if (user?.metadata && typeof user.metadata === "object" && "stripeCustomerId" in user.metadata) { + customerId = (user?.metadata as Prisma.JsonObject).stripeCustomerId as string; + } else { + /* We fallback to finding the customer by email (which is not optimal) */ + const customersReponse = await stripe.customers.list({ + email: user.email, + limit: 1, + }); + if (customersReponse.data[0]?.id) { + customerId = customersReponse.data[0].id; + } + } - if (!customer?.id) + if (!customerId) return res.status(404).json({ message: "Stripe customer id not found", }); const return_url = `${process.env.BASE_URL}/settings/billing`; const stripeSession = await stripe.billingPortal.sessions.create({ - customer: customer.id, + customer: customerId, return_url, });