diff --git a/apps/web/pages/api/book/event.ts b/apps/web/pages/api/book/event.ts index 7a19af7b9e..349f074bff 100644 --- a/apps/web/pages/api/book/event.ts +++ b/apps/web/pages/api/book/event.ts @@ -112,8 +112,7 @@ function isAvailable(busyTimes: BufferedBusyTimes, time: dayjs.ConfigType, lengt } const getEventTypesFromDB = async (eventTypeId: number) => { - const eventType = await prisma.eventType.findUnique({ - rejectOnNotFound: true, + const eventType = await prisma.eventType.findUniqueOrThrow({ where: { id: eventTypeId, }, @@ -662,10 +661,8 @@ async function handler(req: NextApiRequest) { if (typeof eventType.price === "number" && eventType.price > 0) { /* Validate if there is any stripe_payment credential for this user */ - await prisma.credential.findFirst({ - rejectOnNotFound(err) { - throw new HttpError({ statusCode: 400, message: "Missing stripe credentials", cause: err }); - }, + /* note: removes custom error message about stripe */ + await prisma.credential.findFirstOrThrow({ where: { type: "stripe_payment", userId: organizerUser.id, diff --git a/apps/web/pages/api/book/request-reschedule.ts b/apps/web/pages/api/book/request-reschedule.ts index c1c05f9ef1..8968ccdd35 100644 --- a/apps/web/pages/api/book/request-reschedule.ts +++ b/apps/web/pages/api/book/request-reschedule.ts @@ -40,8 +40,7 @@ const rescheduleSchema = z.object({ }); const findUserDataByUserId = async (userId: number) => { - return await prisma.user.findUnique({ - rejectOnNotFound: true, + return await prisma.user.findUniqueOrThrow({ where: { id: userId, }, @@ -76,7 +75,7 @@ const handler = async ( return res.status(501).end(); } - const bookingToReschedule = await prisma.booking.findFirst({ + const bookingToReschedule = await prisma.booking.findFirstOrThrow({ select: { id: true, uid: true, @@ -95,7 +94,6 @@ const handler = async ( dynamicGroupSlugRef: true, destinationCalendar: true, }, - rejectOnNotFound: true, where: { uid: bookingId, NOT: { @@ -127,14 +125,13 @@ const handler = async ( if (bookingToReschedule && user) { let event: Partial = {}; if (bookingToReschedule.eventTypeId) { - event = await prisma.eventType.findFirst({ + event = await prisma.eventType.findFirstOrThrow({ select: { title: true, users: true, schedulingType: true, recurringEvent: true, }, - rejectOnNotFound: true, where: { id: bookingToReschedule.eventTypeId, }, diff --git a/apps/web/pages/api/cancel.ts b/apps/web/pages/api/cancel.ts index a11d949270..275b266272 100644 --- a/apps/web/pages/api/cancel.ts +++ b/apps/web/pages/api/cancel.ts @@ -107,7 +107,7 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { throw new HttpError({ statusCode: 404, message: "User not found" }); } - const organizer = await prisma.user.findFirst({ + const organizer = await prisma.user.findFirstOrThrow({ where: { id: bookingToDelete.userId, }, @@ -117,7 +117,6 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { timeZone: true, locale: true, }, - rejectOnNotFound: true, }); const attendeesListPromises = bookingToDelete.attendees.map(async (attendee) => { diff --git a/apps/web/pages/api/import/calendly.ts b/apps/web/pages/api/import/calendly.ts index 18d9eb1683..aec448880a 100644 --- a/apps/web/pages/api/import/calendly.ts +++ b/apps/web/pages/api/import/calendly.ts @@ -15,8 +15,7 @@ type CalendlyEventType = { export default async function handler(req: NextApiRequest, res: NextApiResponse) { const session = await getSession({ req }); - const authenticatedUser = await prisma.user.findFirst({ - rejectOnNotFound: true, + const authenticatedUser = await prisma.user.findFirstOrThrow({ where: { id: session?.user.id, }, diff --git a/apps/web/pages/api/import/savvycal.ts b/apps/web/pages/api/import/savvycal.ts index 300a384ea9..775c95060b 100644 --- a/apps/web/pages/api/import/savvycal.ts +++ b/apps/web/pages/api/import/savvycal.ts @@ -15,8 +15,7 @@ type SavvyCalEventType = { export default async function handler(req: NextApiRequest, res: NextApiResponse) { const session = await getSession({ req }); - const authenticatedUser = await prisma.user.findFirst({ - rejectOnNotFound: true, + const authenticatedUser = await prisma.user.findFirstOrThrow({ where: { id: session?.user.id, }, diff --git a/apps/web/pages/api/intent-username/index.ts b/apps/web/pages/api/intent-username/index.ts index c74002830b..b930d928e9 100644 --- a/apps/web/pages/api/intent-username/index.ts +++ b/apps/web/pages/api/intent-username/index.ts @@ -12,13 +12,12 @@ export async function getHandler(req: NextApiRequest, res: NextApiResponse) { try { const session = await getSession({ req }); const userId = session?.user?.id; - const user = await prisma.user.findFirst({ + const user = await prisma.user.findFirstOrThrow({ select: { id: true, metadata: true, }, where: { id: userId }, - rejectOnNotFound: true, }); const checkPremiumUsernameResult = await checkUsername(intentUsername); diff --git a/apps/web/pages/api/me.ts b/apps/web/pages/api/me.ts index b9f41aa133..f2f3628e8e 100644 --- a/apps/web/pages/api/me.ts +++ b/apps/web/pages/api/me.ts @@ -15,8 +15,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) return; } - const user = await prisma.user.findUnique({ - rejectOnNotFound: true, + const user = await prisma.user.findUniqueOrThrow({ where: { id: session.user.id, }, diff --git a/apps/web/pages/api/upgrade.ts b/apps/web/pages/api/upgrade.ts index 69e73e4deb..ed2929fcc3 100644 --- a/apps/web/pages/api/upgrade.ts +++ b/apps/web/pages/api/upgrade.ts @@ -17,8 +17,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) throw new HttpCode({ statusCode: 405, message: "Method Not Allowed" }); } - const user = await prisma.user.findUnique({ - rejectOnNotFound: true, + const user = await prisma.user.findUniqueOrThrow({ where: { id: session.user.id, }, diff --git a/apps/web/pages/api/user/[id].ts b/apps/web/pages/api/user/[id].ts index 7315d9c507..2818178797 100644 --- a/apps/web/pages/api/user/[id].ts +++ b/apps/web/pages/api/user/[id].ts @@ -24,8 +24,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) return res.status(400).json({ message: "No user id provided" }); } - const authenticatedUser = await prisma.user.findFirst({ - rejectOnNotFound: true, + const authenticatedUser = await prisma.user.findFirstOrThrow({ where: { id: session.user.id, }, diff --git a/apps/web/pages/api/user/me.ts b/apps/web/pages/api/user/me.ts index 759b261eeb..37ef14487f 100644 --- a/apps/web/pages/api/user/me.ts +++ b/apps/web/pages/api/user/me.ts @@ -19,8 +19,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) if (req.method === "DELETE") { // Get user - const user = await prisma.user.findUnique({ - rejectOnNotFound: true, + const user = await prisma.user.findUniqueOrThrow({ where: { id: session.user?.id, }, diff --git a/apps/web/pages/auth/forgot-password/[id].tsx b/apps/web/pages/auth/forgot-password/[id].tsx index f5dba37464..20592a685e 100644 --- a/apps/web/pages/auth/forgot-password/[id].tsx +++ b/apps/web/pages/auth/forgot-password/[id].tsx @@ -206,8 +206,7 @@ export async function getServerSideProps(context: GetServerSidePropsContext) { const id = context.params?.id as string; try { - const resetPasswordRequest = await prisma.resetPasswordRequest.findUnique({ - rejectOnNotFound: true, + const resetPasswordRequest = await prisma.resetPasswordRequest.findUniqueOrThrow({ where: { id, }, diff --git a/apps/web/playwright/fixtures/users.ts b/apps/web/playwright/fixtures/users.ts index b636f4ee7d..06aa919b2f 100644 --- a/apps/web/playwright/fixtures/users.ts +++ b/apps/web/playwright/fixtures/users.ts @@ -61,8 +61,7 @@ export const createUsersFixture = (page: Page, workerInfo: WorkerInfo) => { length: 30, }, }); - const user = await prisma.user.findUnique({ - rejectOnNotFound: true, + const user = await prisma.user.findUniqueOrThrow({ where: { id: _user.id }, include: userIncludes, }); diff --git a/packages/app-store/applecalendar/api/add.ts b/packages/app-store/applecalendar/api/add.ts index d23451a19b..8b063f05b3 100644 --- a/packages/app-store/applecalendar/api/add.ts +++ b/packages/app-store/applecalendar/api/add.ts @@ -10,8 +10,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) if (req.method === "POST") { const { username, password } = req.body; // Get user - const user = await prisma.user.findFirst({ - rejectOnNotFound: true, + const user = await prisma.user.findFirstOrThrow({ where: { id: req.session?.user?.id, }, diff --git a/packages/app-store/caldavcalendar/api/add.ts b/packages/app-store/caldavcalendar/api/add.ts index 314380cc57..91c95ab256 100644 --- a/packages/app-store/caldavcalendar/api/add.ts +++ b/packages/app-store/caldavcalendar/api/add.ts @@ -10,8 +10,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) if (req.method === "POST") { const { username, password, url } = req.body; // Get user - const user = await prisma.user.findFirst({ - rejectOnNotFound: true, + const user = await prisma.user.findFirstOrThrow({ where: { id: req.session?.user?.id, }, diff --git a/packages/app-store/exchange2013calendar/api/add.ts b/packages/app-store/exchange2013calendar/api/add.ts index 8683ed4c9a..c1e9a5969e 100644 --- a/packages/app-store/exchange2013calendar/api/add.ts +++ b/packages/app-store/exchange2013calendar/api/add.ts @@ -19,8 +19,7 @@ const bodySchema = z async function postHandler(req: NextApiRequest, res: NextApiResponse) { const body = bodySchema.parse(req.body); // Get user - const user = await prisma.user.findFirst({ - rejectOnNotFound: true, + const user = await prisma.user.findFirstOrThrow({ where: { id: req.session?.user?.id, }, diff --git a/packages/app-store/exchange2016calendar/api/add.ts b/packages/app-store/exchange2016calendar/api/add.ts index c0a3775f61..7510c3dd88 100644 --- a/packages/app-store/exchange2016calendar/api/add.ts +++ b/packages/app-store/exchange2016calendar/api/add.ts @@ -19,8 +19,7 @@ const bodySchema = z async function postHandler(req: NextApiRequest, res: NextApiResponse) { const body = bodySchema.parse(req.body); // Get user - const user = await prisma.user.findFirst({ - rejectOnNotFound: true, + const user = await prisma.user.findFirstOrThrow({ where: { id: req.session?.user?.id, }, diff --git a/packages/app-store/slackmessaging/api/add.ts b/packages/app-store/slackmessaging/api/add.ts index 7cac58db40..ebeecec67f 100644 --- a/packages/app-store/slackmessaging/api/add.ts +++ b/packages/app-store/slackmessaging/api/add.ts @@ -16,8 +16,7 @@ async function handler(req: NextApiRequest) { const { client_id } = await getSlackAppKeys(); // Get user - await prisma.user.findFirst({ - rejectOnNotFound: true, + await prisma.user.findFirstOrThrow({ where: { id: req.session.user.id, }, diff --git a/packages/app-store/slackmessaging/lib/actions/createEvent.ts b/packages/app-store/slackmessaging/lib/actions/createEvent.ts index 493695e1b7..9127cbb759 100644 --- a/packages/app-store/slackmessaging/lib/actions/createEvent.ts +++ b/packages/app-store/slackmessaging/lib/actions/createEvent.ts @@ -43,8 +43,7 @@ export default async function createEvent(req: NextApiRequest, res: NextApiRespo // Im sure this query can be made more efficient... The JSON filtering wouldnt work when doing it directly on user. const foundUser = await db.credential - .findFirst({ - rejectOnNotFound: true, + .findFirstOrThrow({ ...WhereCredsEqualsId(user.id), }) .user({ diff --git a/packages/app-store/tandemvideo/api/add.ts b/packages/app-store/tandemvideo/api/add.ts index bd73bdb2dc..ca364f5d38 100644 --- a/packages/app-store/tandemvideo/api/add.ts +++ b/packages/app-store/tandemvideo/api/add.ts @@ -12,8 +12,7 @@ let base_url = ""; export default async function handler(req: NextApiRequest, res: NextApiResponse) { if (req.method === "GET") { // Get user - await prisma.user.findFirst({ - rejectOnNotFound: true, + await prisma.user.findFirstOrThrow({ where: { id: req.session?.user?.id, }, diff --git a/packages/app-store/vital/api/webhook.ts b/packages/app-store/vital/api/webhook.ts index 6592c2a79e..ed518e0748 100644 --- a/packages/app-store/vital/api/webhook.ts +++ b/packages/app-store/vital/api/webhook.ts @@ -57,8 +57,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) try { if (event.data.user_id) { const json = { userVitalId: event.data.user_id as string }; - const credential = await prisma.credential.findFirst({ - rejectOnNotFound: true, + const credential = await prisma.credential.findFirstOrThrow({ where: { type: "vital_other", key: { diff --git a/packages/app-store/vital/lib/reschedule.ts b/packages/app-store/vital/lib/reschedule.ts index b3e0a6f25d..8d253526ba 100644 --- a/packages/app-store/vital/lib/reschedule.ts +++ b/packages/app-store/vital/lib/reschedule.ts @@ -17,7 +17,7 @@ import { getCalendar } from "../../_utils/getCalendar"; type PersonAttendeeCommonFields = Pick; const Reschedule = async (bookingUid: string, cancellationReason: string) => { - const bookingToReschedule = await prisma.booking.findFirst({ + const bookingToReschedule = await prisma.booking.findFirstOrThrow({ select: { id: true, uid: true, @@ -42,7 +42,6 @@ const Reschedule = async (bookingUid: string, cancellationReason: string) => { }, }, }, - rejectOnNotFound: true, where: { uid: bookingUid, NOT: { @@ -55,13 +54,12 @@ const Reschedule = async (bookingUid: string, cancellationReason: string) => { if (bookingToReschedule && bookingToReschedule.eventTypeId && bookingToReschedule.user) { const userOwner = bookingToReschedule.user; - const event = await prisma.eventType.findFirst({ + const event = await prisma.eventType.findFirstOrThrow({ select: { title: true, users: true, schedulingType: true, }, - rejectOnNotFound: true, where: { id: bookingToReschedule.eventTypeId, }, diff --git a/packages/app-store/wipemycalother/lib/reschedule.ts b/packages/app-store/wipemycalother/lib/reschedule.ts index d43541d731..74d199229a 100644 --- a/packages/app-store/wipemycalother/lib/reschedule.ts +++ b/packages/app-store/wipemycalother/lib/reschedule.ts @@ -17,7 +17,7 @@ import { getCalendar } from "../../_utils/getCalendar"; type PersonAttendeeCommonFields = Pick; const Reschedule = async (bookingUid: string, cancellationReason: string) => { - const bookingToReschedule = await prisma.booking.findFirst({ + const bookingToReschedule = await prisma.booking.findFirstOrThrow({ select: { id: true, uid: true, @@ -42,7 +42,6 @@ const Reschedule = async (bookingUid: string, cancellationReason: string) => { }, }, }, - rejectOnNotFound: true, where: { uid: bookingUid, NOT: { @@ -55,13 +54,12 @@ const Reschedule = async (bookingUid: string, cancellationReason: string) => { if (bookingToReschedule && bookingToReschedule.eventTypeId && bookingToReschedule.user) { const userOwner = bookingToReschedule.user; - const event = await prisma.eventType.findFirst({ + const event = await prisma.eventType.findFirstOrThrow({ select: { title: true, users: true, schedulingType: true, }, - rejectOnNotFound: true, where: { id: bookingToReschedule.eventTypeId, }, diff --git a/packages/app-store/zoomvideo/api/add.ts b/packages/app-store/zoomvideo/api/add.ts index 2ab1ae055d..35041a4371 100644 --- a/packages/app-store/zoomvideo/api/add.ts +++ b/packages/app-store/zoomvideo/api/add.ts @@ -9,8 +9,7 @@ import { getZoomAppKeys } from "../lib"; async function handler(req: NextApiRequest) { // Get user - await prisma.user.findFirst({ - rejectOnNotFound: true, + await prisma.user.findFirstOrThrow({ where: { id: req.session?.user?.id, }, diff --git a/packages/core/builders/CalendarEvent/builder.ts b/packages/core/builders/CalendarEvent/builder.ts index 6ddf1b7124..8aa4b3cb7c 100644 --- a/packages/core/builders/CalendarEvent/builder.ts +++ b/packages/core/builders/CalendarEvent/builder.ts @@ -95,8 +95,7 @@ export class CalendarEventBuilder implements ICalendarEventBuilder { private async getUserById(userId: number) { let resultUser: User | null; try { - resultUser = await prisma.user.findUnique({ - rejectOnNotFound: true, + resultUser = await prisma.user.findUniqueOrThrow({ where: { id: userId, }, @@ -111,8 +110,7 @@ export class CalendarEventBuilder implements ICalendarEventBuilder { private async getEventFromEventId(eventTypeId: number) { let resultEventType; try { - resultEventType = await prisma.eventType.findUnique({ - rejectOnNotFound: true, + resultEventType = await prisma.eventType.findUniqueOrThrow({ where: { id: eventTypeId, }, @@ -223,8 +221,7 @@ export class CalendarEventBuilder implements ICalendarEventBuilder { public async setUsersFromId(userId: User["id"]) { let resultUser: User | null; try { - resultUser = await prisma.user.findUnique({ - rejectOnNotFound: true, + resultUser = await prisma.user.findUniqueOrThrow({ where: { id: userId, }, diff --git a/packages/lib/server/getServerErrorFromUnknown.ts b/packages/lib/server/getServerErrorFromUnknown.ts index 9b66cd76d4..a85471523d 100644 --- a/packages/lib/server/getServerErrorFromUnknown.ts +++ b/packages/lib/server/getServerErrorFromUnknown.ts @@ -1,4 +1,4 @@ -import { PrismaClientKnownRequestError } from "@prisma/client/runtime"; +import { PrismaClientKnownRequestError, NotFoundError } from "@prisma/client/runtime"; import Stripe from "stripe"; import { ZodError, ZodIssue } from "zod"; @@ -42,6 +42,9 @@ export function getServerErrorFromUnknown(cause: unknown): HttpError { if (cause instanceof PrismaClientKnownRequestError) { return new HttpError({ statusCode: 400, message: cause.message, cause }); } + if (cause instanceof NotFoundError) { + return new HttpError({ statusCode: 404, message: cause.message, cause }); + } if (cause instanceof Stripe.errors.StripeInvalidRequestError) { return new HttpError({ statusCode: 400, message: cause.message, cause }); } diff --git a/packages/trpc/server/routers/viewer/bookings.tsx b/packages/trpc/server/routers/viewer/bookings.tsx index 01d0af6298..1516f8e2fa 100644 --- a/packages/trpc/server/routers/viewer/bookings.tsx +++ b/packages/trpc/server/routers/viewer/bookings.tsx @@ -96,7 +96,7 @@ export const bookingsRouter = createProtectedRouter() const { booking } = ctx; try { - const organizer = await ctx.prisma.user.findFirst({ + const organizer = await ctx.prisma.user.findFirstOrThrow({ where: { id: booking.userId || 0, }, @@ -106,7 +106,6 @@ export const bookingsRouter = createProtectedRouter() timeZone: true, locale: true, }, - rejectOnNotFound: true, }); const tOrganizer = await getTranslation(organizer.locale ?? "en", "common");