diff --git a/lib/validations/event-type.ts b/lib/validations/event-type.ts index 37db4637eb..a84305736b 100644 --- a/lib/validations/event-type.ts +++ b/lib/validations/event-type.ts @@ -130,5 +130,6 @@ export const schemaEventTypeReadPublic = EventType.pick({ .nullable(), metadata: jsonSchema.nullable(), customInputs: customInputSchema.array().optional(), + link: z.string().optional(), }) ); diff --git a/pages/api/event-types/[id]/_get.ts b/pages/api/event-types/[id]/_get.ts index 58046dedcd..74d9d14456 100644 --- a/pages/api/event-types/[id]/_get.ts +++ b/pages/api/event-types/[id]/_get.ts @@ -5,6 +5,8 @@ import { defaultResponder } from "@calcom/lib/server"; import { schemaEventTypeReadPublic } from "~/lib/validations/event-type"; import { schemaQueryIdParseInt } from "~/lib/validations/shared/queryIdTransformParseInt"; +import getCalLink from "../_utils/getCalLink"; + /** * @swagger * /event-types/{id}: @@ -40,8 +42,19 @@ import { schemaQueryIdParseInt } from "~/lib/validations/shared/queryIdTransform export async function getHandler(req: NextApiRequest) { const { prisma, query } = req; const { id } = schemaQueryIdParseInt.parse(query); - const event_type = await prisma.eventType.findUnique({ where: { id }, include: { customInputs: true } }); - return { event_type: schemaEventTypeReadPublic.parse(event_type) }; + const event_type = await prisma.eventType.findUnique({ + where: { id }, + include: { + customInputs: true, + team: { select: { slug: true } }, + users: true, + owner: { select: { username: true, id: true } }, + }, + }); + + const link = event_type ? getCalLink(event_type) : null; + + return { event_type: schemaEventTypeReadPublic.parse({ ...event_type, link }) }; } export default defaultResponder(getHandler); diff --git a/pages/api/event-types/_get.ts b/pages/api/event-types/_get.ts index 0f5810a774..acdfdc4dee 100644 --- a/pages/api/event-types/_get.ts +++ b/pages/api/event-types/_get.ts @@ -7,6 +7,8 @@ import { defaultResponder } from "@calcom/lib/server"; import { schemaEventTypeReadPublic } from "~/lib/validations/event-type"; import { schemaQuerySingleOrMultipleUserIds } from "~/lib/validations/shared/queryUserId"; +import getCalLink from "./_utils/getCalLink"; + /** * @swagger * /event-types: @@ -34,9 +36,10 @@ import { schemaQuerySingleOrMultipleUserIds } from "~/lib/validations/shared/que */ async function getHandler(req: NextApiRequest) { const { userId, isAdmin, prisma } = req; - const args: Prisma.EventTypeFindManyArgs = isAdmin - ? {} - : { where: { userId }, include: { customInputs: true } }; + + const args: Prisma.EventTypeFindManyArgs = { + where: { userId }, + }; /** Only admins can query other users */ if (!isAdmin && req.query.userId) throw new HttpError({ statusCode: 401, message: "ADMIN required" }); if (isAdmin && req.query.userId) { @@ -44,8 +47,21 @@ async function getHandler(req: NextApiRequest) { const userIds = Array.isArray(query.userId) ? query.userId : [query.userId || userId]; args.where = { userId: { in: userIds } }; } - const data = await prisma.eventType.findMany(args); - return { event_types: data.map((attendee) => schemaEventTypeReadPublic.parse(attendee)) }; + const data = await prisma.eventType.findMany({ + ...args, + include: { + customInputs: true, + team: { select: { slug: true } }, + users: true, + owner: { select: { username: true, id: true } }, + }, + }); + return { + event_types: data.map((eventType) => { + const link = getCalLink(eventType); + return schemaEventTypeReadPublic.parse({ ...eventType, link }); + }), + }; } export default defaultResponder(getHandler); diff --git a/pages/api/event-types/_utils/getCalLink.ts b/pages/api/event-types/_utils/getCalLink.ts new file mode 100644 index 0000000000..5c46575585 --- /dev/null +++ b/pages/api/event-types/_utils/getCalLink.ts @@ -0,0 +1,16 @@ +import { CAL_URL } from "@calcom/lib/constants"; + +export default function getCalLink(eventType: { + team?: { slug: string | null } | null; + owner: { username: string | null } | null; + users?: { username: string | null }[]; + slug: string; +}) { + return `${CAL_URL}/${ + eventType?.team + ? `team/${eventType?.team?.slug}` + : eventType?.owner + ? eventType.owner.username + : eventType?.users?.[0]?.username + }/${eventType?.slug}`; +}