diff --git a/ee/pages/api/integrations/stripepayment/portal.ts b/ee/pages/api/integrations/stripepayment/portal.ts index 17c68085..759a985d 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, });