refactor: convert BookingRepository to use dependency injection pattern (#22389)
* refactor: convert BookingRepository to use dependency injection pattern - Add constructor injection for PrismaClient to BookingRepository - Convert all static methods to instance methods using this.prismaClient - Update all usage sites to use two-step instantiation pattern: const bookingRepo = new BookingRepository(prisma); bookingRepo.method(...) - Apply same dependency injection pattern as UserRepository, TeamRepository, and SelectedSlotsRepository - Update test files to use correct prismaMock import paths - Maintain all existing functionality and type safety Files updated: - BookingRepository class structure and all 15 static methods - Video meeting pages and booking views - Booking utilities and services (handleNewBooking, originalRescheduledBookingUtils) - Round robin handlers and reassignment logic - Interval limits and booking limits checking - Test files with proper mocking setup Co-Authored-By: morgan@cal.com <morgan@cal.com> * chore: bump platform libs --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: morgan@cal.com <morgan@cal.com>
This commit is contained in:
co-authored by
morgan@cal.com
parent
80ac118242
commit
c316721051
@@ -38,7 +38,7 @@
|
||||
"@axiomhq/winston": "^1.2.0",
|
||||
"@calcom/platform-constants": "*",
|
||||
"@calcom/platform-enums": "*",
|
||||
"@calcom/platform-libraries": "npm:@calcom/platform-libraries@0.0.255",
|
||||
"@calcom/platform-libraries": "npm:@calcom/platform-libraries@0.0.256",
|
||||
"@calcom/platform-types": "*",
|
||||
"@calcom/platform-utils": "*",
|
||||
"@calcom/prisma": "*",
|
||||
|
||||
@@ -6,6 +6,7 @@ import { notFound } from "next/navigation";
|
||||
import { z } from "zod";
|
||||
|
||||
import { BookingRepository } from "@calcom/lib/server/repository/booking";
|
||||
import { prisma } from "@calcom/prisma";
|
||||
|
||||
import { buildLegacyCtx } from "@lib/buildLegacyCtx";
|
||||
import { getServerSideProps } from "@lib/video/meeting-not-started/[uid]/getServerSideProps";
|
||||
@@ -22,7 +23,8 @@ export const generateMetadata = async ({ params }: ServerPageProps) => {
|
||||
if (!parsed.success) {
|
||||
notFound();
|
||||
}
|
||||
const booking = await BookingRepository.findBookingByUid({
|
||||
const bookingRepo = new BookingRepository(prisma);
|
||||
const booking = await bookingRepo.findBookingByUid({
|
||||
bookingUid: parsed.data.uid,
|
||||
});
|
||||
|
||||
|
||||
@@ -106,7 +106,8 @@ const checkIfUserIsHost = async ({
|
||||
export async function getServerSideProps(context: GetServerSidePropsContext) {
|
||||
const { req } = context;
|
||||
|
||||
const booking = await BookingRepository.findBookingForMeetingPage({
|
||||
const bookingRepo = new BookingRepository(prisma);
|
||||
const booking = await bookingRepo.findBookingForMeetingPage({
|
||||
bookingUid: context.query.uid as string,
|
||||
});
|
||||
|
||||
|
||||
@@ -1,12 +1,14 @@
|
||||
import type { GetServerSidePropsContext } from "next";
|
||||
|
||||
import { BookingRepository } from "@calcom/lib/server/repository/booking";
|
||||
import { prisma } from "@calcom/prisma";
|
||||
|
||||
import { type inferSSRProps } from "@lib/types/inferSSRProps";
|
||||
|
||||
export type PageProps = inferSSRProps<typeof getServerSideProps>;
|
||||
export async function getServerSideProps(context: GetServerSidePropsContext) {
|
||||
const booking = await BookingRepository.findBookingForMeetingEndedPage({
|
||||
const bookingRepo = new BookingRepository(prisma);
|
||||
const booking = await bookingRepo.findBookingForMeetingEndedPage({
|
||||
bookingUid: context.query.uid as string,
|
||||
});
|
||||
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
import type { GetServerSidePropsContext } from "next";
|
||||
|
||||
import { BookingRepository } from "@calcom/lib/server/repository/booking";
|
||||
import { prisma } from "@calcom/prisma";
|
||||
|
||||
// change the type
|
||||
export async function getServerSideProps(context: GetServerSidePropsContext) {
|
||||
const booking = await BookingRepository.findBookingByUid({
|
||||
const bookingRepo = new BookingRepository(prisma);
|
||||
const booking = await bookingRepo.findBookingByUid({
|
||||
bookingUid: context.query.uid as string,
|
||||
});
|
||||
|
||||
|
||||
@@ -77,7 +77,8 @@ export async function getServerSideProps(context: GetServerSidePropsContext) {
|
||||
|
||||
let rescheduledToUid: string | null = null;
|
||||
if (bookingInfo.rescheduled) {
|
||||
const rescheduledTo = await BookingRepository.findFirstBookingByReschedule({
|
||||
const bookingRepo = new BookingRepository(prisma);
|
||||
const rescheduledTo = await bookingRepo.findFirstBookingByReschedule({
|
||||
originalBookingUid: bookingInfo.uid,
|
||||
});
|
||||
rescheduledToUid = rescheduledTo?.uid ?? null;
|
||||
@@ -89,7 +90,8 @@ export async function getServerSideProps(context: GetServerSidePropsContext) {
|
||||
} | null = null;
|
||||
|
||||
if (bookingInfo.fromReschedule) {
|
||||
previousBooking = await BookingRepository.findReschedulerByUid({
|
||||
const bookingRepo = new BookingRepository(prisma);
|
||||
previousBooking = await bookingRepo.findReschedulerByUid({
|
||||
uid: bookingInfo.fromReschedule,
|
||||
});
|
||||
}
|
||||
|
||||
@@ -506,7 +506,8 @@ async function handler(
|
||||
(!isConfirmedByDefault && !userReschedulingIsOwner) ||
|
||||
eventType.schedulingType === SchedulingType.ROUND_ROBIN
|
||||
) {
|
||||
const existingBooking = await BookingRepository.getValidBookingFromEventTypeForAttendee({
|
||||
const bookingRepo = new BookingRepository(prisma);
|
||||
const existingBooking = await bookingRepo.getValidBookingFromEventTypeForAttendee({
|
||||
eventTypeId,
|
||||
bookerEmail,
|
||||
bookerPhoneNumber,
|
||||
|
||||
@@ -3,10 +3,12 @@ import type { Prisma } from "@prisma/client";
|
||||
import { ErrorCode } from "@calcom/lib/errorCodes";
|
||||
import { HttpError } from "@calcom/lib/http-error";
|
||||
import { BookingRepository } from "@calcom/lib/server/repository/booking";
|
||||
import { prisma } from "@calcom/prisma";
|
||||
import { BookingStatus } from "@calcom/prisma/enums";
|
||||
|
||||
export async function getOriginalRescheduledBooking(uid: string, seatsEventType?: boolean) {
|
||||
const originalBooking = await BookingRepository.findOriginalRescheduledBooking(uid, seatsEventType);
|
||||
const bookingRepo = new BookingRepository(prisma);
|
||||
const originalBooking = await bookingRepo.findOriginalRescheduledBooking(uid, seatsEventType);
|
||||
|
||||
if (!originalBooking) {
|
||||
throw new HttpError({ statusCode: 404, message: "Could not find original booking" });
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import prismaMock from "../../../../tests/libs/__mocks__/prisma";
|
||||
|
||||
import {
|
||||
getDate,
|
||||
createBookingScenario,
|
||||
@@ -242,7 +244,8 @@ describe("roundRobinManualReassignment test", () => {
|
||||
userId: fixedHost.id,
|
||||
});
|
||||
|
||||
const attendees = await BookingRepository.getBookingAttendees(123);
|
||||
const bookingRepo = new BookingRepository(prismaMock);
|
||||
const attendees = await bookingRepo.getBookingAttendees(123);
|
||||
|
||||
expect(attendees.some((attendee) => attendee.email === currentRRHost.email)).toBe(false);
|
||||
expect(attendees.some((attendee) => attendee.email === newHost.email)).toBe(true);
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import prismaMock from "../../../../tests/libs/__mocks__/prisma";
|
||||
|
||||
import {
|
||||
getDate,
|
||||
createBookingScenario,
|
||||
@@ -286,7 +288,8 @@ describe("roundRobinReassignment test", () => {
|
||||
userId: 1,
|
||||
});
|
||||
|
||||
const attendees = await BookingRepository.getBookingAttendees(123);
|
||||
const bookingRepo = new BookingRepository(prismaMock);
|
||||
const attendees = await bookingRepo.getBookingAttendees(123);
|
||||
|
||||
expect(attendees.some((attendee) => attendee.email === currentRRHost.email)).toBe(false);
|
||||
|
||||
|
||||
@@ -223,7 +223,8 @@ const getWebhooksService = async (bookingUid: string, platformClientId?: string)
|
||||
const assertCanAccessBooking = async (bookingUid: string, userId?: number) => {
|
||||
if (!userId) throw new HttpError({ statusCode: 401 });
|
||||
|
||||
const booking = await BookingRepository.findBookingByUidAndUserId({ bookingUid, userId });
|
||||
const bookingRepo = new BookingRepository(prisma);
|
||||
const booking = await bookingRepo.findBookingByUidAndUserId({ bookingUid, userId });
|
||||
|
||||
if (!booking)
|
||||
throw new HttpError({ statusCode: 403, message: "You are not allowed to access this booking" });
|
||||
|
||||
@@ -18,7 +18,7 @@ import type { EventBusyDetails } from "@calcom/types/Calendar";
|
||||
import type { CredentialForCalendarService } from "@calcom/types/Credential";
|
||||
|
||||
import { getDefinedBufferTimes } from "../features/eventtypes/lib/getDefinedBufferTimes";
|
||||
import { BookingRepository as BookingRepo } from "./server/repository/booking";
|
||||
import { BookingRepository } from "./server/repository/booking";
|
||||
|
||||
const _getBusyTimes = async (params: {
|
||||
credentials: CredentialForCalendarService[];
|
||||
@@ -108,7 +108,8 @@ const _getBusyTimes = async (params: {
|
||||
let bookings = params.currentBookings;
|
||||
|
||||
if (!bookings) {
|
||||
bookings = await BookingRepo.findAllExistingBookingsForEventTypeBetween({
|
||||
const bookingRepo = new BookingRepository(prisma);
|
||||
bookings = await bookingRepo.findAllExistingBookingsForEventTypeBetween({
|
||||
userIdAndEmailMap: new Map([[userId, userEmail]]),
|
||||
eventTypeId,
|
||||
startDate: startTimeAdjustedWithMaxBuffer,
|
||||
|
||||
@@ -77,7 +77,8 @@ async function _checkBookingLimit({
|
||||
let bookingsInPeriod;
|
||||
|
||||
if (teamId && user) {
|
||||
bookingsInPeriod = await BookingRepository.getAllAcceptedTeamBookingsOfUser({
|
||||
const bookingRepo = new BookingRepository(prisma);
|
||||
bookingsInPeriod = await bookingRepo.getAllAcceptedTeamBookingsOfUser({
|
||||
user: { id: user.id, email: user.email },
|
||||
teamId,
|
||||
startDate: startDate,
|
||||
|
||||
@@ -7,6 +7,7 @@ import { withReporting } from "@calcom/lib/sentryWrapper";
|
||||
import { performance } from "@calcom/lib/server/perfObserver";
|
||||
import { getTotalBookingDuration } from "@calcom/lib/server/queries/booking";
|
||||
import { BookingRepository } from "@calcom/lib/server/repository/booking";
|
||||
import prisma from "@calcom/prisma";
|
||||
import type { EventBusyDetails } from "@calcom/types/Calendar";
|
||||
|
||||
import { descendingLimitKeys, intervalLimitKeyToUnit } from "../intervalLimit";
|
||||
@@ -233,7 +234,8 @@ const _getBusyTimesFromTeamLimits = async (
|
||||
bookingLimits
|
||||
);
|
||||
|
||||
const bookings = await BookingRepository.getAllAcceptedTeamBookingsOfUser({
|
||||
const bookingRepo = new BookingRepository(prisma);
|
||||
const bookings = await bookingRepo.getAllAcceptedTeamBookingsOfUser({
|
||||
user,
|
||||
teamId,
|
||||
startDate: limitDateFrom.toDate(),
|
||||
|
||||
@@ -490,7 +490,8 @@ async function getBookingsOfInterval({
|
||||
rrTimestampBasis: RRTimestampBasis;
|
||||
meetingStartTime?: Date;
|
||||
}) {
|
||||
return await BookingRepository.getAllBookingsForRoundRobin({
|
||||
const bookingRepo = new BookingRepository(prisma);
|
||||
return await bookingRepo.getAllBookingsForRoundRobin({
|
||||
eventTypeId: eventTypeId,
|
||||
users,
|
||||
startDate: getIntervalStartDate({ interval, rrTimestampBasis, meetingStartTime }),
|
||||
|
||||
@@ -104,7 +104,8 @@ describe("BookingRepository", () => {
|
||||
it("it should not include bookings where the attendee is a no show", async () => {
|
||||
await createAttendeeNoShowTestBookings();
|
||||
|
||||
const bookings = await BookingRepository.getAllBookingsForRoundRobin({
|
||||
const bookingRepo = new BookingRepository(prismaMock);
|
||||
const bookings = await bookingRepo.getAllBookingsForRoundRobin({
|
||||
users: [{ id: 1, email: "organizer1@example.com" }],
|
||||
eventTypeId: 1,
|
||||
startDate: new Date(),
|
||||
@@ -118,7 +119,8 @@ describe("BookingRepository", () => {
|
||||
it("it should include bookings where the attendee is a no show", async () => {
|
||||
await createAttendeeNoShowTestBookings();
|
||||
|
||||
const bookings = await BookingRepository.getAllBookingsForRoundRobin({
|
||||
const bookingRepo = new BookingRepository(prismaMock);
|
||||
const bookings = await bookingRepo.getAllBookingsForRoundRobin({
|
||||
users: [{ id: 1, email: "organizer1@example.com" }],
|
||||
eventTypeId: 1,
|
||||
startDate: new Date(),
|
||||
@@ -132,7 +134,8 @@ describe("BookingRepository", () => {
|
||||
it("it should not include bookings where the host is a no show", async () => {
|
||||
await createHostNoShowTestBookings();
|
||||
|
||||
const bookings = await BookingRepository.getAllBookingsForRoundRobin({
|
||||
const bookingRepo = new BookingRepository(prismaMock);
|
||||
const bookings = await bookingRepo.getAllBookingsForRoundRobin({
|
||||
users: [{ id: 1, email: "organizer1@example.com" }],
|
||||
eventTypeId: 1,
|
||||
startDate: new Date(),
|
||||
@@ -146,7 +149,8 @@ describe("BookingRepository", () => {
|
||||
it("it should include bookings where the host is a no show", async () => {
|
||||
await createHostNoShowTestBookings();
|
||||
|
||||
const bookings = await BookingRepository.getAllBookingsForRoundRobin({
|
||||
const bookingRepo = new BookingRepository(prismaMock);
|
||||
const bookings = await bookingRepo.getAllBookingsForRoundRobin({
|
||||
users: [{ id: 1, email: "organizer1@example.com" }],
|
||||
eventTypeId: 1,
|
||||
startDate: new Date(),
|
||||
@@ -161,7 +165,8 @@ describe("BookingRepository", () => {
|
||||
await createHostNoShowTestBookings();
|
||||
await createAttendeeNoShowTestBookings();
|
||||
|
||||
const bookings = await BookingRepository.getAllBookingsForRoundRobin({
|
||||
const bookingRepo = new BookingRepository(prismaMock);
|
||||
const bookings = await bookingRepo.getAllBookingsForRoundRobin({
|
||||
users: [{ id: 1, email: "organizer1@example.com" }],
|
||||
eventTypeId: 1,
|
||||
startDate: new Date(),
|
||||
@@ -176,7 +181,8 @@ describe("BookingRepository", () => {
|
||||
await createHostNoShowTestBookings();
|
||||
await createAttendeeNoShowTestBookings();
|
||||
|
||||
const bookings = await BookingRepository.getAllBookingsForRoundRobin({
|
||||
const bookingRepo = new BookingRepository(prismaMock);
|
||||
const bookings = await bookingRepo.getAllBookingsForRoundRobin({
|
||||
users: [{ id: 1, email: "organizer1@example.com" }],
|
||||
eventTypeId: 1,
|
||||
startDate: new Date(),
|
||||
@@ -232,7 +238,8 @@ describe("BookingRepository", () => {
|
||||
}),
|
||||
]);
|
||||
|
||||
const bookings = await BookingRepository.getAllBookingsForRoundRobin({
|
||||
const bookingRepo = new BookingRepository(prismaMock);
|
||||
const bookings = await bookingRepo.getAllBookingsForRoundRobin({
|
||||
users: [{ id: 1, email: "organizer1@example.com" }],
|
||||
eventTypeId: 1,
|
||||
startDate: new Date("2025-06-01T00:00:00.000Z"),
|
||||
|
||||
@@ -2,7 +2,8 @@ import type { Prisma } from "@prisma/client";
|
||||
|
||||
import type { FormResponse } from "@calcom/app-store/routing-forms/types/types";
|
||||
import { withReporting } from "@calcom/lib/sentryWrapper";
|
||||
import prisma, { bookingMinimalSelect } from "@calcom/prisma";
|
||||
import type { PrismaClient } from "@calcom/prisma";
|
||||
import { bookingMinimalSelect } from "@calcom/prisma";
|
||||
import type { Booking } from "@calcom/prisma/client";
|
||||
import { RRTimestampBasis } from "@calcom/prisma/enums";
|
||||
import { BookingStatus } from "@calcom/prisma/enums";
|
||||
@@ -113,8 +114,10 @@ const buildWhereClauseForActiveBookings = ({
|
||||
});
|
||||
|
||||
export class BookingRepository {
|
||||
static async getBookingAttendees(bookingId: number) {
|
||||
return await prisma.attendee.findMany({
|
||||
constructor(private prismaClient: PrismaClient) {}
|
||||
|
||||
async getBookingAttendees(bookingId: number) {
|
||||
return await this.prismaClient.attendee.findMany({
|
||||
where: {
|
||||
bookingId,
|
||||
},
|
||||
@@ -122,8 +125,8 @@ export class BookingRepository {
|
||||
}
|
||||
|
||||
/** Determines if the user is the organizer, team admin, or org admin that the booking was created under */
|
||||
static async doesUserIdHaveAccessToBooking({ userId, bookingId }: { userId: number; bookingId: number }) {
|
||||
const booking = await prisma.booking.findUnique({
|
||||
async doesUserIdHaveAccessToBooking({ userId, bookingId }: { userId: number; bookingId: number }) {
|
||||
const booking = await this.prismaClient.booking.findUnique({
|
||||
where: {
|
||||
id: bookingId,
|
||||
},
|
||||
@@ -145,7 +148,7 @@ export class BookingRepository {
|
||||
if (!booking.eventType || !booking.eventType.teamId) return false;
|
||||
|
||||
// TODO add checks for team and org
|
||||
const userRepo = new UserRepository(prisma);
|
||||
const userRepo = new UserRepository(this.prismaClient);
|
||||
const isAdminOrUser = await userRepo.isAdminOfTeamOrParentOrg({
|
||||
userId,
|
||||
teamId: booking.eventType.teamId,
|
||||
@@ -154,8 +157,8 @@ export class BookingRepository {
|
||||
return isAdminOrUser;
|
||||
}
|
||||
|
||||
static async findFirstBookingByReschedule({ originalBookingUid }: { originalBookingUid: string }) {
|
||||
return await prisma.booking.findFirst({
|
||||
async findFirstBookingByReschedule({ originalBookingUid }: { originalBookingUid: string }) {
|
||||
return await this.prismaClient.booking.findFirst({
|
||||
where: {
|
||||
fromReschedule: originalBookingUid,
|
||||
},
|
||||
@@ -165,8 +168,8 @@ export class BookingRepository {
|
||||
});
|
||||
}
|
||||
|
||||
static async findReschedulerByUid({ uid }: { uid: string }) {
|
||||
return await prisma.booking.findUnique({
|
||||
async findReschedulerByUid({ uid }: { uid: string }) {
|
||||
return await this.prismaClient.booking.findUnique({
|
||||
where: {
|
||||
uid,
|
||||
},
|
||||
@@ -177,7 +180,7 @@ export class BookingRepository {
|
||||
});
|
||||
}
|
||||
|
||||
private static async _findAllExistingBookingsForEventTypeBetween({
|
||||
private async _findAllExistingBookingsForEventTypeBetween({
|
||||
eventTypeId,
|
||||
seatedEvent = false,
|
||||
startDate,
|
||||
@@ -228,7 +231,7 @@ export class BookingRepository {
|
||||
}),
|
||||
} satisfies Prisma.BookingSelect;
|
||||
|
||||
const currentBookingsAllUsersQueryOne = prisma.booking.findMany({
|
||||
const currentBookingsAllUsersQueryOne = this.prismaClient.booking.findMany({
|
||||
where: {
|
||||
...sharedQuery,
|
||||
userId: {
|
||||
@@ -238,7 +241,7 @@ export class BookingRepository {
|
||||
select: bookingsSelect,
|
||||
});
|
||||
|
||||
const currentBookingsAllUsersQueryTwo = prisma.booking.findMany({
|
||||
const currentBookingsAllUsersQueryTwo = this.prismaClient.booking.findMany({
|
||||
where: {
|
||||
...sharedQuery,
|
||||
attendees: {
|
||||
@@ -253,7 +256,7 @@ export class BookingRepository {
|
||||
});
|
||||
|
||||
const currentBookingsAllUsersQueryThree = eventTypeId
|
||||
? prisma.booking.findMany({
|
||||
? this.prismaClient.booking.findMany({
|
||||
where: {
|
||||
startTime: { lte: endDate },
|
||||
endTime: { gte: startDate },
|
||||
@@ -289,12 +292,12 @@ export class BookingRepository {
|
||||
return [...resultOne, ...resultTwoWithOrganizersRemoved, ...resultThree];
|
||||
}
|
||||
|
||||
static findAllExistingBookingsForEventTypeBetween = withReporting(
|
||||
BookingRepository._findAllExistingBookingsForEventTypeBetween,
|
||||
findAllExistingBookingsForEventTypeBetween = withReporting(
|
||||
this._findAllExistingBookingsForEventTypeBetween.bind(this),
|
||||
"findAllExistingBookingsForEventTypeBetween"
|
||||
);
|
||||
|
||||
static async getAllBookingsForRoundRobin({
|
||||
async getAllBookingsForRoundRobin({
|
||||
users,
|
||||
eventTypeId,
|
||||
startDate,
|
||||
@@ -317,7 +320,7 @@ export class BookingRepository {
|
||||
includeNoShowInRRCalculation: boolean;
|
||||
rrTimestampBasis: RRTimestampBasis;
|
||||
}) {
|
||||
const allBookings = await prisma.booking.findMany({
|
||||
const allBookings = await this.prismaClient.booking.findMany({
|
||||
where: buildWhereClauseForActiveBookings({
|
||||
eventTypeId,
|
||||
startDate,
|
||||
@@ -367,8 +370,8 @@ export class BookingRepository {
|
||||
return queueBookings;
|
||||
}
|
||||
|
||||
static async findBookingByUid({ bookingUid }: { bookingUid: string }) {
|
||||
return await prisma.booking.findUnique({
|
||||
async findBookingByUid({ bookingUid }: { bookingUid: string }) {
|
||||
return await this.prismaClient.booking.findUnique({
|
||||
where: {
|
||||
uid: bookingUid,
|
||||
},
|
||||
@@ -376,8 +379,8 @@ export class BookingRepository {
|
||||
});
|
||||
}
|
||||
|
||||
static async findBookingForMeetingPage({ bookingUid }: { bookingUid: string }) {
|
||||
return await prisma.booking.findUnique({
|
||||
async findBookingForMeetingPage({ bookingUid }: { bookingUid: string }) {
|
||||
return await this.prismaClient.booking.findUnique({
|
||||
where: {
|
||||
uid: bookingUid,
|
||||
},
|
||||
@@ -431,8 +434,8 @@ export class BookingRepository {
|
||||
});
|
||||
}
|
||||
|
||||
static async findBookingForMeetingEndedPage({ bookingUid }: { bookingUid: string }) {
|
||||
return await prisma.booking.findUnique({
|
||||
async findBookingForMeetingEndedPage({ bookingUid }: { bookingUid: string }) {
|
||||
return await this.prismaClient.booking.findUnique({
|
||||
where: {
|
||||
uid: bookingUid,
|
||||
},
|
||||
@@ -455,8 +458,8 @@ export class BookingRepository {
|
||||
});
|
||||
}
|
||||
|
||||
static async findBookingByUidAndUserId({ bookingUid, userId }: { bookingUid: string; userId: number }) {
|
||||
return await prisma.booking.findFirst({
|
||||
async findBookingByUidAndUserId({ bookingUid, userId }: { bookingUid: string; userId: number }) {
|
||||
return await this.prismaClient.booking.findFirst({
|
||||
where: {
|
||||
uid: bookingUid,
|
||||
OR: [
|
||||
@@ -516,7 +519,7 @@ export class BookingRepository {
|
||||
});
|
||||
}
|
||||
|
||||
static async updateLocationById({
|
||||
async updateLocationById({
|
||||
where: { id },
|
||||
data: { location, metadata, referencesToCreate },
|
||||
}: {
|
||||
@@ -527,7 +530,7 @@ export class BookingRepository {
|
||||
referencesToCreate: Prisma.BookingReferenceCreateInput[];
|
||||
};
|
||||
}) {
|
||||
await prisma.booking.update({
|
||||
await this.prismaClient.booking.update({
|
||||
where: {
|
||||
id,
|
||||
},
|
||||
@@ -541,13 +544,11 @@ export class BookingRepository {
|
||||
});
|
||||
}
|
||||
|
||||
static async getAllAcceptedTeamBookingsOfUser(params: TeamBookingsParamsWithCount): Promise<number>;
|
||||
async getAllAcceptedTeamBookingsOfUser(params: TeamBookingsParamsWithCount): Promise<number>;
|
||||
|
||||
static async getAllAcceptedTeamBookingsOfUser(
|
||||
params: TeamBookingsParamsWithoutCount
|
||||
): Promise<Array<Booking>>;
|
||||
async getAllAcceptedTeamBookingsOfUser(params: TeamBookingsParamsWithoutCount): Promise<Array<Booking>>;
|
||||
|
||||
static async getAllAcceptedTeamBookingsOfUser(params: TeamBookingsParamsBase) {
|
||||
async getAllAcceptedTeamBookingsOfUser(params: TeamBookingsParamsBase) {
|
||||
const { user, teamId, startDate, endDate, excludedUid, shouldReturnCount, includeManagedEvents } = params;
|
||||
|
||||
const baseWhere: Prisma.BookingWhereInput = {
|
||||
@@ -596,18 +597,18 @@ export class BookingRepository {
|
||||
};
|
||||
|
||||
if (shouldReturnCount) {
|
||||
const collectiveRoundRobinBookingsOwner = await prisma.booking.count({
|
||||
const collectiveRoundRobinBookingsOwner = await this.prismaClient.booking.count({
|
||||
where: whereCollectiveRoundRobinOwner,
|
||||
});
|
||||
|
||||
const collectiveRoundRobinBookingsAttendee = await prisma.booking.count({
|
||||
const collectiveRoundRobinBookingsAttendee = await this.prismaClient.booking.count({
|
||||
where: whereCollectiveRoundRobinBookingsAttendee,
|
||||
});
|
||||
|
||||
let managedBookings = 0;
|
||||
|
||||
if (includeManagedEvents) {
|
||||
managedBookings = await prisma.booking.count({
|
||||
managedBookings = await this.prismaClient.booking.count({
|
||||
where: whereManagedBookings,
|
||||
});
|
||||
}
|
||||
@@ -617,18 +618,18 @@ export class BookingRepository {
|
||||
|
||||
return totalNrOfBooking;
|
||||
}
|
||||
const collectiveRoundRobinBookingsOwner = await prisma.booking.findMany({
|
||||
const collectiveRoundRobinBookingsOwner = await this.prismaClient.booking.findMany({
|
||||
where: whereCollectiveRoundRobinOwner,
|
||||
});
|
||||
|
||||
const collectiveRoundRobinBookingsAttendee = await prisma.booking.findMany({
|
||||
const collectiveRoundRobinBookingsAttendee = await this.prismaClient.booking.findMany({
|
||||
where: whereCollectiveRoundRobinBookingsAttendee,
|
||||
});
|
||||
|
||||
let managedBookings: typeof collectiveRoundRobinBookingsAttendee = [];
|
||||
|
||||
if (includeManagedEvents) {
|
||||
managedBookings = await prisma.booking.findMany({
|
||||
managedBookings = await this.prismaClient.booking.findMany({
|
||||
where: whereManagedBookings,
|
||||
});
|
||||
}
|
||||
@@ -640,8 +641,8 @@ export class BookingRepository {
|
||||
];
|
||||
}
|
||||
|
||||
static async findOriginalRescheduledBooking(uid: string, seatsEventType?: boolean) {
|
||||
return await prisma.booking.findFirst({
|
||||
async findOriginalRescheduledBooking(uid: string, seatsEventType?: boolean) {
|
||||
return await this.prismaClient.booking.findFirst({
|
||||
where: {
|
||||
uid: uid,
|
||||
status: {
|
||||
@@ -693,15 +694,13 @@ export class BookingRepository {
|
||||
});
|
||||
}
|
||||
|
||||
static async getAllAcceptedTeamBookingsOfUsers(
|
||||
params: TeamBookingsMultipleUsersParamsWithCount
|
||||
): Promise<number>;
|
||||
async getAllAcceptedTeamBookingsOfUsers(params: TeamBookingsMultipleUsersParamsWithCount): Promise<number>;
|
||||
|
||||
static async getAllAcceptedTeamBookingsOfUsers(
|
||||
async getAllAcceptedTeamBookingsOfUsers(
|
||||
params: TeamBookingsMultipleUsersParamsWithoutCount
|
||||
): Promise<Array<Booking>>;
|
||||
|
||||
static async getAllAcceptedTeamBookingsOfUsers(params: TeamBookingsMultipleUsersParamsBase) {
|
||||
async getAllAcceptedTeamBookingsOfUsers(params: TeamBookingsMultipleUsersParamsBase) {
|
||||
const { users, teamId, startDate, endDate, excludedUid, shouldReturnCount, includeManagedEvents } =
|
||||
params;
|
||||
|
||||
@@ -760,18 +759,18 @@ export class BookingRepository {
|
||||
};
|
||||
|
||||
if (shouldReturnCount) {
|
||||
const collectiveRoundRobinBookingsOwner = await prisma.booking.count({
|
||||
const collectiveRoundRobinBookingsOwner = await this.prismaClient.booking.count({
|
||||
where: whereCollectiveRoundRobinOwner,
|
||||
});
|
||||
|
||||
const collectiveRoundRobinBookingsAttendee = await prisma.booking.count({
|
||||
const collectiveRoundRobinBookingsAttendee = await this.prismaClient.booking.count({
|
||||
where: whereCollectiveRoundRobinBookingsAttendee,
|
||||
});
|
||||
|
||||
let managedBookings = 0;
|
||||
|
||||
if (includeManagedEvents) {
|
||||
managedBookings = await prisma.booking.count({
|
||||
managedBookings = await this.prismaClient.booking.count({
|
||||
where: whereManagedBookings,
|
||||
});
|
||||
}
|
||||
@@ -782,18 +781,18 @@ export class BookingRepository {
|
||||
return totalNrOfBooking;
|
||||
}
|
||||
|
||||
const collectiveRoundRobinBookingsOwner = await prisma.booking.findMany({
|
||||
const collectiveRoundRobinBookingsOwner = await this.prismaClient.booking.findMany({
|
||||
where: whereCollectiveRoundRobinOwner,
|
||||
});
|
||||
|
||||
const collectiveRoundRobinBookingsAttendee = await prisma.booking.findMany({
|
||||
const collectiveRoundRobinBookingsAttendee = await this.prismaClient.booking.findMany({
|
||||
where: whereCollectiveRoundRobinBookingsAttendee,
|
||||
});
|
||||
|
||||
let managedBookings: typeof collectiveRoundRobinBookingsAttendee = [];
|
||||
|
||||
if (includeManagedEvents) {
|
||||
managedBookings = await prisma.booking.findMany({
|
||||
managedBookings = await this.prismaClient.booking.findMany({
|
||||
where: whereManagedBookings,
|
||||
});
|
||||
}
|
||||
@@ -805,7 +804,7 @@ export class BookingRepository {
|
||||
];
|
||||
}
|
||||
|
||||
static async getValidBookingFromEventTypeForAttendee({
|
||||
async getValidBookingFromEventTypeForAttendee({
|
||||
eventTypeId,
|
||||
bookerEmail,
|
||||
bookerPhoneNumber,
|
||||
@@ -818,7 +817,7 @@ export class BookingRepository {
|
||||
startTime: Date;
|
||||
filterForUnconfirmed?: boolean;
|
||||
}) {
|
||||
return await prisma.booking.findFirst({
|
||||
return await this.prismaClient.booking.findFirst({
|
||||
where: {
|
||||
eventTypeId,
|
||||
attendees: {
|
||||
|
||||
@@ -41,7 +41,7 @@ import { isRestrictionScheduleEnabled } from "@calcom/lib/restrictionSchedule";
|
||||
import { safeStringify } from "@calcom/lib/safeStringify";
|
||||
import { withReporting } from "@calcom/lib/sentryWrapper";
|
||||
import { getTotalBookingDuration } from "@calcom/lib/server/queries/booking";
|
||||
import { BookingRepository as BookingRepo } from "@calcom/lib/server/repository/booking";
|
||||
import { BookingRepository } from "@calcom/lib/server/repository/booking";
|
||||
import { EventTypeRepository } from "@calcom/lib/server/repository/eventType";
|
||||
import { RoutingFormResponseRepository } from "@calcom/lib/server/repository/formResponse";
|
||||
import type { PrismaOOORepository } from "@calcom/lib/server/repository/ooo";
|
||||
@@ -506,7 +506,8 @@ export class AvailableSlotsService {
|
||||
bookingLimits
|
||||
);
|
||||
|
||||
const bookings = await BookingRepo.getAllAcceptedTeamBookingsOfUsers({
|
||||
const bookingRepo = new BookingRepository(prisma);
|
||||
const bookings = await bookingRepo.getAllAcceptedTeamBookingsOfUsers({
|
||||
users,
|
||||
teamId,
|
||||
startDate: limitDateFrom.toDate(),
|
||||
@@ -708,8 +709,9 @@ export class AvailableSlotsService {
|
||||
const userIdAndEmailMap = new Map(usersWithCredentials.map((user) => [user.id, user.email]));
|
||||
const allUserIds = Array.from(userIdAndEmailMap.keys());
|
||||
|
||||
const bookingRepo = new BookingRepository(prisma);
|
||||
const [currentBookingsAllUsers, outOfOfficeDaysAllUsers] = await Promise.all([
|
||||
BookingRepo.findAllExistingBookingsForEventTypeBetween({
|
||||
bookingRepo.findAllExistingBookingsForEventTypeBetween({
|
||||
startDate: startTimeDate,
|
||||
endDate: endTimeDate,
|
||||
eventTypeId: eventType.id,
|
||||
|
||||
+3
-1
@@ -1,5 +1,6 @@
|
||||
import { roundRobinManualReassignment } from "@calcom/features/ee/round-robin/roundRobinManualReassignment";
|
||||
import { BookingRepository } from "@calcom/lib/server/repository/booking";
|
||||
import { prisma } from "@calcom/prisma";
|
||||
import type { TrpcSessionUser } from "@calcom/trpc/server/types";
|
||||
|
||||
import { TRPCError } from "@trpc/server";
|
||||
@@ -17,7 +18,8 @@ export const roundRobinManualReassignHandler = async ({ ctx, input }: RoundRobin
|
||||
const { bookingId, teamMemberId, reassignReason } = input;
|
||||
|
||||
// Check if user has access to change booking
|
||||
const isAllowed = await BookingRepository.doesUserIdHaveAccessToBooking({ userId: ctx.user.id, bookingId });
|
||||
const bookingRepo = new BookingRepository(prisma);
|
||||
const isAllowed = await bookingRepo.doesUserIdHaveAccessToBooking({ userId: ctx.user.id, bookingId });
|
||||
|
||||
if (!isAllowed) {
|
||||
throw new TRPCError({ code: "FORBIDDEN", message: "You do not have permission" });
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import { roundRobinReassignment } from "@calcom/features/ee/round-robin/roundRobinReassignment";
|
||||
import { BookingRepository } from "@calcom/lib/server/repository/booking";
|
||||
import { prisma } from "@calcom/prisma";
|
||||
import type { TrpcSessionUser } from "@calcom/trpc/server/types";
|
||||
|
||||
import { TRPCError } from "@trpc/server";
|
||||
@@ -17,7 +18,8 @@ export const roundRobinReassignHandler = async ({ ctx, input }: RoundRobinReassi
|
||||
const { bookingId } = input;
|
||||
|
||||
// Check if user has access to change booking
|
||||
const isAllowed = await BookingRepository.doesUserIdHaveAccessToBooking({ userId: ctx.user.id, bookingId });
|
||||
const bookingRepo = new BookingRepository(prisma);
|
||||
const isAllowed = await bookingRepo.doesUserIdHaveAccessToBooking({ userId: ctx.user.id, bookingId });
|
||||
|
||||
if (!isAllowed) {
|
||||
throw new TRPCError({ code: "FORBIDDEN", message: "You do not have permission" });
|
||||
|
||||
@@ -2519,7 +2519,7 @@ __metadata:
|
||||
"@axiomhq/winston": ^1.2.0
|
||||
"@calcom/platform-constants": "*"
|
||||
"@calcom/platform-enums": "*"
|
||||
"@calcom/platform-libraries": "npm:@calcom/platform-libraries@0.0.255"
|
||||
"@calcom/platform-libraries": "npm:@calcom/platform-libraries@0.0.256"
|
||||
"@calcom/platform-types": "*"
|
||||
"@calcom/platform-utils": "*"
|
||||
"@calcom/prisma": "*"
|
||||
@@ -3565,13 +3565,13 @@ __metadata:
|
||||
languageName: unknown
|
||||
linkType: soft
|
||||
|
||||
"@calcom/platform-libraries@npm:@calcom/platform-libraries@0.0.255":
|
||||
version: 0.0.255
|
||||
resolution: "@calcom/platform-libraries@npm:0.0.255"
|
||||
"@calcom/platform-libraries@npm:@calcom/platform-libraries@0.0.256":
|
||||
version: 0.0.256
|
||||
resolution: "@calcom/platform-libraries@npm:0.0.256"
|
||||
dependencies:
|
||||
"@calcom/features": "*"
|
||||
"@calcom/lib": "*"
|
||||
checksum: 50ec08f31a1a30fde270335f93065554ff93d74ab96d059262cec44f9efcae2036c2a7c26177cb3a1a2f708dabea4736b26110629ab08691e97a62f9d3464cd9
|
||||
checksum: 4c0b238ce803f7c660803bfcf4bc90435aef76a2efd1a476c10755a57e720354c739e88e3eaf44b176369750b211f81fc4a83f3eea452bac1d512bbf808a1085
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
|
||||
Reference in New Issue
Block a user