From 2c30976e995fbbfef1d553d4a048c4941a7c2ec6 Mon Sep 17 00:00:00 2001 From: alannnc Date: Thu, 7 Jul 2022 15:24:42 -0600 Subject: [PATCH] WIP stripe customer metedada sync (#3153) --- apps/web/lib/hasKeyInMetadata.ts | 9 +++++++++ apps/web/lib/isPrismaObj.ts | 11 +++++++++++ apps/web/server/routers/viewer.tsx | 22 +++++++++++++++++++++- 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 apps/web/lib/hasKeyInMetadata.ts create mode 100644 apps/web/lib/isPrismaObj.ts diff --git a/apps/web/lib/hasKeyInMetadata.ts b/apps/web/lib/hasKeyInMetadata.ts new file mode 100644 index 0000000000..06155c2c8c --- /dev/null +++ b/apps/web/lib/hasKeyInMetadata.ts @@ -0,0 +1,9 @@ +import isPrismaObj from "./isPrismaObj"; + +const hasKeyInMetadata = ( + x: { metadata: unknown } | null, + key: T +): x is { metadata: { [key in T]: string | boolean | number } } => + isPrismaObj(x?.metadata) && !!x?.metadata && key in x.metadata; + +export default hasKeyInMetadata; diff --git a/apps/web/lib/isPrismaObj.ts b/apps/web/lib/isPrismaObj.ts new file mode 100644 index 0000000000..d405ab32b3 --- /dev/null +++ b/apps/web/lib/isPrismaObj.ts @@ -0,0 +1,11 @@ +import type { Prisma } from "@prisma/client"; + +function isPrismaObj(obj: unknown): obj is Prisma.JsonObject { + return typeof obj === "object" && !Array.isArray(obj); +} + +export function isPrismaObjOrUndefined(obj: unknown) { + return isPrismaObj(obj) ? obj : undefined; +} + +export default isPrismaObj; diff --git a/apps/web/server/routers/viewer.tsx b/apps/web/server/routers/viewer.tsx index c1f2cc0892..8888e41076 100644 --- a/apps/web/server/routers/viewer.tsx +++ b/apps/web/server/routers/viewer.tsx @@ -10,9 +10,11 @@ import { sendFeedbackEmail } from "@calcom/emails"; import { sendCancelledEmails } from "@calcom/emails"; import { parseRecurringEvent, isPrismaObjOrUndefined } from "@calcom/lib"; import { baseEventTypeSelect, bookingMinimalSelect } from "@calcom/prisma"; +import stripe from "@calcom/stripe/server"; import { closePayments } from "@ee/lib/stripe/server"; import { checkUsername } from "@lib/core/server/checkUsername"; +import hasKeyInMetadata from "@lib/hasKeyInMetadata"; import jackson from "@lib/jackson"; import prisma from "@lib/prisma"; import { isTeamOwner } from "@lib/queries/teams"; @@ -704,12 +706,30 @@ const loggedInViewerRouter = createProtectedRouter() data.avatar = await resizeBase64Image(input.avatar); } - await prisma.user.update({ + const updatedUser = await prisma.user.update({ where: { id: user.id, }, data, + select: { + id: true, + username: true, + email: true, + metadata: true, + }, }); + + // Notify stripe about the change + if (updatedUser && updatedUser.metadata && hasKeyInMetadata(updatedUser, "stripeCustomerId")) { + const stripeCustomerId = `${updatedUser.metadata.stripeCustomerId}`; + await stripe.customers.update(stripeCustomerId, { + metadata: { + username: updatedUser.username, + email: updatedUser.email, + userId: updatedUser.id, + }, + }); + } }, }) .mutation("eventTypeOrder", {