diff --git a/apps/api/lib/helpers/customPrisma.ts b/apps/api/lib/helpers/customPrisma.ts deleted file mode 100644 index 926c7979cf..0000000000 --- a/apps/api/lib/helpers/customPrisma.ts +++ /dev/null @@ -1,43 +0,0 @@ -import type { NextMiddleware } from "next-api-middleware"; - -import { CONSOLE_URL } from "@calcom/lib/constants"; -import { customPrisma } from "@calcom/prisma"; - -const LOCAL_CONSOLE_URL = process.env.NEXT_PUBLIC_CONSOLE_URL || CONSOLE_URL; - -// This replaces the prisma client for the custom one if the key is valid -export const customPrismaClient: NextMiddleware = async (req, res, next) => { - const { - query: { key }, - } = req; - // If no custom api Id is provided, attach to request the regular cal.com prisma client. - if (!key) { - req.prisma = customPrisma(); - await next(); - return; - } - - // If we have a key, we check if the deployment matching the key, has a databaseUrl value set. - const databaseUrl = await fetch(`${LOCAL_CONSOLE_URL}/api/deployments/database?key=${key}`) - .then((res) => res.json()) - .then((res) => res.databaseUrl); - - if (!databaseUrl) { - res.status(400).json({ error: "no databaseUrl set up at your instance yet" }); - return; - } - req.prisma = customPrisma({ datasources: { db: { url: databaseUrl } } }); - /* @note: - In order to skip verifyApiKey for customPrisma requests, - we pass isAdmin true, and userId 0, if we detect them later, - we skip verifyApiKey logic and pass onto next middleware instead. - */ - req.isAdmin = true; - req.isCustomPrisma = true; - // We don't need the key from here and on. Prevents unrecognized key errors. - delete req.query.key; - await next(); - await req.prisma.$disconnect(); - // @ts-expect-error testing - delete req.prisma; -}; diff --git a/apps/api/lib/helpers/verifyApiKey.ts b/apps/api/lib/helpers/verifyApiKey.ts index 85bb98ad7c..8b8114888e 100644 --- a/apps/api/lib/helpers/verifyApiKey.ts +++ b/apps/api/lib/helpers/verifyApiKey.ts @@ -3,6 +3,7 @@ import type { NextMiddleware } from "next-api-middleware"; import { hashAPIKey } from "@calcom/features/ee/api-keys/lib/apiKeys"; import checkLicense from "@calcom/features/ee/common/server/checkLicense"; import { IS_PRODUCTION } from "@calcom/lib/constants"; +import prisma from "@calcom/prisma"; import { isAdminGuard } from "../utils/isAdmin"; @@ -16,15 +17,9 @@ export const dateNotInPast = function (date: Date) { // This verifies the apiKey and sets the user if it is valid. export const verifyApiKey: NextMiddleware = async (req, res, next) => { - const { prisma, isCustomPrisma, isAdmin } = req; const hasValidLicense = await checkLicense(prisma); if (!hasValidLicense && IS_PRODUCTION) return res.status(401).json({ error: "Invalid or missing CALCOM_LICENSE_KEY environment variable" }); - // If the user is an admin and using a license key (from customPrisma), skip the apiKey check. - if (isCustomPrisma && isAdmin) { - await next(); - return; - } // Check if the apiKey query param is provided. if (!req.query.apiKey) return res.status(401).json({ message: "No apiKey provided" }); // remove the prefix from the user provided api_key. If no env set default to "cal_" @@ -43,6 +38,5 @@ export const verifyApiKey: NextMiddleware = async (req, res, next) => { req.userId = apiKey.userId; // save the isAdmin boolean here for later use req.isAdmin = await isAdminGuard(req); - req.isCustomPrisma = false; await next(); }; diff --git a/apps/api/lib/helpers/withMiddleware.ts b/apps/api/lib/helpers/withMiddleware.ts index ecfa22fd4f..43fcb46f88 100644 --- a/apps/api/lib/helpers/withMiddleware.ts +++ b/apps/api/lib/helpers/withMiddleware.ts @@ -2,7 +2,6 @@ import { label } from "next-api-middleware"; import { addRequestId } from "./addRequestid"; import { captureErrors } from "./captureErrors"; -import { customPrismaClient } from "./customPrisma"; import { extendRequest } from "./extendRequest"; import { HTTP_POST, @@ -26,7 +25,6 @@ const middleware = { addRequestId, verifyApiKey, rateLimitApiKey, - customPrismaClient, extendRequest, pagination: withPagination, captureErrors, @@ -34,17 +32,14 @@ const middleware = { type Middleware = keyof typeof middleware; -const middlewareOrder = +const middlewareOrder = [ // The order here, determines the order of execution - [ - "extendRequest", - "captureErrors", - // - Put customPrismaClient before verifyApiKey always. - "customPrismaClient", - "verifyApiKey", - "rateLimitApiKey", - "addRequestId", - ] as Middleware[]; // <-- Provide a list of middleware to call automatically + "extendRequest", + "captureErrors", + "verifyApiKey", + "rateLimitApiKey", + "addRequestId", +] as Middleware[]; // <-- Provide a list of middleware to call automatically const withMiddleware = label(middleware, middlewareOrder); diff --git a/apps/api/lib/utils/isAdmin.ts b/apps/api/lib/utils/isAdmin.ts index 9b9e6f5342..8b90c37867 100644 --- a/apps/api/lib/utils/isAdmin.ts +++ b/apps/api/lib/utils/isAdmin.ts @@ -1,9 +1,10 @@ import type { NextApiRequest } from "next"; +import prisma from "@calcom/prisma"; import { UserPermissionRole } from "@calcom/prisma/enums"; export const isAdminGuard = async (req: NextApiRequest) => { - const { userId, prisma } = req; + const { userId } = req; const user = await prisma.user.findUnique({ where: { id: userId } }); return user?.role === UserPermissionRole.ADMIN; }; diff --git a/apps/api/next.d.ts b/apps/api/next.d.ts index c6f0a9d4c9..5c1be26eb4 100644 --- a/apps/api/next.d.ts +++ b/apps/api/next.d.ts @@ -1,8 +1,6 @@ import type { Session } from "next-auth"; import type { NextApiRequest as BaseNextApiRequest } from "next/types"; -import type { PrismaClient } from "@calcom/prisma"; - export type * from "next/types"; export declare module "next" { @@ -11,11 +9,9 @@ export declare module "next" { userId: number; method: string; - prisma: PrismaClient; // session: { user: { id: number } }; // query: Partial<{ [key: string]: string | string[] }>; isAdmin: boolean; - isCustomPrisma: boolean; pagination: { take: number; skip: number }; } } diff --git a/apps/api/pages/api/api-keys/[id]/_auth-middleware.ts b/apps/api/pages/api/api-keys/[id]/_auth-middleware.ts index fb1c917485..c0e3fb1438 100644 --- a/apps/api/pages/api/api-keys/[id]/_auth-middleware.ts +++ b/apps/api/pages/api/api-keys/[id]/_auth-middleware.ts @@ -1,11 +1,12 @@ import type { NextApiRequest } from "next"; import { HttpError } from "@calcom/lib/http-error"; +import prisma from "@calcom/prisma"; import { schemaQueryIdAsString } from "~/lib/validations/shared/queryIdString"; export async function authMiddleware(req: NextApiRequest) { - const { userId, isAdmin, prisma } = req; + const { userId, isAdmin } = req; const { id } = schemaQueryIdAsString.parse(req.query); // Admin can check any api key if (isAdmin) return; diff --git a/apps/api/pages/api/api-keys/[id]/_delete.ts b/apps/api/pages/api/api-keys/[id]/_delete.ts index 099c6ba7b1..f42146caa8 100644 --- a/apps/api/pages/api/api-keys/[id]/_delete.ts +++ b/apps/api/pages/api/api-keys/[id]/_delete.ts @@ -1,11 +1,12 @@ import type { NextApiRequest } from "next"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { schemaQueryIdAsString } from "~/lib/validations/shared/queryIdString"; async function deleteHandler(req: NextApiRequest) { - const { prisma, query } = req; + const { query } = req; const { id } = schemaQueryIdAsString.parse(query); await prisma.apiKey.delete({ where: { id } }); return { message: `ApiKey with id: ${id} deleted` }; diff --git a/apps/api/pages/api/api-keys/[id]/_get.ts b/apps/api/pages/api/api-keys/[id]/_get.ts index 99b1188507..7c9645ce87 100644 --- a/apps/api/pages/api/api-keys/[id]/_get.ts +++ b/apps/api/pages/api/api-keys/[id]/_get.ts @@ -1,12 +1,13 @@ import type { NextApiRequest } from "next"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { apiKeyPublicSchema } from "~/lib/validations/api-key"; import { schemaQueryIdAsString } from "~/lib/validations/shared/queryIdString"; async function getHandler(req: NextApiRequest) { - const { prisma, query } = req; + const { query } = req; const { id } = schemaQueryIdAsString.parse(query); const api_key = await prisma.apiKey.findUniqueOrThrow({ where: { id } }); return { api_key: apiKeyPublicSchema.parse(api_key) }; diff --git a/apps/api/pages/api/api-keys/[id]/_patch.ts b/apps/api/pages/api/api-keys/[id]/_patch.ts index 673a081f54..b08c8b97ab 100644 --- a/apps/api/pages/api/api-keys/[id]/_patch.ts +++ b/apps/api/pages/api/api-keys/[id]/_patch.ts @@ -1,12 +1,13 @@ import type { NextApiRequest } from "next"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { apiKeyEditBodySchema, apiKeyPublicSchema } from "~/lib/validations/api-key"; import { schemaQueryIdAsString } from "~/lib/validations/shared/queryIdString"; async function patchHandler(req: NextApiRequest) { - const { prisma, body } = req; + const { body } = req; const { id } = schemaQueryIdAsString.parse(req.query); const data = apiKeyEditBodySchema.parse(body); const api_key = await prisma.apiKey.update({ where: { id }, data }); diff --git a/apps/api/pages/api/api-keys/_get.ts b/apps/api/pages/api/api-keys/_get.ts index 8c23c6fe9e..8f18e3ebae 100644 --- a/apps/api/pages/api/api-keys/_get.ts +++ b/apps/api/pages/api/api-keys/_get.ts @@ -2,6 +2,7 @@ import type { Prisma } from "@prisma/client"; import type { NextApiRequest } from "next"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import type { Ensure } from "@calcom/types/utils"; import { apiKeyPublicSchema } from "~/lib/validations/api-key"; @@ -29,7 +30,7 @@ function hasReqArgs(req: CustomNextApiRequest): req is Ensure) { - const { isAdmin, prisma } = req; + const { isAdmin } = req; if (isAdmin) return; const { userId } = req; const { bookingId } = body; diff --git a/apps/api/pages/api/attendees/_get.ts b/apps/api/pages/api/attendees/_get.ts index d6662d897c..b3ec13db7b 100644 --- a/apps/api/pages/api/attendees/_get.ts +++ b/apps/api/pages/api/attendees/_get.ts @@ -3,6 +3,7 @@ import type { NextApiRequest } from "next"; import { HttpError } from "@calcom/lib/http-error"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { schemaAttendeeReadPublic } from "~/lib/validations/attendee"; @@ -30,7 +31,7 @@ import { schemaAttendeeReadPublic } from "~/lib/validations/attendee"; * description: No attendees were found */ async function handler(req: NextApiRequest) { - const { userId, isAdmin, prisma } = req; + const { userId, isAdmin } = req; const args: Prisma.AttendeeFindManyArgs = isAdmin ? {} : { where: { booking: { userId } } }; const data = await prisma.attendee.findMany(args); const attendees = data.map((attendee) => schemaAttendeeReadPublic.parse(attendee)); diff --git a/apps/api/pages/api/attendees/_post.ts b/apps/api/pages/api/attendees/_post.ts index 8570376c55..610f306282 100644 --- a/apps/api/pages/api/attendees/_post.ts +++ b/apps/api/pages/api/attendees/_post.ts @@ -2,6 +2,7 @@ import type { NextApiRequest } from "next"; import { HttpError } from "@calcom/lib/http-error"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { schemaAttendeeCreateBodyParams, schemaAttendeeReadPublic } from "~/lib/validations/attendee"; @@ -51,7 +52,7 @@ import { schemaAttendeeCreateBodyParams, schemaAttendeeReadPublic } from "~/lib/ * description: Authorization information is missing or invalid. */ async function postHandler(req: NextApiRequest) { - const { userId, isAdmin, prisma } = req; + const { userId, isAdmin } = req; const body = schemaAttendeeCreateBodyParams.parse(req.body); if (!isAdmin) { diff --git a/apps/api/pages/api/availabilities/[id]/_auth-middleware.ts b/apps/api/pages/api/availabilities/[id]/_auth-middleware.ts index 63ad3a3c32..406c808511 100644 --- a/apps/api/pages/api/availabilities/[id]/_auth-middleware.ts +++ b/apps/api/pages/api/availabilities/[id]/_auth-middleware.ts @@ -1,9 +1,11 @@ import type { NextApiRequest } from "next"; +import prisma from "@calcom/prisma"; + import { schemaQueryIdParseInt } from "~/lib/validations/shared/queryIdTransformParseInt"; async function authMiddleware(req: NextApiRequest) { - const { userId, prisma, isAdmin, query } = req; + const { userId, isAdmin, query } = req; const { id } = schemaQueryIdParseInt.parse(query); /** Admins can skip the ownership verification */ if (isAdmin) return; diff --git a/apps/api/pages/api/availabilities/[id]/_delete.ts b/apps/api/pages/api/availabilities/[id]/_delete.ts index d480ad4a93..9c5539add4 100644 --- a/apps/api/pages/api/availabilities/[id]/_delete.ts +++ b/apps/api/pages/api/availabilities/[id]/_delete.ts @@ -1,6 +1,7 @@ import type { NextApiRequest } from "next"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { schemaQueryIdParseInt } from "~/lib/validations/shared/queryIdTransformParseInt"; @@ -36,7 +37,7 @@ import { schemaQueryIdParseInt } from "~/lib/validations/shared/queryIdTransform * description: Authorization information is missing or invalid. */ export async function deleteHandler(req: NextApiRequest) { - const { prisma, query } = req; + const { query } = req; const { id } = schemaQueryIdParseInt.parse(query); await prisma.availability.delete({ where: { id } }); return { message: `Availability with id: ${id} deleted successfully` }; diff --git a/apps/api/pages/api/availabilities/[id]/_get.ts b/apps/api/pages/api/availabilities/[id]/_get.ts index a481ac1f89..aeb41de90e 100644 --- a/apps/api/pages/api/availabilities/[id]/_get.ts +++ b/apps/api/pages/api/availabilities/[id]/_get.ts @@ -1,6 +1,7 @@ import type { NextApiRequest } from "next"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { schemaAvailabilityReadPublic } from "~/lib/validations/availability"; import { schemaQueryIdParseInt } from "~/lib/validations/shared/queryIdTransformParseInt"; @@ -37,7 +38,7 @@ import { schemaQueryIdParseInt } from "~/lib/validations/shared/queryIdTransform * description: Availability not found */ export async function getHandler(req: NextApiRequest) { - const { prisma, query } = req; + const { query } = req; const { id } = schemaQueryIdParseInt.parse(query); const availability = await prisma.availability.findUnique({ where: { id }, diff --git a/apps/api/pages/api/availabilities/[id]/_patch.ts b/apps/api/pages/api/availabilities/[id]/_patch.ts index 2b97d01461..87cd787b93 100644 --- a/apps/api/pages/api/availabilities/[id]/_patch.ts +++ b/apps/api/pages/api/availabilities/[id]/_patch.ts @@ -1,6 +1,7 @@ import type { NextApiRequest } from "next"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { schemaAvailabilityEditBodyParams, @@ -72,7 +73,7 @@ import { schemaQueryIdParseInt } from "~/lib/validations/shared/queryIdTransform * description: Authorization information is missing or invalid. */ export async function patchHandler(req: NextApiRequest) { - const { prisma, query, body } = req; + const { query, body } = req; const { id } = schemaQueryIdParseInt.parse(query); const data = schemaAvailabilityEditBodyParams.parse(body); const availability = await prisma.availability.update({ diff --git a/apps/api/pages/api/availabilities/_post.ts b/apps/api/pages/api/availabilities/_post.ts index 19c76f26cb..a0f915241f 100644 --- a/apps/api/pages/api/availabilities/_post.ts +++ b/apps/api/pages/api/availabilities/_post.ts @@ -2,6 +2,7 @@ import type { NextApiRequest } from "next"; import { HttpError } from "@calcom/lib/http-error"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { schemaAvailabilityCreateBodyParams, @@ -71,7 +72,6 @@ import { * description: Authorization information is missing or invalid. */ async function postHandler(req: NextApiRequest) { - const { prisma } = req; const data = schemaAvailabilityCreateBodyParams.parse(req.body); await checkPermissions(req); const availability = await prisma.availability.create({ @@ -86,7 +86,7 @@ async function postHandler(req: NextApiRequest) { } async function checkPermissions(req: NextApiRequest) { - const { userId, prisma, isAdmin } = req; + const { userId, isAdmin } = req; if (isAdmin) return; const data = schemaAvailabilityCreateBodyParams.parse(req.body); const schedule = await prisma.schedule.findFirst({ diff --git a/apps/api/pages/api/availability/_get.ts b/apps/api/pages/api/availability/_get.ts index 6f39d99c8d..580d149c6f 100644 --- a/apps/api/pages/api/availability/_get.ts +++ b/apps/api/pages/api/availability/_get.ts @@ -4,6 +4,7 @@ import { z } from "zod"; import { getUserAvailability } from "@calcom/core/getUserAvailability"; import { HttpError } from "@calcom/lib/http-error"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { availabilityUserSelect } from "@calcom/prisma"; import { MembershipRole } from "@calcom/prisma/enums"; import { stringOrNumber } from "@calcom/prisma/zod-utils"; @@ -188,7 +189,7 @@ const availabilitySchema = z ); async function handler(req: NextApiRequest) { - const { prisma, isAdmin, userId: reqUserId } = req; + const { isAdmin, userId: reqUserId } = req; const { username, userId, eventTypeId, dateTo, dateFrom, teamId } = availabilitySchema.parse(req.query); if (!teamId) return getUserAvailability({ diff --git a/apps/api/pages/api/booking-references/[id]/_auth-middleware.ts b/apps/api/pages/api/booking-references/[id]/_auth-middleware.ts index fb4d179e61..1970d5d208 100644 --- a/apps/api/pages/api/booking-references/[id]/_auth-middleware.ts +++ b/apps/api/pages/api/booking-references/[id]/_auth-middleware.ts @@ -1,11 +1,12 @@ import type { NextApiRequest } from "next"; import { HttpError } from "@calcom/lib/http-error"; +import prisma from "@calcom/prisma"; import { schemaQueryIdParseInt } from "~/lib/validations/shared/queryIdTransformParseInt"; async function authMiddleware(req: NextApiRequest) { - const { userId, isAdmin, prisma } = req; + const { userId, isAdmin } = req; const { id } = schemaQueryIdParseInt.parse(req.query); // Here we make sure to only return references of the user's own bookings if the user is not an admin. if (isAdmin) return; diff --git a/apps/api/pages/api/booking-references/[id]/_delete.ts b/apps/api/pages/api/booking-references/[id]/_delete.ts index 23a83ce311..0dbcf32525 100644 --- a/apps/api/pages/api/booking-references/[id]/_delete.ts +++ b/apps/api/pages/api/booking-references/[id]/_delete.ts @@ -1,6 +1,7 @@ import type { NextApiRequest } from "next"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { schemaQueryIdParseInt } from "~/lib/validations/shared/queryIdTransformParseInt"; @@ -34,7 +35,7 @@ import { schemaQueryIdParseInt } from "~/lib/validations/shared/queryIdTransform * description: Authorization information is missing or invalid. */ export async function deleteHandler(req: NextApiRequest) { - const { prisma, query } = req; + const { query } = req; const { id } = schemaQueryIdParseInt.parse(query); await prisma.bookingReference.delete({ where: { id } }); return { message: `BookingReference with id: ${id} deleted` }; diff --git a/apps/api/pages/api/booking-references/[id]/_get.ts b/apps/api/pages/api/booking-references/[id]/_get.ts index 6baf71a550..5ef19d9263 100644 --- a/apps/api/pages/api/booking-references/[id]/_get.ts +++ b/apps/api/pages/api/booking-references/[id]/_get.ts @@ -1,6 +1,7 @@ import type { NextApiRequest } from "next"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { schemaBookingReferenceReadPublic } from "~/lib/validations/booking-reference"; import { schemaQueryIdParseInt } from "~/lib/validations/shared/queryIdTransformParseInt"; @@ -35,7 +36,7 @@ import { schemaQueryIdParseInt } from "~/lib/validations/shared/queryIdTransform * description: BookingReference was not found */ export async function getHandler(req: NextApiRequest) { - const { prisma, query } = req; + const { query } = req; const { id } = schemaQueryIdParseInt.parse(query); const booking_reference = await prisma.bookingReference.findUniqueOrThrow({ where: { id } }); return { booking_reference: schemaBookingReferenceReadPublic.parse(booking_reference) }; diff --git a/apps/api/pages/api/booking-references/[id]/_patch.ts b/apps/api/pages/api/booking-references/[id]/_patch.ts index 37e17e2e00..d90ddeb31d 100644 --- a/apps/api/pages/api/booking-references/[id]/_patch.ts +++ b/apps/api/pages/api/booking-references/[id]/_patch.ts @@ -2,6 +2,7 @@ import type { Prisma } from "@prisma/client"; import type { NextApiRequest } from "next"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { schemaBookingEditBodyParams, @@ -59,7 +60,7 @@ import { schemaQueryIdParseInt } from "~/lib/validations/shared/queryIdTransform * description: Authorization information is missing or invalid. */ export async function patchHandler(req: NextApiRequest) { - const { prisma, query, body, isAdmin, userId } = req; + const { query, body, isAdmin, userId } = req; const { id } = schemaQueryIdParseInt.parse(query); const data = schemaBookingEditBodyParams.parse(body); /* If user tries to update bookingId, we run extra checks */ diff --git a/apps/api/pages/api/booking-references/_get.ts b/apps/api/pages/api/booking-references/_get.ts index c3b81a4622..15dc11c1c0 100644 --- a/apps/api/pages/api/booking-references/_get.ts +++ b/apps/api/pages/api/booking-references/_get.ts @@ -2,6 +2,7 @@ import type { Prisma } from "@prisma/client"; import type { NextApiRequest } from "next"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { schemaBookingReferenceReadPublic } from "~/lib/validations/booking-reference"; @@ -29,7 +30,7 @@ import { schemaBookingReferenceReadPublic } from "~/lib/validations/booking-refe * description: No booking references were found */ async function getHandler(req: NextApiRequest) { - const { userId, isAdmin, prisma } = req; + const { userId, isAdmin } = req; const args: Prisma.BookingReferenceFindManyArgs = isAdmin ? {} : { where: { booking: { userId } } }; const data = await prisma.bookingReference.findMany(args); return { booking_references: data.map((br) => schemaBookingReferenceReadPublic.parse(br)) }; diff --git a/apps/api/pages/api/booking-references/_post.ts b/apps/api/pages/api/booking-references/_post.ts index b3b8b713cf..98761421f9 100644 --- a/apps/api/pages/api/booking-references/_post.ts +++ b/apps/api/pages/api/booking-references/_post.ts @@ -2,6 +2,7 @@ import type { Prisma } from "@prisma/client"; import type { NextApiRequest } from "next"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { schemaBookingCreateBodyParams, @@ -61,7 +62,7 @@ import { * description: Authorization information is missing or invalid. */ async function postHandler(req: NextApiRequest) { - const { userId, isAdmin, prisma } = req; + const { userId, isAdmin } = req; const body = schemaBookingCreateBodyParams.parse(req.body); const args: Prisma.BookingFindFirstOrThrowArgs = isAdmin ? /* If admin, we only check that the booking exists */ diff --git a/apps/api/pages/api/bookings/[id]/_auth-middleware.ts b/apps/api/pages/api/bookings/[id]/_auth-middleware.ts index 0016de42e9..b365b675e0 100644 --- a/apps/api/pages/api/bookings/[id]/_auth-middleware.ts +++ b/apps/api/pages/api/bookings/[id]/_auth-middleware.ts @@ -1,11 +1,12 @@ import type { NextApiRequest } from "next"; import { HttpError } from "@calcom/lib/http-error"; +import prisma from "@calcom/prisma"; import { schemaQueryIdParseInt } from "~/lib/validations/shared/queryIdTransformParseInt"; async function authMiddleware(req: NextApiRequest) { - const { userId, prisma, isAdmin, query } = req; + const { userId, isAdmin, query } = req; if (isAdmin) { return; } diff --git a/apps/api/pages/api/bookings/[id]/_get.ts b/apps/api/pages/api/bookings/[id]/_get.ts index c549af8b86..bc8511b586 100644 --- a/apps/api/pages/api/bookings/[id]/_get.ts +++ b/apps/api/pages/api/bookings/[id]/_get.ts @@ -1,6 +1,7 @@ import type { NextApiRequest } from "next"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { schemaBookingReadPublic } from "~/lib/validations/booking"; import { schemaQueryIdParseInt } from "~/lib/validations/shared/queryIdTransformParseInt"; @@ -86,7 +87,7 @@ import { schemaQueryIdParseInt } from "~/lib/validations/shared/queryIdTransform */ export async function getHandler(req: NextApiRequest) { - const { prisma, query } = req; + const { query } = req; const { id } = schemaQueryIdParseInt.parse(query); const booking = await prisma.booking.findUnique({ where: { id }, diff --git a/apps/api/pages/api/bookings/[id]/_patch.ts b/apps/api/pages/api/bookings/[id]/_patch.ts index 1e0e960b6d..ed36ec8ed4 100644 --- a/apps/api/pages/api/bookings/[id]/_patch.ts +++ b/apps/api/pages/api/bookings/[id]/_patch.ts @@ -3,6 +3,7 @@ import type { z } from "zod"; import { HttpError } from "@calcom/lib/http-error"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { schemaBookingEditBodyParams, schemaBookingReadPublic } from "~/lib/validations/booking"; import { schemaQueryIdParseInt } from "~/lib/validations/shared/queryIdTransformParseInt"; @@ -99,7 +100,7 @@ import { schemaQueryIdParseInt } from "~/lib/validations/shared/queryIdTransform * description: Authorization information is missing or invalid. */ export async function patchHandler(req: NextApiRequest) { - const { prisma, query, body } = req; + const { query, body } = req; const { id } = schemaQueryIdParseInt.parse(query); const data = schemaBookingEditBodyParams.parse(body); await checkPermissions(req, data); diff --git a/apps/api/pages/api/bookings/_get.ts b/apps/api/pages/api/bookings/_get.ts index e898653621..67ae16f456 100644 --- a/apps/api/pages/api/bookings/_get.ts +++ b/apps/api/pages/api/bookings/_get.ts @@ -3,6 +3,7 @@ import type { NextApiRequest } from "next"; import { HttpError } from "@calcom/lib/http-error"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { schemaBookingGetParams, schemaBookingReadPublic } from "~/lib/validations/booking"; import { schemaQuerySingleOrMultipleAttendeeEmails } from "~/lib/validations/shared/queryAttendeeEmail"; @@ -161,7 +162,7 @@ function buildWhereClause( } async function handler(req: NextApiRequest) { - const { userId, isAdmin, prisma } = req; + const { userId, isAdmin } = req; const { dateFrom, dateTo } = schemaBookingGetParams.parse(req.query); diff --git a/apps/api/pages/api/custom-inputs/[id]/_auth-middleware.ts b/apps/api/pages/api/custom-inputs/[id]/_auth-middleware.ts index 3bae379831..bc5888acbb 100644 --- a/apps/api/pages/api/custom-inputs/[id]/_auth-middleware.ts +++ b/apps/api/pages/api/custom-inputs/[id]/_auth-middleware.ts @@ -1,11 +1,12 @@ import type { NextApiRequest } from "next"; import { HttpError } from "@calcom/lib/http-error"; +import prisma from "@calcom/prisma"; import { schemaQueryIdParseInt } from "~/lib/validations/shared/queryIdTransformParseInt"; async function authMiddleware(req: NextApiRequest) { - const { userId, isAdmin, prisma } = req; + const { userId, isAdmin } = req; const { id } = schemaQueryIdParseInt.parse(req.query); // Admins can just skip this check if (isAdmin) return; diff --git a/apps/api/pages/api/custom-inputs/[id]/_delete.ts b/apps/api/pages/api/custom-inputs/[id]/_delete.ts index 747e1954ff..08b636b959 100644 --- a/apps/api/pages/api/custom-inputs/[id]/_delete.ts +++ b/apps/api/pages/api/custom-inputs/[id]/_delete.ts @@ -1,6 +1,7 @@ import type { NextApiRequest } from "next"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { schemaQueryIdParseInt } from "~/lib/validations/shared/queryIdTransformParseInt"; @@ -33,7 +34,7 @@ import { schemaQueryIdParseInt } from "~/lib/validations/shared/queryIdTransform * description: Authorization information is missing or invalid. */ export async function deleteHandler(req: NextApiRequest) { - const { prisma, query } = req; + const { query } = req; const { id } = schemaQueryIdParseInt.parse(query); await prisma.eventTypeCustomInput.delete({ where: { id } }); return { message: `CustomInputEventType with id: ${id} deleted successfully` }; diff --git a/apps/api/pages/api/custom-inputs/[id]/_get.ts b/apps/api/pages/api/custom-inputs/[id]/_get.ts index 96cb8133dc..321aea5487 100644 --- a/apps/api/pages/api/custom-inputs/[id]/_get.ts +++ b/apps/api/pages/api/custom-inputs/[id]/_get.ts @@ -1,6 +1,7 @@ import type { NextApiRequest } from "next"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { schemaEventTypeCustomInputPublic } from "~/lib/validations/event-type-custom-input"; import { schemaQueryIdParseInt } from "~/lib/validations/shared/queryIdTransformParseInt"; @@ -34,7 +35,7 @@ import { schemaQueryIdParseInt } from "~/lib/validations/shared/queryIdTransform * description: EventType was not found */ export async function getHandler(req: NextApiRequest) { - const { prisma, query } = req; + const { query } = req; const { id } = schemaQueryIdParseInt.parse(query); const data = await prisma.eventTypeCustomInput.findUniqueOrThrow({ where: { id } }); return { event_type_custom_input: schemaEventTypeCustomInputPublic.parse(data) }; diff --git a/apps/api/pages/api/custom-inputs/[id]/_patch.ts b/apps/api/pages/api/custom-inputs/[id]/_patch.ts index 9ecdd822de..ae863c3906 100644 --- a/apps/api/pages/api/custom-inputs/[id]/_patch.ts +++ b/apps/api/pages/api/custom-inputs/[id]/_patch.ts @@ -1,6 +1,7 @@ import type { NextApiRequest } from "next"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { schemaEventTypeCustomInputEditBodyParams, @@ -76,7 +77,7 @@ import { schemaQueryIdParseInt } from "~/lib/validations/shared/queryIdTransform * description: Authorization information is missing or invalid. */ export async function patchHandler(req: NextApiRequest) { - const { prisma, query } = req; + const { query } = req; const { id } = schemaQueryIdParseInt.parse(query); const data = schemaEventTypeCustomInputEditBodyParams.parse(req.body); const result = await prisma.eventTypeCustomInput.update({ where: { id }, data }); diff --git a/apps/api/pages/api/custom-inputs/_get.ts b/apps/api/pages/api/custom-inputs/_get.ts index db63434ddf..02e8909451 100644 --- a/apps/api/pages/api/custom-inputs/_get.ts +++ b/apps/api/pages/api/custom-inputs/_get.ts @@ -2,6 +2,7 @@ import type { Prisma } from "@prisma/client"; import type { NextApiRequest } from "next"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { schemaEventTypeCustomInputPublic } from "~/lib/validations/event-type-custom-input"; @@ -28,7 +29,7 @@ import { schemaEventTypeCustomInputPublic } from "~/lib/validations/event-type-c * description: No eventTypeCustomInputs were found */ async function getHandler(req: NextApiRequest) { - const { userId, isAdmin, prisma } = req; + const { userId, isAdmin } = req; const args: Prisma.EventTypeCustomInputFindManyArgs = isAdmin ? {} : { where: { eventType: { userId } } }; const data = await prisma.eventTypeCustomInput.findMany(args); return { event_type_custom_inputs: data.map((v) => schemaEventTypeCustomInputPublic.parse(v)) }; diff --git a/apps/api/pages/api/custom-inputs/_post.ts b/apps/api/pages/api/custom-inputs/_post.ts index 331fdd732f..cd6e04a698 100644 --- a/apps/api/pages/api/custom-inputs/_post.ts +++ b/apps/api/pages/api/custom-inputs/_post.ts @@ -2,6 +2,7 @@ import type { NextApiRequest } from "next"; import { HttpError } from "@calcom/lib/http-error"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { schemaEventTypeCustomInputBodyParams, @@ -79,7 +80,7 @@ import { * description: Authorization information is missing or invalid. */ async function postHandler(req: NextApiRequest) { - const { userId, isAdmin, prisma } = req; + const { userId, isAdmin } = req; const { eventTypeId, ...body } = schemaEventTypeCustomInputBodyParams.parse(req.body); if (!isAdmin) { diff --git a/apps/api/pages/api/destination-calendars/[id]/_auth-middleware.ts b/apps/api/pages/api/destination-calendars/[id]/_auth-middleware.ts index 03ab72c797..276cf44f44 100644 --- a/apps/api/pages/api/destination-calendars/[id]/_auth-middleware.ts +++ b/apps/api/pages/api/destination-calendars/[id]/_auth-middleware.ts @@ -1,11 +1,12 @@ import type { NextApiRequest } from "next"; import { HttpError } from "@calcom/lib/http-error"; +import prisma from "@calcom/prisma"; import { schemaQueryIdParseInt } from "~/lib/validations/shared/queryIdTransformParseInt"; async function authMiddleware(req: NextApiRequest) { - const { userId, isAdmin, prisma } = req; + const { userId, isAdmin } = req; const { id } = schemaQueryIdParseInt.parse(req.query); if (isAdmin) return; const userEventTypes = await prisma.eventType.findMany({ diff --git a/apps/api/pages/api/destination-calendars/[id]/_delete.ts b/apps/api/pages/api/destination-calendars/[id]/_delete.ts index 05ba70551a..a356e2656b 100644 --- a/apps/api/pages/api/destination-calendars/[id]/_delete.ts +++ b/apps/api/pages/api/destination-calendars/[id]/_delete.ts @@ -1,6 +1,7 @@ import type { NextApiRequest } from "next"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { schemaQueryIdParseInt } from "~/lib/validations/shared/queryIdTransformParseInt"; @@ -33,7 +34,7 @@ import { schemaQueryIdParseInt } from "~/lib/validations/shared/queryIdTransform * description: Destination calendar not found */ export async function deleteHandler(req: NextApiRequest) { - const { prisma, query } = req; + const { query } = req; const { id } = schemaQueryIdParseInt.parse(query); await prisma.destinationCalendar.delete({ where: { id } }); return { message: `OK, Destination Calendar removed successfully` }; diff --git a/apps/api/pages/api/destination-calendars/[id]/_get.ts b/apps/api/pages/api/destination-calendars/[id]/_get.ts index febb3fc59f..6531539814 100644 --- a/apps/api/pages/api/destination-calendars/[id]/_get.ts +++ b/apps/api/pages/api/destination-calendars/[id]/_get.ts @@ -1,6 +1,7 @@ import type { NextApiRequest } from "next"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { schemaDestinationCalendarReadPublic } from "~/lib/validations/destination-calendar"; import { schemaQueryIdParseInt } from "~/lib/validations/shared/queryIdTransformParseInt"; @@ -34,7 +35,7 @@ import { schemaQueryIdParseInt } from "~/lib/validations/shared/queryIdTransform * description: Destination calendar not found */ export async function getHandler(req: NextApiRequest) { - const { prisma, query } = req; + const { query } = req; const { id } = schemaQueryIdParseInt.parse(query); const destinationCalendar = await prisma.destinationCalendar.findUnique({ diff --git a/apps/api/pages/api/destination-calendars/[id]/_patch.ts b/apps/api/pages/api/destination-calendars/[id]/_patch.ts index 0ea5b23598..75221c5192 100644 --- a/apps/api/pages/api/destination-calendars/[id]/_patch.ts +++ b/apps/api/pages/api/destination-calendars/[id]/_patch.ts @@ -5,6 +5,7 @@ import type { z } from "zod"; import { getCalendarCredentials, getConnectedCalendars } from "@calcom/core/CalendarManager"; import { HttpError } from "@calcom/lib/http-error"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import type { PrismaClient } from "@calcom/prisma"; import { credentialForCalendarServiceSelect } from "@calcom/prisma/selects/credential"; @@ -82,7 +83,7 @@ type UserCredentialType = { }; export async function patchHandler(req: NextApiRequest) { - const { userId, isAdmin, prisma, query, body } = req; + const { userId, isAdmin, query, body } = req; const { id } = schemaQueryIdParseInt.parse(query); const parsedBody = schemaDestinationCalendarEditBodyParams.parse(body); const assignedUserId = isAdmin ? parsedBody.userId || userId : userId; diff --git a/apps/api/pages/api/destination-calendars/_get.ts b/apps/api/pages/api/destination-calendars/_get.ts index f78a8cd8ab..a65bf90987 100644 --- a/apps/api/pages/api/destination-calendars/_get.ts +++ b/apps/api/pages/api/destination-calendars/_get.ts @@ -2,6 +2,7 @@ import type { NextApiRequest } from "next"; import { HttpError } from "@calcom/lib/http-error"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { extractUserIdsFromQuery } from "~/lib/utils/extractUserIdsFromQuery"; import { schemaDestinationCalendarReadPublic } from "~/lib/validations/destination-calendar"; @@ -29,7 +30,7 @@ import { schemaDestinationCalendarReadPublic } from "~/lib/validations/destinati * description: No destination calendars were found */ async function getHandler(req: NextApiRequest) { - const { userId, prisma } = req; + const { userId } = req; const userIds = req.query.userId ? extractUserIdsFromQuery(req) : [userId]; const userEventTypes = await prisma.eventType.findMany({ diff --git a/apps/api/pages/api/destination-calendars/_post.ts b/apps/api/pages/api/destination-calendars/_post.ts index 40d3cf5e95..e8fdf266b2 100644 --- a/apps/api/pages/api/destination-calendars/_post.ts +++ b/apps/api/pages/api/destination-calendars/_post.ts @@ -3,6 +3,7 @@ import type { NextApiRequest } from "next"; import { getCalendarCredentials, getConnectedCalendars } from "@calcom/core/CalendarManager"; import { HttpError } from "@calcom/lib/http-error"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { credentialForCalendarServiceSelect } from "@calcom/prisma/selects/credential"; import { @@ -60,7 +61,7 @@ import { * description: Authorization information is missing or invalid. */ async function postHandler(req: NextApiRequest) { - const { userId, isAdmin, prisma, body } = req; + const { userId, isAdmin, body } = req; const parsedBody = schemaDestinationCalendarCreateBodyParams.parse(body); await checkPermissions(req, userId); @@ -132,7 +133,7 @@ async function checkPermissions(req: NextApiRequest, userId: number) { if (isAdmin && !body.userId) throw new HttpError({ statusCode: 400, message: "`userId` required" }); /* User should only be able to create for their own destination calendars*/ if (!isAdmin && body.eventTypeId) { - const ownsEventType = await req.prisma.eventType.findFirst({ where: { id: body.eventTypeId, userId } }); + const ownsEventType = await prisma.eventType.findFirst({ where: { id: body.eventTypeId, userId } }); if (!ownsEventType) throw new HttpError({ statusCode: 401, message: "Unauthorized" }); } // TODO:: Add support for team event types with validation diff --git a/apps/api/pages/api/event-types/[id]/_auth-middleware.ts b/apps/api/pages/api/event-types/[id]/_auth-middleware.ts index 8907d7cd3b..0aea723640 100644 --- a/apps/api/pages/api/event-types/[id]/_auth-middleware.ts +++ b/apps/api/pages/api/event-types/[id]/_auth-middleware.ts @@ -1,11 +1,12 @@ import type { NextApiRequest } from "next"; import { HttpError } from "@calcom/lib/http-error"; +import prisma from "@calcom/prisma"; import { schemaQueryIdParseInt } from "~/lib/validations/shared/queryIdTransformParseInt"; async function authMiddleware(req: NextApiRequest) { - const { userId, isAdmin, prisma } = req; + const { userId, isAdmin } = req; const { id } = schemaQueryIdParseInt.parse(req.query); if (isAdmin) return; const eventType = await prisma.eventType.findFirst({ diff --git a/apps/api/pages/api/event-types/[id]/_delete.ts b/apps/api/pages/api/event-types/[id]/_delete.ts index 2e598afc54..519047a127 100644 --- a/apps/api/pages/api/event-types/[id]/_delete.ts +++ b/apps/api/pages/api/event-types/[id]/_delete.ts @@ -2,6 +2,7 @@ import type { NextApiRequest } from "next"; import { HttpError } from "@calcom/lib/http-error"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { schemaQueryIdParseInt } from "~/lib/validations/shared/queryIdTransformParseInt"; @@ -37,7 +38,7 @@ import { schemaQueryIdParseInt } from "~/lib/validations/shared/queryIdTransform * description: Authorization information is missing or invalid. */ export async function deleteHandler(req: NextApiRequest) { - const { prisma, query } = req; + const { query } = req; const { id } = schemaQueryIdParseInt.parse(query); await checkPermissions(req); await prisma.eventType.delete({ where: { id } }); @@ -45,7 +46,7 @@ export async function deleteHandler(req: NextApiRequest) { } async function checkPermissions(req: NextApiRequest) { - const { userId, prisma, isAdmin } = req; + const { userId, isAdmin } = req; const { id } = schemaQueryIdParseInt.parse(req.query); if (isAdmin) return; /** Only event type owners can delete it */ diff --git a/apps/api/pages/api/event-types/[id]/_get.ts b/apps/api/pages/api/event-types/[id]/_get.ts index 539a894775..57c2ac5555 100644 --- a/apps/api/pages/api/event-types/[id]/_get.ts +++ b/apps/api/pages/api/event-types/[id]/_get.ts @@ -2,6 +2,7 @@ import type { NextApiRequest } from "next"; import { HttpError } from "@calcom/lib/http-error"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { MembershipRole } from "@calcom/prisma/enums"; import { schemaEventTypeReadPublic } from "~/lib/validations/event-type"; @@ -43,7 +44,7 @@ import getCalLink from "../_utils/getCalLink"; * description: EventType was not found */ export async function getHandler(req: NextApiRequest) { - const { prisma, query } = req; + const { query } = req; const { id } = schemaQueryIdParseInt.parse(query); const eventType = await prisma.eventType.findUnique({ diff --git a/apps/api/pages/api/event-types/[id]/_patch.ts b/apps/api/pages/api/event-types/[id]/_patch.ts index 7c8fcd480a..68b270324b 100644 --- a/apps/api/pages/api/event-types/[id]/_patch.ts +++ b/apps/api/pages/api/event-types/[id]/_patch.ts @@ -4,6 +4,7 @@ import type { z } from "zod"; import { HttpError } from "@calcom/lib/http-error"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { SchedulingType } from "@calcom/prisma/enums"; import type { schemaEventTypeBaseBodyParams } from "~/lib/validations/event-type"; @@ -203,7 +204,7 @@ import checkTeamEventEditPermission from "../_utils/checkTeamEventEditPermission * description: Authorization information is missing or invalid. */ export async function patchHandler(req: NextApiRequest) { - const { prisma, query, body } = req; + const { query, body } = req; const { id } = schemaQueryIdParseInt.parse(query); const { hosts = [], @@ -236,7 +237,7 @@ export async function patchHandler(req: NextApiRequest) { } async function checkPermissions(req: NextApiRequest, body: z.infer) { - const { userId, prisma, isAdmin } = req; + const { userId, isAdmin } = req; const { id } = schemaQueryIdParseInt.parse(req.query); if (isAdmin) return; /** Only event type owners can modify it */ diff --git a/apps/api/pages/api/event-types/_get.ts b/apps/api/pages/api/event-types/_get.ts index c36aea118b..e57926d66e 100644 --- a/apps/api/pages/api/event-types/_get.ts +++ b/apps/api/pages/api/event-types/_get.ts @@ -2,6 +2,7 @@ import type { NextApiRequest } from "next"; import { HttpError } from "@calcom/lib/http-error"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import type { PrismaClient } from "@calcom/prisma"; import { schemaEventTypeReadPublic } from "~/lib/validations/event-type"; @@ -42,7 +43,7 @@ import getCalLink from "./_utils/getCalLink"; * description: No event types were found */ async function getHandler(req: NextApiRequest) { - const { userId, prisma, isAdmin } = req; + const { userId, isAdmin } = req; const userIds = req.query.userId ? extractUserIdsFromQuery(req) : [userId]; const { slug } = schemaQuerySlug.parse(req.query); const shouldUseUserId = !isAdmin || !slug || !!req.query.userId; diff --git a/apps/api/pages/api/event-types/_post.ts b/apps/api/pages/api/event-types/_post.ts index 6e748a1bc2..19aec7ca33 100644 --- a/apps/api/pages/api/event-types/_post.ts +++ b/apps/api/pages/api/event-types/_post.ts @@ -3,6 +3,7 @@ import type { NextApiRequest } from "next"; import { HttpError } from "@calcom/lib/http-error"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { MembershipRole } from "@calcom/prisma/client"; import { schemaEventTypeCreateBodyParams, schemaEventTypeReadPublic } from "~/lib/validations/event-type"; @@ -264,7 +265,7 @@ import ensureOnlyMembersAsHosts from "./_utils/ensureOnlyMembersAsHosts"; * description: Authorization information is missing or invalid. */ async function postHandler(req: NextApiRequest) { - const { userId, isAdmin, prisma, body } = req; + const { userId, isAdmin, body } = req; const { hosts = [], @@ -321,7 +322,7 @@ async function checkPermissions(req: NextApiRequest) { if ( body.teamId && !isAdmin && - !(await canUserAccessTeamWithRole(req.prisma, req.userId, isAdmin, body.teamId, { + !(await canUserAccessTeamWithRole(req.userId, isAdmin, body.teamId, { in: [MembershipRole.OWNER, MembershipRole.ADMIN], })) ) diff --git a/apps/api/pages/api/event-types/_utils/checkParentEventOwnership.ts b/apps/api/pages/api/event-types/_utils/checkParentEventOwnership.ts index 2e91d789b7..7a7025296f 100644 --- a/apps/api/pages/api/event-types/_utils/checkParentEventOwnership.ts +++ b/apps/api/pages/api/event-types/_utils/checkParentEventOwnership.ts @@ -1,6 +1,7 @@ import type { NextApiRequest } from "next"; import { HttpError } from "@calcom/lib/http-error"; +import prisma from "@calcom/prisma"; /** * Checks if a user, identified by the provided userId, has ownership (or admin rights) over @@ -13,7 +14,7 @@ import { HttpError } from "@calcom/lib/http-error"; * or if the user doesn't have ownership or admin rights to the associated team. */ export default async function checkParentEventOwnership(req: NextApiRequest) { - const { userId, prisma, body } = req; + const { userId, body } = req; /** These are already parsed upstream, we can assume they're good here. */ const parentId = Number(body.parentId); const parentEventType = await prisma.eventType.findUnique({ diff --git a/apps/api/pages/api/event-types/_utils/checkTeamEventEditPermission.ts b/apps/api/pages/api/event-types/_utils/checkTeamEventEditPermission.ts index bc83c038b3..71094ba253 100644 --- a/apps/api/pages/api/event-types/_utils/checkTeamEventEditPermission.ts +++ b/apps/api/pages/api/event-types/_utils/checkTeamEventEditPermission.ts @@ -2,6 +2,7 @@ import type { NextApiRequest } from "next"; import type { z } from "zod"; import { HttpError } from "@calcom/lib/http-error"; +import prisma from "@calcom/prisma"; import type { schemaEventTypeCreateBodyParams } from "~/lib/validations/event-type"; @@ -9,7 +10,7 @@ export default async function checkTeamEventEditPermission( req: NextApiRequest, body: Pick, "teamId" | "userId"> ) { - const { prisma, isAdmin } = req; + const { isAdmin } = req; let userId = req.userId; if (isAdmin && body.userId) { userId = body.userId; diff --git a/apps/api/pages/api/event-types/_utils/checkUserMembership.ts b/apps/api/pages/api/event-types/_utils/checkUserMembership.ts index d76fcb89ad..176d5a93f7 100644 --- a/apps/api/pages/api/event-types/_utils/checkUserMembership.ts +++ b/apps/api/pages/api/event-types/_utils/checkUserMembership.ts @@ -1,6 +1,7 @@ import type { NextApiRequest } from "next"; import { HttpError } from "@calcom/lib/http-error"; +import prisma from "@calcom/prisma"; /** * Checks if a user, identified by the provided userId, is a member of the team associated @@ -13,7 +14,7 @@ import { HttpError } from "@calcom/lib/http-error"; * or if the user isn't a member of the associated team. */ export default async function checkUserMembership(req: NextApiRequest) { - const { prisma, body } = req; + const { body } = req; /** These are already parsed upstream, we can assume they're good here. */ const parentId = Number(body.parentId); const userId = Number(body.userId); diff --git a/apps/api/pages/api/event-types/_utils/ensureOnlyMembersAsHosts.ts b/apps/api/pages/api/event-types/_utils/ensureOnlyMembersAsHosts.ts index 301c5307a1..f3b29a934e 100644 --- a/apps/api/pages/api/event-types/_utils/ensureOnlyMembersAsHosts.ts +++ b/apps/api/pages/api/event-types/_utils/ensureOnlyMembersAsHosts.ts @@ -1,6 +1,8 @@ import type { NextApiRequest } from "next"; import type { z } from "zod"; +import prisma from "@calcom/prisma"; + import type { schemaEventTypeCreateBodyParams } from "~/lib/validations/event-type"; export default async function ensureOnlyMembersAsHosts( @@ -8,7 +10,7 @@ export default async function ensureOnlyMembersAsHosts( body: Pick, "hosts" | "teamId"> ) { if (body.teamId && body.hosts && body.hosts.length > 0) { - const teamMemberCount = await req.prisma.membership.count({ + const teamMemberCount = await prisma.membership.count({ where: { teamId: body.teamId, userId: { in: body.hosts.map((host) => host.userId) }, diff --git a/apps/api/pages/api/invites/_post.ts b/apps/api/pages/api/invites/_post.ts index 65390129a5..94703111a3 100644 --- a/apps/api/pages/api/invites/_post.ts +++ b/apps/api/pages/api/invites/_post.ts @@ -2,6 +2,7 @@ import type { NextApiRequest, NextApiResponse } from "next"; import { HttpError } from "@calcom/lib/http-error"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { createContext } from "@calcom/trpc/server/createContext"; import { viewerTeamsRouter } from "@calcom/trpc/server/routers/viewer/teams/_router"; import type { TInviteMemberInputSchema } from "@calcom/trpc/server/routers/viewer/teams/inviteMember/inviteMember.schema"; @@ -57,7 +58,7 @@ async function postHandler(req: NextApiRequest, res: NextApiResponse) { } async function checkPermissions(req: NextApiRequest, body: TInviteMemberInputSchema) { - const { userId, isAdmin, prisma } = req; + const { userId, isAdmin } = req; if (isAdmin) return; // To prevent auto-accepted invites, limit it to ADMIN users if (!isAdmin && "accepted" in body) diff --git a/apps/api/pages/api/me/_get.ts b/apps/api/pages/api/me/_get.ts index d0a3759730..637ebc1bb7 100644 --- a/apps/api/pages/api/me/_get.ts +++ b/apps/api/pages/api/me/_get.ts @@ -1,10 +1,11 @@ import type { NextApiRequest } from "next"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { schemaUserReadPublic } from "~/lib/validations/user"; -async function handler({ userId, prisma }: NextApiRequest) { +async function handler({ userId }: NextApiRequest) { const data = await prisma.user.findUniqueOrThrow({ where: { id: userId } }); return { user: schemaUserReadPublic.parse(data) }; } diff --git a/apps/api/pages/api/memberships/[id]/_auth-middleware.ts b/apps/api/pages/api/memberships/[id]/_auth-middleware.ts index 97ac4ff16d..e5bb676583 100644 --- a/apps/api/pages/api/memberships/[id]/_auth-middleware.ts +++ b/apps/api/pages/api/memberships/[id]/_auth-middleware.ts @@ -1,11 +1,12 @@ import type { NextApiRequest } from "next"; import { HttpError } from "@calcom/lib/http-error"; +import prisma from "@calcom/prisma"; import { membershipIdSchema } from "~/lib/validations/membership"; async function authMiddleware(req: NextApiRequest) { - const { userId, isAdmin, prisma } = req; + const { userId, isAdmin } = req; const { teamId } = membershipIdSchema.parse(req.query); // Admins can just skip this check if (isAdmin) return; diff --git a/apps/api/pages/api/memberships/[id]/_delete.ts b/apps/api/pages/api/memberships/[id]/_delete.ts index 06acefb3bb..1e624f3adc 100644 --- a/apps/api/pages/api/memberships/[id]/_delete.ts +++ b/apps/api/pages/api/memberships/[id]/_delete.ts @@ -2,6 +2,7 @@ import type { NextApiRequest } from "next"; import { HttpError } from "@calcom/lib/http-error"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { membershipIdSchema } from "~/lib/validations/membership"; @@ -34,7 +35,7 @@ import { membershipIdSchema } from "~/lib/validations/membership"; * description: Authorization information is missing or invalid. */ export async function deleteHandler(req: NextApiRequest) { - const { prisma, query } = req; + const { query } = req; const userId_teamId = membershipIdSchema.parse(query); await checkPermissions(req); await prisma.membership.delete({ where: { userId_teamId } }); @@ -42,7 +43,7 @@ export async function deleteHandler(req: NextApiRequest) { } async function checkPermissions(req: NextApiRequest) { - const { prisma, isAdmin, userId, query } = req; + const { isAdmin, userId, query } = req; const userId_teamId = membershipIdSchema.parse(query); // Admin User can do anything including deletion of Admin Team Member in any team if (isAdmin) { diff --git a/apps/api/pages/api/memberships/[id]/_get.ts b/apps/api/pages/api/memberships/[id]/_get.ts index cf44094bfa..c66a09cf13 100644 --- a/apps/api/pages/api/memberships/[id]/_get.ts +++ b/apps/api/pages/api/memberships/[id]/_get.ts @@ -2,6 +2,7 @@ import type { Prisma } from "@prisma/client"; import type { NextApiRequest } from "next"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { membershipIdSchema, schemaMembershipPublic } from "~/lib/validations/membership"; @@ -34,7 +35,7 @@ import { membershipIdSchema, schemaMembershipPublic } from "~/lib/validations/me * description: Membership was not found */ export async function getHandler(req: NextApiRequest) { - const { prisma, query } = req; + const { query } = req; const userId_teamId = membershipIdSchema.parse(query); const args: Prisma.MembershipFindUniqueOrThrowArgs = { where: { userId_teamId } }; // Just in case the user want to get more info about the team itself diff --git a/apps/api/pages/api/memberships/[id]/_patch.ts b/apps/api/pages/api/memberships/[id]/_patch.ts index 98115eff39..3e7dcaffb9 100644 --- a/apps/api/pages/api/memberships/[id]/_patch.ts +++ b/apps/api/pages/api/memberships/[id]/_patch.ts @@ -3,6 +3,7 @@ import type { NextApiRequest } from "next"; import { HttpError } from "@calcom/lib/http-error"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { membershipEditBodySchema, @@ -39,7 +40,7 @@ import { * description: Authorization information is missing or invalid. */ export async function patchHandler(req: NextApiRequest) { - const { prisma, query } = req; + const { query } = req; const userId_teamId = membershipIdSchema.parse(query); const data = membershipEditBodySchema.parse(req.body); const args: Prisma.MembershipUpdateArgs = { where: { userId_teamId }, data }; @@ -51,7 +52,7 @@ export async function patchHandler(req: NextApiRequest) { } async function checkPermissions(req: NextApiRequest) { - const { userId, isAdmin, prisma } = req; + const { userId, isAdmin } = req; const { userId: queryUserId, teamId } = membershipIdSchema.parse(req.query); const data = membershipEditBodySchema.parse(req.body); // Admins can just skip this check diff --git a/apps/api/pages/api/memberships/_get.ts b/apps/api/pages/api/memberships/_get.ts index da6e936df3..8a42a5dd3a 100644 --- a/apps/api/pages/api/memberships/_get.ts +++ b/apps/api/pages/api/memberships/_get.ts @@ -3,6 +3,7 @@ import type { NextApiRequest } from "next"; import { HttpError } from "@calcom/lib/http-error"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { schemaMembershipPublic } from "~/lib/validations/membership"; import { @@ -26,7 +27,6 @@ import { * description: No memberships were found */ async function getHandler(req: NextApiRequest) { - const { prisma } = req; const args: Prisma.MembershipFindManyArgs = { where: { /** Admins can query multiple users */ diff --git a/apps/api/pages/api/memberships/_post.ts b/apps/api/pages/api/memberships/_post.ts index 11cba74938..e1ee1a622c 100644 --- a/apps/api/pages/api/memberships/_post.ts +++ b/apps/api/pages/api/memberships/_post.ts @@ -3,6 +3,7 @@ import type { NextApiRequest } from "next"; import { HttpError } from "@calcom/lib/http-error"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { membershipCreateBodySchema, schemaMembershipPublic } from "~/lib/validations/membership"; @@ -22,7 +23,6 @@ import { membershipCreateBodySchema, schemaMembershipPublic } from "~/lib/valida * description: Authorization information is missing or invalid. */ async function postHandler(req: NextApiRequest) { - const { prisma } = req; const data = membershipCreateBodySchema.parse(req.body); const args: Prisma.MembershipCreateArgs = { data }; @@ -37,7 +37,7 @@ async function postHandler(req: NextApiRequest) { } async function checkPermissions(req: NextApiRequest) { - const { userId, isAdmin, prisma } = req; + const { userId, isAdmin } = req; if (isAdmin) return; const body = membershipCreateBodySchema.parse(req.body); // To prevent auto-accepted invites, limit it to ADMIN users diff --git a/apps/api/pages/api/payments/[id].ts b/apps/api/pages/api/payments/[id].ts index f8a54ff7f4..0b621cb86d 100644 --- a/apps/api/pages/api/payments/[id].ts +++ b/apps/api/pages/api/payments/[id].ts @@ -1,5 +1,7 @@ import type { NextApiRequest, NextApiResponse } from "next"; +import prisma from "@calcom/prisma"; + import { withMiddleware } from "~/lib/helpers/withMiddleware"; import type { PaymentResponse } from "~/lib/types"; import { schemaPaymentPublic } from "~/lib/validations/payment"; @@ -37,7 +39,7 @@ import { * description: Payment was not found */ export async function paymentById( - { method, query, userId, prisma }: NextApiRequest, + { method, query, userId }: NextApiRequest, res: NextApiResponse ) { const safeQuery = schemaQueryIdParseInt.safeParse(query); diff --git a/apps/api/pages/api/payments/index.ts b/apps/api/pages/api/payments/index.ts index c6f8c79fec..d556245753 100644 --- a/apps/api/pages/api/payments/index.ts +++ b/apps/api/pages/api/payments/index.ts @@ -1,5 +1,7 @@ import type { NextApiRequest, NextApiResponse } from "next"; +import prisma from "@calcom/prisma"; + import { withMiddleware } from "~/lib/helpers/withMiddleware"; import type { PaymentsResponse } from "~/lib/types"; import { schemaPaymentPublic } from "~/lib/validations/payment"; @@ -19,7 +21,7 @@ import { schemaPaymentPublic } from "~/lib/validations/payment"; * 404: * description: No payments were found */ -async function allPayments({ userId, prisma }: NextApiRequest, res: NextApiResponse) { +async function allPayments({ userId }: NextApiRequest, res: NextApiResponse) { const userWithBookings = await prisma.user.findUnique({ where: { id: userId }, include: { bookings: true }, diff --git a/apps/api/pages/api/schedules/[id]/_auth-middleware.ts b/apps/api/pages/api/schedules/[id]/_auth-middleware.ts index 42184440d3..d622dfcbf6 100644 --- a/apps/api/pages/api/schedules/[id]/_auth-middleware.ts +++ b/apps/api/pages/api/schedules/[id]/_auth-middleware.ts @@ -1,11 +1,12 @@ import type { NextApiRequest } from "next"; import { HttpError } from "@calcom/lib/http-error"; +import prisma from "@calcom/prisma"; import { schemaQueryIdParseInt } from "~/lib/validations/shared/queryIdTransformParseInt"; async function authMiddleware(req: NextApiRequest) { - const { userId, isAdmin, prisma } = req; + const { userId, isAdmin } = req; const { id } = schemaQueryIdParseInt.parse(req.query); // Admins can just skip this check if (isAdmin) return; diff --git a/apps/api/pages/api/schedules/[id]/_delete.ts b/apps/api/pages/api/schedules/[id]/_delete.ts index e48c76c469..0b2d0198ba 100644 --- a/apps/api/pages/api/schedules/[id]/_delete.ts +++ b/apps/api/pages/api/schedules/[id]/_delete.ts @@ -1,6 +1,7 @@ import type { NextApiRequest } from "next"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { schemaQueryIdParseInt } from "~/lib/validations/shared/queryIdTransformParseInt"; @@ -34,7 +35,7 @@ import { schemaQueryIdParseInt } from "~/lib/validations/shared/queryIdTransform * description: Authorization information is missing or invalid. */ export async function deleteHandler(req: NextApiRequest) { - const { prisma, query } = req; + const { query } = req; const { id } = schemaQueryIdParseInt.parse(query); /* If we're deleting any default user schedule, we unset it */ diff --git a/apps/api/pages/api/schedules/[id]/_get.ts b/apps/api/pages/api/schedules/[id]/_get.ts index fdadce2cba..8e1a2df5af 100644 --- a/apps/api/pages/api/schedules/[id]/_get.ts +++ b/apps/api/pages/api/schedules/[id]/_get.ts @@ -1,6 +1,7 @@ import type { NextApiRequest } from "next"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { schemaSchedulePublic } from "~/lib/validations/schedule"; import { schemaQueryIdParseInt } from "~/lib/validations/shared/queryIdTransformParseInt"; @@ -72,7 +73,7 @@ import { schemaQueryIdParseInt } from "~/lib/validations/shared/queryIdTransform */ export async function getHandler(req: NextApiRequest) { - const { prisma, query } = req; + const { query } = req; const { id } = schemaQueryIdParseInt.parse(query); const data = await prisma.schedule.findUniqueOrThrow({ where: { id }, include: { availability: true } }); return { schedule: schemaSchedulePublic.parse(data) }; diff --git a/apps/api/pages/api/schedules/[id]/_patch.ts b/apps/api/pages/api/schedules/[id]/_patch.ts index 1c8f52d688..f9009e30bf 100644 --- a/apps/api/pages/api/schedules/[id]/_patch.ts +++ b/apps/api/pages/api/schedules/[id]/_patch.ts @@ -3,6 +3,7 @@ import type { z } from "zod"; import { HttpError } from "@calcom/lib/http-error"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { schemaSchedulePublic, schemaSingleScheduleBodyParams } from "~/lib/validations/schedule"; import { schemaQueryIdParseInt } from "~/lib/validations/shared/queryIdTransformParseInt"; @@ -81,7 +82,7 @@ import { schemaQueryIdParseInt } from "~/lib/validations/shared/queryIdTransform */ export async function patchHandler(req: NextApiRequest) { - const { prisma, query } = req; + const { query } = req; const { id } = schemaQueryIdParseInt.parse(query); const data = schemaSingleScheduleBodyParams.parse(req.body); await checkPermissions(req, data); diff --git a/apps/api/pages/api/schedules/_get.ts b/apps/api/pages/api/schedules/_get.ts index 1b06a116e9..bbe893516e 100644 --- a/apps/api/pages/api/schedules/_get.ts +++ b/apps/api/pages/api/schedules/_get.ts @@ -4,6 +4,7 @@ import { z } from "zod"; import { HttpError } from "@calcom/lib/http-error"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { schemaSchedulePublic } from "~/lib/validations/schedule"; import { schemaQuerySingleOrMultipleUserIds } from "~/lib/validations/shared/queryUserId"; @@ -76,7 +77,7 @@ export const schemaUserIds = z */ async function handler(req: NextApiRequest) { - const { prisma, userId, isAdmin } = req; + const { userId, isAdmin } = req; const args: Prisma.ScheduleFindManyArgs = isAdmin ? {} : { where: { userId } }; args.include = { availability: true }; diff --git a/apps/api/pages/api/schedules/_post.ts b/apps/api/pages/api/schedules/_post.ts index a50f2cd5b6..05215e3d47 100644 --- a/apps/api/pages/api/schedules/_post.ts +++ b/apps/api/pages/api/schedules/_post.ts @@ -4,6 +4,7 @@ import type { NextApiRequest } from "next"; import { DEFAULT_SCHEDULE, getAvailabilityFromSchedule } from "@calcom/lib/availability"; import { HttpError } from "@calcom/lib/http-error"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { schemaCreateScheduleBodyParams, schemaSchedulePublic } from "~/lib/validations/schedule"; @@ -79,7 +80,7 @@ import { schemaCreateScheduleBodyParams, schemaSchedulePublic } from "~/lib/vali */ async function postHandler(req: NextApiRequest) { - const { userId, isAdmin, prisma } = req; + const { userId, isAdmin } = req; const body = schemaCreateScheduleBodyParams.parse(req.body); let args: Prisma.ScheduleCreateArgs = { data: { ...body, userId } }; diff --git a/apps/api/pages/api/selected-calendars/[id]/_delete.ts b/apps/api/pages/api/selected-calendars/[id]/_delete.ts index e04b67f711..899e7a0808 100644 --- a/apps/api/pages/api/selected-calendars/[id]/_delete.ts +++ b/apps/api/pages/api/selected-calendars/[id]/_delete.ts @@ -1,6 +1,7 @@ import type { NextApiRequest } from "next"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { selectedCalendarIdSchema } from "~/lib/validations/selected-calendar"; @@ -46,7 +47,7 @@ import { selectedCalendarIdSchema } from "~/lib/validations/selected-calendar"; * description: Authorization information is missing or invalid. */ export async function deleteHandler(req: NextApiRequest) { - const { prisma, query } = req; + const { query } = req; const userId_integration_externalId = selectedCalendarIdSchema.parse(query); await prisma.selectedCalendar.delete({ where: { userId_integration_externalId } }); return { message: `Selected Calendar with id: ${query.id} deleted successfully` }; diff --git a/apps/api/pages/api/selected-calendars/[id]/_get.ts b/apps/api/pages/api/selected-calendars/[id]/_get.ts index a5549f1a21..9bc044b4bf 100644 --- a/apps/api/pages/api/selected-calendars/[id]/_get.ts +++ b/apps/api/pages/api/selected-calendars/[id]/_get.ts @@ -1,6 +1,7 @@ import type { NextApiRequest } from "next"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { schemaSelectedCalendarPublic, selectedCalendarIdSchema } from "~/lib/validations/selected-calendar"; @@ -46,7 +47,7 @@ import { schemaSelectedCalendarPublic, selectedCalendarIdSchema } from "~/lib/va * description: SelectedCalendar was not found */ export async function getHandler(req: NextApiRequest) { - const { prisma, query } = req; + const { query } = req; const userId_integration_externalId = selectedCalendarIdSchema.parse(query); const data = await prisma.selectedCalendar.findUniqueOrThrow({ where: { userId_integration_externalId }, diff --git a/apps/api/pages/api/selected-calendars/[id]/_patch.ts b/apps/api/pages/api/selected-calendars/[id]/_patch.ts index c2b526303d..84b60d1210 100644 --- a/apps/api/pages/api/selected-calendars/[id]/_patch.ts +++ b/apps/api/pages/api/selected-calendars/[id]/_patch.ts @@ -3,6 +3,7 @@ import type { NextApiRequest } from "next"; import { HttpError } from "@calcom/lib/http-error"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { schemaSelectedCalendarPublic, @@ -52,7 +53,7 @@ import { * description: Authorization information is missing or invalid. */ export async function patchHandler(req: NextApiRequest) { - const { prisma, query, isAdmin } = req; + const { query, isAdmin } = req; const userId_integration_externalId = selectedCalendarIdSchema.parse(query); const { userId: bodyUserId, ...data } = schemaSelectedCalendarUpdateBodyParams.parse(req.body); const args: Prisma.SelectedCalendarUpdateArgs = { where: { userId_integration_externalId }, data }; diff --git a/apps/api/pages/api/selected-calendars/_get.ts b/apps/api/pages/api/selected-calendars/_get.ts index c5e2182adf..1d4bdf9d6b 100644 --- a/apps/api/pages/api/selected-calendars/_get.ts +++ b/apps/api/pages/api/selected-calendars/_get.ts @@ -3,6 +3,7 @@ import type { NextApiRequest } from "next"; import { HttpError } from "@calcom/lib/http-error"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { schemaSelectedCalendarPublic } from "~/lib/validations/selected-calendar"; import { schemaQuerySingleOrMultipleUserIds } from "~/lib/validations/shared/queryUserId"; @@ -31,7 +32,7 @@ import { schemaQuerySingleOrMultipleUserIds } from "~/lib/validations/shared/que * description: No selected calendars were found */ async function getHandler(req: NextApiRequest) { - const { userId, isAdmin, prisma } = req; + const { userId, isAdmin } = req; /* Admin gets all selected calendar by default, otherwise only the user's ones */ const args: Prisma.SelectedCalendarFindManyArgs = isAdmin ? {} : { where: { userId } }; diff --git a/apps/api/pages/api/selected-calendars/_post.ts b/apps/api/pages/api/selected-calendars/_post.ts index 23b26a76e9..d0509df9c1 100644 --- a/apps/api/pages/api/selected-calendars/_post.ts +++ b/apps/api/pages/api/selected-calendars/_post.ts @@ -3,6 +3,7 @@ import type { NextApiRequest } from "next"; import { HttpError } from "@calcom/lib/http-error"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { schemaSelectedCalendarBodyParams, @@ -49,7 +50,7 @@ import { * description: Authorization information is missing or invalid. */ async function postHandler(req: NextApiRequest) { - const { userId, isAdmin, prisma } = req; + const { userId, isAdmin } = req; const { userId: bodyUserId, ...body } = schemaSelectedCalendarBodyParams.parse(req.body); const args: Prisma.SelectedCalendarCreateArgs = { data: { ...body, userId } }; diff --git a/apps/api/pages/api/teams/[teamId]/_auth-middleware.ts b/apps/api/pages/api/teams/[teamId]/_auth-middleware.ts index ec172679c2..693eb544a5 100644 --- a/apps/api/pages/api/teams/[teamId]/_auth-middleware.ts +++ b/apps/api/pages/api/teams/[teamId]/_auth-middleware.ts @@ -2,12 +2,13 @@ import type { Prisma } from "@prisma/client"; import type { NextApiRequest } from "next"; import { HttpError } from "@calcom/lib/http-error"; +import prisma from "@calcom/prisma"; import { MembershipRole } from "@calcom/prisma/enums"; import { schemaQueryTeamId } from "~/lib/validations/shared/queryTeamId"; async function authMiddleware(req: NextApiRequest) { - const { userId, prisma, isAdmin } = req; + const { userId, isAdmin } = req; const { teamId } = schemaQueryTeamId.parse(req.query); /** Admins can skip the ownership verification */ if (isAdmin) return; @@ -21,17 +22,16 @@ export async function checkPermissions( req: NextApiRequest, role: Prisma.MembershipWhereInput["role"] = MembershipRole.OWNER ) { - const { userId, prisma, isAdmin } = req; + const { userId, isAdmin } = req; const { teamId } = schemaQueryTeamId.parse({ teamId: req.query.teamId, version: req.query.version, apiKey: req.query.apiKey, }); - return canUserAccessTeamWithRole(prisma, userId, isAdmin, teamId, role); + return canUserAccessTeamWithRole(userId, isAdmin, teamId, role); } export async function canUserAccessTeamWithRole( - prisma: NextApiRequest["prisma"], userId: number, isAdmin: boolean, teamId: number, diff --git a/apps/api/pages/api/teams/[teamId]/_delete.ts b/apps/api/pages/api/teams/[teamId]/_delete.ts index 13c5c35370..dfe2ad21ed 100644 --- a/apps/api/pages/api/teams/[teamId]/_delete.ts +++ b/apps/api/pages/api/teams/[teamId]/_delete.ts @@ -1,6 +1,7 @@ import type { NextApiRequest } from "next"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { schemaQueryTeamId } from "~/lib/validations/shared/queryTeamId"; @@ -36,7 +37,7 @@ import { checkPermissions } from "./_auth-middleware"; * description: Authorization information is missing or invalid. */ export async function deleteHandler(req: NextApiRequest) { - const { prisma, query } = req; + const { query } = req; const { teamId } = schemaQueryTeamId.parse(query); await checkPermissions(req); await prisma.team.delete({ where: { id: teamId } }); diff --git a/apps/api/pages/api/teams/[teamId]/_get.ts b/apps/api/pages/api/teams/[teamId]/_get.ts index cff0e987c9..829a4104b6 100644 --- a/apps/api/pages/api/teams/[teamId]/_get.ts +++ b/apps/api/pages/api/teams/[teamId]/_get.ts @@ -2,6 +2,7 @@ import type { Prisma } from "@prisma/client"; import type { NextApiRequest } from "next"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { schemaQueryTeamId } from "~/lib/validations/shared/queryTeamId"; import { schemaTeamReadPublic } from "~/lib/validations/team"; @@ -36,7 +37,7 @@ import { schemaTeamReadPublic } from "~/lib/validations/team"; * description: Team was not found */ export async function getHandler(req: NextApiRequest) { - const { prisma, isAdmin, userId } = req; + const { isAdmin, userId } = req; const { teamId } = schemaQueryTeamId.parse(req.query); const where: Prisma.TeamWhereInput = { id: teamId }; // Non-admins can only query the teams they're part of diff --git a/apps/api/pages/api/teams/[teamId]/_patch.ts b/apps/api/pages/api/teams/[teamId]/_patch.ts index 9bfbea3a50..63687a0e15 100644 --- a/apps/api/pages/api/teams/[teamId]/_patch.ts +++ b/apps/api/pages/api/teams/[teamId]/_patch.ts @@ -5,6 +5,7 @@ import { purchaseTeamSubscription } from "@calcom/features/ee/teams/lib/payments import { IS_TEAM_BILLING_ENABLED } from "@calcom/lib/constants"; import { HttpError } from "@calcom/lib/http-error"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { TRPCError } from "@trpc/server"; @@ -55,7 +56,7 @@ import { schemaTeamReadPublic, schemaTeamUpdateBodyParams } from "~/lib/validati * description: Authorization information is missing or invalid. */ export async function patchHandler(req: NextApiRequest) { - const { prisma, body, userId } = req; + const { body, userId } = req; const data = schemaTeamUpdateBodyParams.parse(body); const { teamId } = schemaQueryTeamId.parse(req.query); diff --git a/apps/api/pages/api/teams/[teamId]/event-types/_get.ts b/apps/api/pages/api/teams/[teamId]/event-types/_get.ts index 977b4c28dd..5ef33379c0 100644 --- a/apps/api/pages/api/teams/[teamId]/event-types/_get.ts +++ b/apps/api/pages/api/teams/[teamId]/event-types/_get.ts @@ -3,6 +3,7 @@ import type { NextApiRequest } from "next"; import { z } from "zod"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { schemaEventTypeReadPublic } from "~/lib/validations/event-type"; @@ -41,7 +42,7 @@ const querySchema = z.object({ * description: No event types were found */ async function getHandler(req: NextApiRequest) { - const { userId, isAdmin, prisma } = req; + const { userId, isAdmin } = req; const { teamId } = querySchema.parse(req.query); diff --git a/apps/api/pages/api/teams/_get.ts b/apps/api/pages/api/teams/_get.ts index 49af07ac8e..c5ebe8cf08 100644 --- a/apps/api/pages/api/teams/_get.ts +++ b/apps/api/pages/api/teams/_get.ts @@ -2,6 +2,7 @@ import type { Prisma } from "@prisma/client"; import type { NextApiRequest } from "next"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { schemaTeamsReadPublic } from "~/lib/validations/team"; @@ -29,7 +30,7 @@ import { schemaTeamsReadPublic } from "~/lib/validations/team"; * description: No teams were found */ async function getHandler(req: NextApiRequest) { - const { userId, prisma, isAdmin } = req; + const { userId, isAdmin } = req; const where: Prisma.TeamWhereInput = {}; // If user is not ADMIN, return only his data. if (!isAdmin) where.members = { some: { userId } }; diff --git a/apps/api/pages/api/teams/_post.ts b/apps/api/pages/api/teams/_post.ts index f6f95cdc79..e2f9a1d43f 100644 --- a/apps/api/pages/api/teams/_post.ts +++ b/apps/api/pages/api/teams/_post.ts @@ -5,6 +5,7 @@ import stripe from "@calcom/app-store/stripepayment/lib/server"; import { IS_TEAM_BILLING_ENABLED, WEBAPP_URL } from "@calcom/lib/constants"; import { HttpError } from "@calcom/lib/http-error"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { MembershipRole } from "@calcom/prisma/enums"; import { schemaMembershipPublic } from "~/lib/validations/membership"; @@ -78,7 +79,7 @@ import { schemaTeamCreateBodyParams, schemaTeamReadPublic } from "~/lib/validati * description: Authorization information is missing or invalid. */ async function postHandler(req: NextApiRequest) { - const { prisma, body, userId, isAdmin } = req; + const { body, userId, isAdmin } = req; const { ownerId, ...data } = schemaTeamCreateBodyParams.parse(body); await checkPermissions(req); diff --git a/apps/api/pages/api/users/[userId]/_delete.ts b/apps/api/pages/api/users/[userId]/_delete.ts index 6b54fd3bee..90d38aad36 100644 --- a/apps/api/pages/api/users/[userId]/_delete.ts +++ b/apps/api/pages/api/users/[userId]/_delete.ts @@ -3,6 +3,7 @@ import type { NextApiRequest } from "next"; import { deleteUser } from "@calcom/features/users/lib/userDeletionService"; import { HttpError } from "@calcom/lib/http-error"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { schemaQueryUserId } from "~/lib/validations/shared/queryUserId"; @@ -37,7 +38,7 @@ import { schemaQueryUserId } from "~/lib/validations/shared/queryUserId"; * description: Authorization information is missing or invalid. */ export async function deleteHandler(req: NextApiRequest) { - const { prisma, isAdmin } = req; + const { isAdmin } = req; const query = schemaQueryUserId.parse(req.query); // Here we only check for ownership of the user if the user is not admin, otherwise we let ADMIN's edit any user if (!isAdmin && query.userId !== req.userId) throw new HttpError({ statusCode: 403, message: "Forbidden" }); diff --git a/apps/api/pages/api/users/[userId]/_get.ts b/apps/api/pages/api/users/[userId]/_get.ts index 5be3926ae0..215cf81735 100644 --- a/apps/api/pages/api/users/[userId]/_get.ts +++ b/apps/api/pages/api/users/[userId]/_get.ts @@ -2,6 +2,7 @@ import type { NextApiRequest } from "next"; import { HttpError } from "@calcom/lib/http-error"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { schemaQueryUserId } from "~/lib/validations/shared/queryUserId"; import { schemaUserReadPublic } from "~/lib/validations/user"; @@ -37,7 +38,7 @@ import { schemaUserReadPublic } from "~/lib/validations/user"; * description: User was not found */ export async function getHandler(req: NextApiRequest) { - const { prisma, isAdmin } = req; + const { isAdmin } = req; const query = schemaQueryUserId.parse(req.query); // Here we only check for ownership of the user if the user is not admin, otherwise we let ADMIN's edit any user diff --git a/apps/api/pages/api/users/[userId]/_patch.ts b/apps/api/pages/api/users/[userId]/_patch.ts index ff917c2048..e622a43114 100644 --- a/apps/api/pages/api/users/[userId]/_patch.ts +++ b/apps/api/pages/api/users/[userId]/_patch.ts @@ -2,6 +2,7 @@ import type { NextApiRequest } from "next"; import { HttpError } from "@calcom/lib/http-error"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { schemaQueryUserId } from "~/lib/validations/shared/queryUserId"; import { schemaUserEditBodyParams, schemaUserReadPublic } from "~/lib/validations/user"; @@ -94,7 +95,7 @@ import { schemaUserEditBodyParams, schemaUserReadPublic } from "~/lib/validation * description: Insufficient permissions to access resource. */ export async function patchHandler(req: NextApiRequest) { - const { prisma, isAdmin } = req; + const { isAdmin } = req; const query = schemaQueryUserId.parse(req.query); // Here we only check for ownership of the user if the user is not admin, otherwise we let ADMIN's edit any user if (!isAdmin && query.userId !== req.userId) throw new HttpError({ statusCode: 403, message: "Forbidden" }); diff --git a/apps/api/pages/api/users/_get.ts b/apps/api/pages/api/users/_get.ts index 3ffa5fce79..dcb26d70b6 100644 --- a/apps/api/pages/api/users/_get.ts +++ b/apps/api/pages/api/users/_get.ts @@ -2,6 +2,7 @@ import type { Prisma } from "@prisma/client"; import type { NextApiRequest } from "next"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { withMiddleware } from "~/lib/helpers/withMiddleware"; import { schemaQuerySingleOrMultipleUserEmails } from "~/lib/validations/shared/queryUserEmail"; @@ -44,7 +45,6 @@ import { schemaUsersReadPublic } from "~/lib/validations/user"; export async function getHandler(req: NextApiRequest) { const { userId, - prisma, isAdmin, pagination: { take, skip }, } = req; diff --git a/apps/api/pages/api/users/_post.ts b/apps/api/pages/api/users/_post.ts index bcc4f24315..9b23ebeca5 100644 --- a/apps/api/pages/api/users/_post.ts +++ b/apps/api/pages/api/users/_post.ts @@ -2,6 +2,7 @@ import type { NextApiRequest } from "next"; import { HttpError } from "@calcom/lib/http-error"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { schemaUserCreateBodyParams } from "~/lib/validations/user"; @@ -87,7 +88,7 @@ import { schemaUserCreateBodyParams } from "~/lib/validations/user"; * description: Authorization information is missing or invalid. */ async function postHandler(req: NextApiRequest) { - const { prisma, isAdmin } = req; + const { isAdmin } = req; // If user is not ADMIN, return unauthorized. if (!isAdmin) throw new HttpError({ statusCode: 401, message: "You are not authorized" }); const data = await schemaUserCreateBodyParams.parseAsync(req.body); diff --git a/apps/api/pages/api/webhooks/[id]/_auth-middleware.ts b/apps/api/pages/api/webhooks/[id]/_auth-middleware.ts index 6f2eb04db5..ce45765eaa 100644 --- a/apps/api/pages/api/webhooks/[id]/_auth-middleware.ts +++ b/apps/api/pages/api/webhooks/[id]/_auth-middleware.ts @@ -1,11 +1,12 @@ import type { NextApiRequest } from "next"; import { HttpError } from "@calcom/lib/http-error"; +import prisma from "@calcom/prisma"; import { schemaQueryIdAsString } from "~/lib/validations/shared/queryIdString"; async function authMiddleware(req: NextApiRequest) { - const { userId, isAdmin, prisma } = req; + const { userId, isAdmin } = req; const { id } = schemaQueryIdAsString.parse(req.query); // Admins can just skip this check if (isAdmin) return; diff --git a/apps/api/pages/api/webhooks/[id]/_delete.ts b/apps/api/pages/api/webhooks/[id]/_delete.ts index 4b1ea3404e..894a1b5e3c 100644 --- a/apps/api/pages/api/webhooks/[id]/_delete.ts +++ b/apps/api/pages/api/webhooks/[id]/_delete.ts @@ -1,6 +1,7 @@ import type { NextApiRequest } from "next"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { schemaQueryIdAsString } from "~/lib/validations/shared/queryIdString"; @@ -36,7 +37,7 @@ import { schemaQueryIdAsString } from "~/lib/validations/shared/queryIdString"; * description: Authorization information is missing or invalid. */ export async function deleteHandler(req: NextApiRequest) { - const { prisma, query } = req; + const { query } = req; const { id } = schemaQueryIdAsString.parse(query); await prisma.webhook.delete({ where: { id } }); return { message: `Webhook with id: ${id} deleted successfully` }; diff --git a/apps/api/pages/api/webhooks/[id]/_get.ts b/apps/api/pages/api/webhooks/[id]/_get.ts index 3bde62987a..7c079c2df0 100644 --- a/apps/api/pages/api/webhooks/[id]/_get.ts +++ b/apps/api/pages/api/webhooks/[id]/_get.ts @@ -1,6 +1,7 @@ import type { NextApiRequest } from "next"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { schemaQueryIdAsString } from "~/lib/validations/shared/queryIdString"; import { schemaWebhookReadPublic } from "~/lib/validations/webhook"; @@ -37,7 +38,7 @@ import { schemaWebhookReadPublic } from "~/lib/validations/webhook"; * description: Webhook was not found */ export async function getHandler(req: NextApiRequest) { - const { prisma, query } = req; + const { query } = req; const { id } = schemaQueryIdAsString.parse(query); const data = await prisma.webhook.findUniqueOrThrow({ where: { id } }); return { webhook: schemaWebhookReadPublic.parse(data) }; diff --git a/apps/api/pages/api/webhooks/[id]/_patch.ts b/apps/api/pages/api/webhooks/[id]/_patch.ts index 073a7f0704..f41f775150 100644 --- a/apps/api/pages/api/webhooks/[id]/_patch.ts +++ b/apps/api/pages/api/webhooks/[id]/_patch.ts @@ -3,6 +3,7 @@ import type { NextApiRequest } from "next"; import { HttpError } from "@calcom/lib/http-error"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { schemaQueryIdAsString } from "~/lib/validations/shared/queryIdString"; import { schemaWebhookEditBodyParams, schemaWebhookReadPublic } from "~/lib/validations/webhook"; @@ -67,7 +68,7 @@ import { schemaWebhookEditBodyParams, schemaWebhookReadPublic } from "~/lib/vali * description: Authorization information is missing or invalid. */ export async function patchHandler(req: NextApiRequest) { - const { prisma, query, userId, isAdmin } = req; + const { query, userId, isAdmin } = req; const { id } = schemaQueryIdAsString.parse(query); const { eventTypeId, diff --git a/apps/api/pages/api/webhooks/_get.ts b/apps/api/pages/api/webhooks/_get.ts index 8708c303e8..79b712e742 100644 --- a/apps/api/pages/api/webhooks/_get.ts +++ b/apps/api/pages/api/webhooks/_get.ts @@ -3,6 +3,7 @@ import type { NextApiRequest } from "next"; import { HttpError } from "@calcom/lib/http-error"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { schemaQuerySingleOrMultipleUserIds } from "~/lib/validations/shared/queryUserId"; import { schemaWebhookReadPublic } from "~/lib/validations/webhook"; @@ -33,7 +34,7 @@ import { schemaWebhookReadPublic } from "~/lib/validations/webhook"; * description: No webhooks were found */ async function getHandler(req: NextApiRequest) { - const { userId, isAdmin, prisma } = req; + const { userId, isAdmin } = req; const args: Prisma.WebhookFindManyArgs = isAdmin ? {} : { where: { OR: [{ eventType: { userId } }, { userId }] } }; diff --git a/apps/api/pages/api/webhooks/_post.ts b/apps/api/pages/api/webhooks/_post.ts index 05e46d3a95..36e470e0c9 100644 --- a/apps/api/pages/api/webhooks/_post.ts +++ b/apps/api/pages/api/webhooks/_post.ts @@ -4,6 +4,7 @@ import { v4 as uuidv4 } from "uuid"; import { HttpError } from "@calcom/lib/http-error"; import { defaultResponder } from "@calcom/lib/server"; +import prisma from "@calcom/prisma"; import { schemaWebhookCreateBodyParams, schemaWebhookReadPublic } from "~/lib/validations/webhook"; @@ -65,7 +66,7 @@ import { schemaWebhookCreateBodyParams, schemaWebhookReadPublic } from "~/lib/va * description: Authorization information is missing or invalid. */ async function postHandler(req: NextApiRequest) { - const { userId, isAdmin, prisma } = req; + const { userId, isAdmin } = req; const { eventTypeId, userId: bodyUserId, diff --git a/apps/api/test/lib/middleware/withMiddleware.test.ts b/apps/api/test/lib/middleware/withMiddleware.test.ts deleted file mode 100644 index d8771e9719..0000000000 --- a/apps/api/test/lib/middleware/withMiddleware.test.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { describe, vi, it, expect, afterEach } from "vitest"; - -import { middlewareOrder } from "../../../lib/helpers/withMiddleware"; - -afterEach(() => { - vi.resetAllMocks(); -}); - -// Not sure if there is much point testing this order is actually applied via an integration test: -// It is tested internally https://github.com/htunnicliff/next-api-middleware/blob/368b12aa30e79f4bd7cfe7aacc18da263cc3de2f/lib/label.spec.ts#L62 -describe("API - withMiddleware test", () => { - it("Custom prisma should be before verifyApiKey", async () => { - const customPrismaClientIndex = middlewareOrder.indexOf("customPrismaClient"); - const verifyApiKeyIndex = middlewareOrder.indexOf("verifyApiKey"); - expect(customPrismaClientIndex).toBeLessThan(verifyApiKeyIndex); - }); -}); diff --git a/packages/types/next.d.ts b/packages/types/next.d.ts index 2807620616..b3bf15c9bf 100644 --- a/packages/types/next.d.ts +++ b/packages/types/next.d.ts @@ -1,8 +1,6 @@ import type { IncomingMessage } from "http"; import type { Session } from "next-auth"; -import type { PrismaClient } from "@calcom/prisma"; - import "./next-auth"; export declare module "next" { @@ -14,11 +12,9 @@ export declare module "next" { body: unkown; userId: number; method: string; - prisma: PrismaClient; // session: { user: { id: number } }; // query: Partial<{ [key: string]: string | string[] }>; isAdmin: boolean; - isCustomPrisma: boolean; pagination: { take: number; skip: number }; } }