From 016023fa508cabd27a9063f878110c99444c46dc Mon Sep 17 00:00:00 2001 From: Mitchell Moore <47459168+Mitchell-Moore@users.noreply.github.com> Date: Sun, 15 May 2022 00:41:39 -0300 Subject: [PATCH] Added check on create eventtype to see is user has slug that already exists (#2757) * Added check on create eventtype to see is user has slug that already exists, added error check on onError * revert yarn.lock back * Catches prisma known error instead of making an additional query Co-authored-by: zomars --- .../web/components/eventtype/CreateEventType.tsx | 5 +++++ apps/web/server/routers/viewer/eventTypes.tsx | 16 ++++++++++++---- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/apps/web/components/eventtype/CreateEventType.tsx b/apps/web/components/eventtype/CreateEventType.tsx index 540660ff78..cf531544e6 100644 --- a/apps/web/components/eventtype/CreateEventType.tsx +++ b/apps/web/components/eventtype/CreateEventType.tsx @@ -104,6 +104,11 @@ export default function CreateEventTypeButton(props: Props) { showToast(message, "error"); } + if (err.data?.code === "BAD_REQUEST") { + const message = `${err.data.code}: URL already exists.`; + showToast(message, "error"); + } + if (err.data?.code === "UNAUTHORIZED") { const message = `${err.data.code}: You are not able to create this event`; showToast(message, "error"); diff --git a/apps/web/server/routers/viewer/eventTypes.tsx b/apps/web/server/routers/viewer/eventTypes.tsx index dd225c1804..4fb76c6a4e 100644 --- a/apps/web/server/routers/viewer/eventTypes.tsx +++ b/apps/web/server/routers/viewer/eventTypes.tsx @@ -1,11 +1,11 @@ import { EventTypeCustomInput, MembershipRole, PeriodType, Prisma } from "@prisma/client"; +import { PrismaClientKnownRequestError } from "@prisma/client/runtime"; import { z } from "zod"; import getAppKeysFromSlug from "@calcom/app-store/_utils/getAppKeysFromSlug"; import { _DestinationCalendarModel, _EventTypeCustomInputModel, _EventTypeModel } from "@calcom/prisma/zod"; import { stringOrNumber } from "@calcom/prisma/zod-utils"; import { createEventTypeInput } from "@calcom/prisma/zod/custom/eventtype"; -import { RecurringEvent } from "@calcom/types/Calendar"; import { createProtectedRouter } from "@server/createRouter"; import { viewerRouter } from "@server/routers/viewer"; @@ -150,9 +150,17 @@ export const eventTypesRouter = createProtectedRouter() data.schedulingType = schedulingType; } - const eventType = await ctx.prisma.eventType.create({ data }); - - return { eventType }; + try { + const eventType = await ctx.prisma.eventType.create({ data }); + return { eventType }; + } catch (e) { + if (e instanceof PrismaClientKnownRequestError) { + if (e.code === "P2002" && Array.isArray(e.meta?.target) && e.meta?.target.includes("slug")) { + throw new TRPCError({ code: "BAD_REQUEST", message: "URL Slug already exists for given user." }); + } + } + throw e; + } }, }) // Prevent non-owners to update/delete a team event