import { Prisma } from "@prisma/client"; import stripe from "@ee/lib/stripe/server"; import { HttpError as HttpCode } from "@lib/core/http/error"; import { prisma } from "@lib/prisma"; export async function getStripeCustomerFromUser(userId: number) { // Get user const user = await prisma.user.findUnique({ where: { id: userId, }, select: { email: true, name: true, metadata: true, }, }); if (!user?.email) throw new HttpCode({ statusCode: 404, message: "User email not found" }); const customerId = await getStripeCustomerId(user); return customerId; } const userType = Prisma.validator()({ select: { email: true, metadata: true, }, }); type UserType = Prisma.UserGetPayload; export async function getStripeCustomerId(user: UserType): Promise { let customerId: string | null = null; 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 customersResponse = await stripe.customers.list({ email: user.email, limit: 1, }); if (customersResponse.data[0]?.id) { customerId = customersResponse.data[0].id; } } return customerId; } export async function deleteStripeCustomer(user: UserType): Promise { const customerId = await getStripeCustomerId(user); if (!customerId) { console.warn("No stripe customer found for user:" + user.email); return null; } //delete stripe customer const deletedCustomer = await stripe.customers.del(customerId); return deletedCustomer.id; }