From 5d6ea4460de3d086615c48a1f54123a5c4895223 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Wed, 23 Jul 2025 15:59:18 +0000 Subject: [PATCH 01/17] refactor: rename SelectedSlotsRepository to PrismaSelectedSlotRepository - Rename class from SelectedSlotsRepository to PrismaSelectedSlotRepository for consistency - Update all imports and type references throughout the codebase - Update DI module bindings and variable names - Maintain type safety without breaking changes Co-Authored-By: alex@cal.com --- .../lib/services/available-slots.service.ts | 2 +- .../controllers/slots.controller.e2e-spec.ts | 6 ++-- ...am-event-type-slots.controller.e2e-spec.ts | 8 ++--- ...er-event-type-slots.controller.e2e-spec.ts | 30 +++++++++---------- packages/lib/di/modules/selectedSlots.ts | 4 +-- .../lib/server/repository/selectedSlots.ts | 2 +- packages/platform/libraries/repositories.ts | 2 +- .../viewer/slots/isAvailable.handler.ts | 4 +-- .../viewer/slots/reserveSlot.handler.ts | 4 +-- .../trpc/server/routers/viewer/slots/util.ts | 6 ++-- 10 files changed, 34 insertions(+), 34 deletions(-) diff --git a/apps/api/v2/src/lib/services/available-slots.service.ts b/apps/api/v2/src/lib/services/available-slots.service.ts index e091301001f6ae..7be3b2675cc00e 100644 --- a/apps/api/v2/src/lib/services/available-slots.service.ts +++ b/apps/api/v2/src/lib/services/available-slots.service.ts @@ -28,7 +28,7 @@ export class AvailableSlotsService extends BaseAvailableSlotsService { teamRepo: teamRepository, routingFormResponseRepo: routingFormResponseRepository, bookingRepo: bookingRepository, - selectedSlotsRepo: selectedSlotsRepository, + selectedSlotRepo: selectedSlotsRepository, eventTypeRepo: eventTypeRepository, userRepo: userRepository, }); diff --git a/apps/api/v2/src/modules/slots/slots-2024-04-15/controllers/slots.controller.e2e-spec.ts b/apps/api/v2/src/modules/slots/slots-2024-04-15/controllers/slots.controller.e2e-spec.ts index a32c0e9737029c..f8c8f898588361 100644 --- a/apps/api/v2/src/modules/slots/slots-2024-04-15/controllers/slots.controller.e2e-spec.ts +++ b/apps/api/v2/src/modules/slots/slots-2024-04-15/controllers/slots.controller.e2e-spec.ts @@ -250,7 +250,7 @@ describe("Slots 2024-04-15 Endpoints", () => { let userRepositoryFixture: UserRepositoryFixture; let schedulesService: SchedulesService_2024_06_11; let eventTypesRepositoryFixture: EventTypesRepositoryFixture; - let selectedSlotsRepositoryFixture: SelectedSlotsRepositoryFixture; + let selectedSlotRepositoryFixture: SelectedSlotsRepositoryFixture; let bookingsRepositoryFixture: BookingsRepositoryFixture; let bookingSeatsRepositoryFixture: BookingSeatRepositoryFixture; let attendeesRepositoryFixture: AttendeeRepositoryFixture; @@ -288,7 +288,7 @@ describe("Slots 2024-04-15 Endpoints", () => { userRepositoryFixture = new UserRepositoryFixture(moduleRef); schedulesService = moduleRef.get(SchedulesService_2024_06_11); eventTypesRepositoryFixture = new EventTypesRepositoryFixture(moduleRef); - selectedSlotsRepositoryFixture = new SelectedSlotsRepositoryFixture(moduleRef); + selectedSlotRepositoryFixture = new SelectedSlotsRepositoryFixture(moduleRef); bookingsRepositoryFixture = new BookingsRepositoryFixture(moduleRef); bookingSeatsRepositoryFixture = new BookingSeatRepositoryFixture(moduleRef); attendeesRepositoryFixture = new AttendeeRepositoryFixture(moduleRef); @@ -773,7 +773,7 @@ describe("Slots 2024-04-15 Endpoints", () => { afterAll(async () => { await userRepositoryFixture.deleteByEmail(user.email); - await selectedSlotsRepositoryFixture.deleteByUId(reservedSlotUid); + await selectedSlotRepositoryFixture.deleteByUId(reservedSlotUid); await bookingsRepositoryFixture.deleteAllBookings(user.id, user.email); await app.close(); diff --git a/apps/api/v2/src/modules/slots/slots-2024-09-04/controllers/e2e/team-event-type-slots.controller.e2e-spec.ts b/apps/api/v2/src/modules/slots/slots-2024-09-04/controllers/e2e/team-event-type-slots.controller.e2e-spec.ts index 1b4181f8b1abc0..cd234d344f92ac 100644 --- a/apps/api/v2/src/modules/slots/slots-2024-09-04/controllers/e2e/team-event-type-slots.controller.e2e-spec.ts +++ b/apps/api/v2/src/modules/slots/slots-2024-09-04/controllers/e2e/team-event-type-slots.controller.e2e-spec.ts @@ -44,7 +44,7 @@ describe("Slots 2024-09-04 Endpoints", () => { let membershipsRepositoryFixture: MembershipRepositoryFixture; let bookingsRepositoryFixture: BookingsRepositoryFixture; let apiKeysRepositoryFixture: ApiKeysRepositoryFixture; - let selectedSlotsRepositoryFixture: SelectedSlotsRepositoryFixture; + let selectedSlotRepositoryFixture: SelectedSlotsRepositoryFixture; const teammateEmailOne = `slots-2024-09-04-user-1-team-slots-${randomString()}`; let teammateApiKeyString: string; @@ -93,7 +93,7 @@ describe("Slots 2024-09-04 Endpoints", () => { membershipsRepositoryFixture = new MembershipRepositoryFixture(moduleRef); bookingsRepositoryFixture = new BookingsRepositoryFixture(moduleRef); apiKeysRepositoryFixture = new ApiKeysRepositoryFixture(moduleRef); - selectedSlotsRepositoryFixture = new SelectedSlotsRepositoryFixture(moduleRef); + selectedSlotRepositoryFixture = new SelectedSlotsRepositoryFixture(moduleRef); teammateOne = await userRepositoryFixture.create({ email: teammateEmailOne, @@ -368,14 +368,14 @@ describe("Slots 2024-09-04 Endpoints", () => { ); expect(slots).toEqual({ ...expectedSlotsUTC, "2050-09-05": expectedSlotsUTC2050_09_05 }); - const dbSlot = await selectedSlotsRepositoryFixture.getByUid(reservedSlot.reservationUid); + const dbSlot = await selectedSlotRepositoryFixture.getByUid(reservedSlot.reservationUid); expect(dbSlot).toBeDefined(); if (dbSlot) { const dbReleaseAt = DateTime.fromJSDate(dbSlot.releaseAt, { zone: "UTC" }).toISO(); const expectedReleaseAt = DateTime.fromISO(now, { zone: "UTC" }).plus({ minutes: 10 }).toISO(); expect(dbReleaseAt).toEqual(expectedReleaseAt); } - await selectedSlotsRepositoryFixture.deleteByUId(reservedSlot.reservationUid); + await selectedSlotRepositoryFixture.deleteByUId(reservedSlot.reservationUid); clear(); }); diff --git a/apps/api/v2/src/modules/slots/slots-2024-09-04/controllers/e2e/user-event-type-slots.controller.e2e-spec.ts b/apps/api/v2/src/modules/slots/slots-2024-09-04/controllers/e2e/user-event-type-slots.controller.e2e-spec.ts index 43cae7d6edf716..e4cae9054c304b 100644 --- a/apps/api/v2/src/modules/slots/slots-2024-09-04/controllers/e2e/user-event-type-slots.controller.e2e-spec.ts +++ b/apps/api/v2/src/modules/slots/slots-2024-09-04/controllers/e2e/user-event-type-slots.controller.e2e-spec.ts @@ -49,7 +49,7 @@ describe("Slots 2024-09-04 Endpoints", () => { let userRepositoryFixture: UserRepositoryFixture; let schedulesService: SchedulesService_2024_06_11; let eventTypesRepositoryFixture: EventTypesRepositoryFixture; - let selectedSlotsRepositoryFixture: SelectedSlotsRepositoryFixture; + let selectedSlotRepositoryFixture: SelectedSlotsRepositoryFixture; let bookingsRepositoryFixture: BookingsRepositoryFixture; let bookingSeatsRepositoryFixture: BookingSeatRepositoryFixture; let attendeesRepositoryFixture: AttendeeRepositoryFixture; @@ -104,7 +104,7 @@ describe("Slots 2024-09-04 Endpoints", () => { userRepositoryFixture = new UserRepositoryFixture(moduleRef); schedulesService = moduleRef.get(SchedulesService_2024_06_11); eventTypesRepositoryFixture = new EventTypesRepositoryFixture(moduleRef); - selectedSlotsRepositoryFixture = new SelectedSlotsRepositoryFixture(moduleRef); + selectedSlotRepositoryFixture = new SelectedSlotsRepositoryFixture(moduleRef); bookingsRepositoryFixture = new BookingsRepositoryFixture(moduleRef); bookingSeatsRepositoryFixture = new BookingSeatRepositoryFixture(moduleRef); attendeesRepositoryFixture = new AttendeeRepositoryFixture(moduleRef); @@ -483,7 +483,7 @@ describe("Slots 2024-09-04 Endpoints", () => { ); expect(slots).toEqual({ ...expectedSlotsUTC, "2050-09-05": expectedSlotsUTC2050_09_05 }); - const dbSlot = await selectedSlotsRepositoryFixture.getByUid(reservedSlot.reservationUid); + const dbSlot = await selectedSlotRepositoryFixture.getByUid(reservedSlot.reservationUid); expect(dbSlot).toBeDefined(); if (dbSlot) { const dbReleaseAt = DateTime.fromJSDate(dbSlot.releaseAt, { zone: "UTC" }).toISO(); @@ -617,7 +617,7 @@ describe("Slots 2024-09-04 Endpoints", () => { ); expect(slots).toEqual({ ...expectedSlotsUTC, "2050-09-05": expectedSlotsUTC2050_09_05 }); - const dbSlot = await selectedSlotsRepositoryFixture.getByUid(reservedSlot.reservationUid); + const dbSlot = await selectedSlotRepositoryFixture.getByUid(reservedSlot.reservationUid); expect(dbSlot).toBeDefined(); if (dbSlot) { const dbReleaseAt = DateTime.fromJSDate(dbSlot.releaseAt, { zone: "UTC" }).toISO(); @@ -719,14 +719,14 @@ describe("Slots 2024-09-04 Endpoints", () => { ); expect(slots).toEqual({ ...expectedSlotsUTC, "2050-09-05": expectedSlotsUTC2050_09_05 }); - const dbSlot = await selectedSlotsRepositoryFixture.getByUid(reservedSlot.reservationUid); + const dbSlot = await selectedSlotRepositoryFixture.getByUid(reservedSlot.reservationUid); expect(dbSlot).toBeDefined(); if (dbSlot) { const dbReleaseAt = DateTime.fromJSDate(dbSlot.releaseAt, { zone: "UTC" }).toISO(); const expectedReleaseAt = DateTime.fromISO(now, { zone: "UTC" }).plus({ minutes: 10 }).toISO(); expect(dbReleaseAt).toEqual(expectedReleaseAt); } - await selectedSlotsRepositoryFixture.deleteByUId(reservedSlot.reservationUid); + await selectedSlotRepositoryFixture.deleteByUId(reservedSlot.reservationUid); clear(); }); @@ -775,14 +775,14 @@ describe("Slots 2024-09-04 Endpoints", () => { ); expect(slots).toEqual({ ...expectedSlotsUTC, "2050-09-05": expectedSlotsUTC2050_09_05 }); - const dbSlot = await selectedSlotsRepositoryFixture.getByUid(reservedSlot.reservationUid); + const dbSlot = await selectedSlotRepositoryFixture.getByUid(reservedSlot.reservationUid); expect(dbSlot).toBeDefined(); if (dbSlot) { const dbReleaseAt = DateTime.fromJSDate(dbSlot.releaseAt, { zone: "UTC" }).toISO(); const expectedReleaseAt = DateTime.fromISO(now, { zone: "UTC" }).plus({ minutes: 10 }).toISO(); expect(dbReleaseAt).toEqual(expectedReleaseAt); } - await selectedSlotsRepositoryFixture.deleteByUId(reservedSlot.reservationUid); + await selectedSlotRepositoryFixture.deleteByUId(reservedSlot.reservationUid); clear(); }); @@ -1397,7 +1397,7 @@ describe("Slots 2024-09-04 Endpoints", () => { ); expect(slots).toEqual({ ...expectedSlotsUTC, "2050-09-05": expectedSlotsUTC2050_09_05 }); - const dbSlot = await selectedSlotsRepositoryFixture.getByUid( + const dbSlot = await selectedSlotRepositoryFixture.getByUid( responseReservedVariableSlot.reservationUid ); expect(dbSlot).toBeDefined(); @@ -1674,7 +1674,7 @@ describe("Slots 2024-09-04 Endpoints", () => { ); expect(responseReservedSlot.reservationDuration).toEqual(5); await bookingsRepositoryFixture.deleteById(booking.id); - await selectedSlotsRepositoryFixture.deleteByUId(responseReservedSlot.reservationUid); + await selectedSlotRepositoryFixture.deleteByUId(responseReservedSlot.reservationUid); }); it("should be able to reserve a slot if booking is rejected during that time", async () => { @@ -1872,7 +1872,7 @@ describe("Slots 2024-09-04 Endpoints", () => { expect(reserveResponse.body.data.reservationUid).toBeDefined(); - await selectedSlotsRepositoryFixture.deleteByUId(reserveResponse.body.data.reservationUid); + await selectedSlotRepositoryFixture.deleteByUId(reserveResponse.body.data.reservationUid); await bookingsRepositoryFixture.deleteById(existingBooking.id); }); @@ -1888,7 +1888,7 @@ describe("Slots 2024-09-04 Endpoints", () => { expect(reserveResponse.body.data.reservationUid).toBeDefined(); - await selectedSlotsRepositoryFixture.deleteByUId(reserveResponse.body.data.reservationUid); + await selectedSlotRepositoryFixture.deleteByUId(reserveResponse.body.data.reservationUid); await bookingsRepositoryFixture.deleteById(existingBooking.id); }); @@ -1903,7 +1903,7 @@ describe("Slots 2024-09-04 Endpoints", () => { .expect(201); expect(reserveResponse.body.data.reservationUid).toBeDefined(); - await selectedSlotsRepositoryFixture.deleteByUId(reserveResponse.body.data.reservationUid); + await selectedSlotRepositoryFixture.deleteByUId(reserveResponse.body.data.reservationUid); await bookingsRepositoryFixture.deleteById(existingBooking.id); }); @@ -1918,7 +1918,7 @@ describe("Slots 2024-09-04 Endpoints", () => { .expect(201); expect(reserveResponse.body.data.reservationUid).toBeDefined(); - await selectedSlotsRepositoryFixture.deleteByUId(reserveResponse.body.data.reservationUid); + await selectedSlotRepositoryFixture.deleteByUId(reserveResponse.body.data.reservationUid); await bookingsRepositoryFixture.deleteById(existingBooking.id); }); }); @@ -1928,7 +1928,7 @@ describe("Slots 2024-09-04 Endpoints", () => { await userRepositoryFixture.deleteByEmail(user.email); await userRepositoryFixture.deleteByEmail(oooTestUserEmail); await userRepositoryFixture.deleteByEmail(unrelatedUser.email); - await selectedSlotsRepositoryFixture.deleteByUId(reservedSlot.reservationUid); + await selectedSlotRepositoryFixture.deleteByUId(reservedSlot.reservationUid); await bookingsRepositoryFixture.deleteAllBookings(user.id, user.email); await teamRepositoryFixture.delete(team.id); clear(); diff --git a/packages/lib/di/modules/selectedSlots.ts b/packages/lib/di/modules/selectedSlots.ts index ea88af1876677b..06d722b884dd5c 100644 --- a/packages/lib/di/modules/selectedSlots.ts +++ b/packages/lib/di/modules/selectedSlots.ts @@ -1,9 +1,9 @@ import { createModule } from "@evyweb/ioctopus"; import { DI_TOKENS } from "@calcom/lib/di/tokens"; -import { SelectedSlotsRepository } from "@calcom/lib/server/repository/selectedSlots"; +import { PrismaSelectedSlotRepository } from "@calcom/lib/server/repository/selectedSlots"; export const selectedSlotsRepositoryModule = createModule(); selectedSlotsRepositoryModule .bind(DI_TOKENS.SELECTED_SLOTS_REPOSITORY) - .toClass(SelectedSlotsRepository, [DI_TOKENS.PRISMA_CLIENT]); + .toClass(PrismaSelectedSlotRepository, [DI_TOKENS.PRISMA_CLIENT]); diff --git a/packages/lib/server/repository/selectedSlots.ts b/packages/lib/server/repository/selectedSlots.ts index f86873f48d4779..0ad2ee8304c0d5 100644 --- a/packages/lib/server/repository/selectedSlots.ts +++ b/packages/lib/server/repository/selectedSlots.ts @@ -22,7 +22,7 @@ export type TimeSlot = { utcEndIso: string; }; -export class SelectedSlotsRepository { +export class PrismaSelectedSlotRepository { constructor(private prismaClient: PrismaClient) {} async findMany({ where, select }: FindManyArgs) { diff --git a/packages/platform/libraries/repositories.ts b/packages/platform/libraries/repositories.ts index 6f0d11fe44fec1..520613b261b319 100644 --- a/packages/platform/libraries/repositories.ts +++ b/packages/platform/libraries/repositories.ts @@ -3,6 +3,6 @@ export { ScheduleRepository as PrismaScheduleRepository } from "@calcom/lib/serv export { BookingRepository as PrismaBookingRepository } from "@calcom/lib/server/repository/booking"; export { EventTypeRepository as PrismaEventTypeRepository } from "@calcom/lib/server/repository/eventTypeRepository"; export { RoutingFormResponseRepository as PrismaRoutingFormResponseRepository } from "@calcom/lib/server/repository/formResponse"; -export { SelectedSlotsRepository as PrismaSelectedSlotsRepository } from "@calcom/lib/server/repository/selectedSlots"; +export { PrismaSelectedSlotRepository as PrismaSelectedSlotsRepository } from "@calcom/lib/server/repository/selectedSlots"; export { TeamRepository as PrismaTeamRepository } from "@calcom/lib/server/repository/team"; export { UserRepository as PrismaUserRepository } from "@calcom/lib/server/repository/user"; diff --git a/packages/trpc/server/routers/viewer/slots/isAvailable.handler.ts b/packages/trpc/server/routers/viewer/slots/isAvailable.handler.ts index 0e5ddfb52aa7f1..98ca85b9810bd2 100644 --- a/packages/trpc/server/routers/viewer/slots/isAvailable.handler.ts +++ b/packages/trpc/server/routers/viewer/slots/isAvailable.handler.ts @@ -3,7 +3,7 @@ import type { NextApiRequest } from "next"; import { HttpError } from "@calcom/lib/http-error"; import { getPastTimeAndMinimumBookingNoticeBoundsStatus } from "@calcom/lib/isOutOfBounds"; import { EventTypeRepository } from "@calcom/lib/server/repository/eventTypeRepository"; -import { SelectedSlotsRepository } from "@calcom/lib/server/repository/selectedSlots"; +import { PrismaSelectedSlotRepository } from "@calcom/lib/server/repository/selectedSlots"; import type { PrismaClient } from "@calcom/prisma"; import type { TIsAvailableInputSchema, TIsAvailableOutputSchema } from "./isAvailable.schema"; @@ -41,7 +41,7 @@ export const isAvailableHandler = async ({ // Check each slot's availability // Without uid, we must not check for reserved slots because if uuid isn't set in cookie yet, but it is going to be through reserveSlot request soon, we could consider the slot as reserved accidentally. - const slotsRepo = new SelectedSlotsRepository(ctx.prisma); + const slotsRepo = new PrismaSelectedSlotRepository(ctx.prisma); const reservedSlots = uid ? await slotsRepo.findManyReservedByOthers(slots, eventTypeId, uid) : []; // Map all slots to their availability status diff --git a/packages/trpc/server/routers/viewer/slots/reserveSlot.handler.ts b/packages/trpc/server/routers/viewer/slots/reserveSlot.handler.ts index 7b9c4d8d4e87a2..e24fd712a4f520 100644 --- a/packages/trpc/server/routers/viewer/slots/reserveSlot.handler.ts +++ b/packages/trpc/server/routers/viewer/slots/reserveSlot.handler.ts @@ -5,7 +5,7 @@ import { v4 as uuid } from "uuid"; import dayjs from "@calcom/dayjs"; import { WEBAPP_URL } from "@calcom/lib/constants"; import { MINUTES_TO_BOOK } from "@calcom/lib/constants"; -import { SelectedSlotsRepository } from "@calcom/lib/server/repository/selectedSlots"; +import { PrismaSelectedSlotRepository } from "@calcom/lib/server/repository/selectedSlots"; import type { PrismaClient } from "@calcom/prisma"; import { BookingStatus } from "@calcom/prisma/enums"; @@ -64,7 +64,7 @@ export const reserveSlotHandler = async ({ ctx, input }: ReserveSlotOptions) => } // Check for existing reservations for the same slot - const slotsRepo = new SelectedSlotsRepository(prisma); + const slotsRepo = new PrismaSelectedSlotRepository(prisma); const reservedBySomeoneElse = await slotsRepo.findReservedByOthers({ slot: { utcStartIso: slotUtcStartDate, diff --git a/packages/trpc/server/routers/viewer/slots/util.ts b/packages/trpc/server/routers/viewer/slots/util.ts index a8d4b3d64b3606..91dd799e9a94c0 100644 --- a/packages/trpc/server/routers/viewer/slots/util.ts +++ b/packages/trpc/server/routers/viewer/slots/util.ts @@ -47,7 +47,7 @@ import type { EventTypeRepository } from "@calcom/lib/server/repository/eventTyp import type { RoutingFormResponseRepository } from "@calcom/lib/server/repository/formResponse"; import type { PrismaOOORepository } from "@calcom/lib/server/repository/ooo"; import type { ScheduleRepository } from "@calcom/lib/server/repository/schedule"; -import type { SelectedSlotsRepository } from "@calcom/lib/server/repository/selectedSlots"; +import type { PrismaSelectedSlotRepository } from "@calcom/lib/server/repository/selectedSlots"; import type { TeamRepository } from "@calcom/lib/server/repository/team"; import type { UserRepository } from "@calcom/lib/server/repository/user"; import { withSelectedCalendars } from "@calcom/lib/server/repository/user"; @@ -93,7 +93,7 @@ export type GetAvailableSlotsResponse = Awaited< export interface IAvailableSlotsService { oooRepo: PrismaOOORepository; scheduleRepo: ScheduleRepository; - selectedSlotsRepo: SelectedSlotsRepository; + selectedSlotRepo: PrismaSelectedSlotRepository; teamRepo: TeamRepository; userRepo: UserRepository; bookingRepo: BookingRepository; @@ -114,7 +114,7 @@ export class AvailableSlotsService { eventTypeId: number; }) { const currentTimeInUtc = dayjs.utc().format(); - const slotsRepo = this.dependencies.selectedSlotsRepo; + const slotsRepo = this.dependencies.selectedSlotRepo; const unexpiredSelectedSlots = (await slotsRepo.findManyUnexpiredSlots({ From b042101f6bf0f660d992f268e211bf8b00a3f02a Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Wed, 23 Jul 2025 16:00:16 +0000 Subject: [PATCH 02/17] refactor: complete PrismaSelectedSlotRepository rename - Update DI module binding property name from selectedSlotsRepo to selectedSlotRepo - Update test mock to use PrismaSelectedSlotRepository class name - Ensure all references are consistently updated Co-Authored-By: alex@cal.com --- packages/lib/di/modules/available-slots.ts | 2 +- .../server/routers/viewer/slots/reserveSlot.handler.test.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/lib/di/modules/available-slots.ts b/packages/lib/di/modules/available-slots.ts index c3f663b8650ee6..ea26b2238b29af 100644 --- a/packages/lib/di/modules/available-slots.ts +++ b/packages/lib/di/modules/available-slots.ts @@ -9,7 +9,7 @@ export const availableSlotsModule = createModule(); availableSlotsModule.bind(DI_TOKENS.AVAILABLE_SLOTS_SERVICE).toClass(AvailableSlotsService, { oooRepo: DI_TOKENS.OOO_REPOSITORY, scheduleRepo: DI_TOKENS.SCHEDULE_REPOSITORY, - selectedSlotsRepo: DI_TOKENS.SELECTED_SLOTS_REPOSITORY, + selectedSlotRepo: DI_TOKENS.SELECTED_SLOTS_REPOSITORY, teamRepo: DI_TOKENS.TEAM_REPOSITORY, userRepo: DI_TOKENS.USER_REPOSITORY, bookingRepo: DI_TOKENS.BOOKING_REPOSITORY, diff --git a/packages/trpc/server/routers/viewer/slots/reserveSlot.handler.test.ts b/packages/trpc/server/routers/viewer/slots/reserveSlot.handler.test.ts index b2a006f97aa4bc..d89715a35a2732 100644 --- a/packages/trpc/server/routers/viewer/slots/reserveSlot.handler.test.ts +++ b/packages/trpc/server/routers/viewer/slots/reserveSlot.handler.test.ts @@ -5,7 +5,7 @@ import { vi, describe, it, expect, afterEach } from "vitest"; // reserveSlotHandler relies on WEBAPP_URL being evaluated at import time, so we need to reset modules // between tests after tweaking process.env to simulate different deployment environments. // -// The handler also calls into Prisma and the SelectedSlotsRepository, so we stub those parts out. +// The handler also calls into Prisma and the SelectedSlotRepository, so we stub those parts out. // We alias the module path once we know WEBAPP_URL has been configured. const dynamicImportHandler = async () => await import("./reserveSlot.handler"); @@ -13,7 +13,7 @@ const dynamicImportHandler = async () => await import("./reserveSlot.handler"); // The repository instance method is used to check for an existing reservation by someone else. // To keep this unit test isolated from the database layer, we stub this to always resolve falsey. vi.mock("@calcom/lib/server/repository/selectedSlots", () => ({ - SelectedSlotsRepository: vi.fn().mockImplementation(() => ({ + PrismaSelectedSlotRepository: vi.fn().mockImplementation(() => ({ findReservedByOthers: vi.fn().mockResolvedValue(null), })), })); From 7bc3b90a0933a66e67001473957bf37732c84420 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Wed, 23 Jul 2025 16:25:01 +0000 Subject: [PATCH 03/17] fix: rename file to prismaSelectedSlotRepository.ts and fix plural variable references - Rename apps/api/v2/src/lib/repositories/prisma-selected-slots.repository.ts to prismaSelectedSlotRepository.ts - Update class name from PrismaSelectedSlotsRepository to PrismaSelectedSlotRepository - Fix plural variable reference selectedSlotsRepository to selectedSlotRepository in service - Update all import paths to reference the new file name - Maintain consistency with camelCase naming convention Co-Authored-By: alex@cal.com --- apps/api/v2/src/lib/modules/available-slots.module.ts | 4 ++-- ...-slots.repository.ts => prismaSelectedSlotRepository.ts} | 2 +- apps/api/v2/src/lib/services/available-slots.service.ts | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) rename apps/api/v2/src/lib/repositories/{prisma-selected-slots.repository.ts => prismaSelectedSlotRepository.ts} (83%) diff --git a/apps/api/v2/src/lib/modules/available-slots.module.ts b/apps/api/v2/src/lib/modules/available-slots.module.ts index 5be48dcf441a36..c5d9e73b6742ac 100644 --- a/apps/api/v2/src/lib/modules/available-slots.module.ts +++ b/apps/api/v2/src/lib/modules/available-slots.module.ts @@ -3,9 +3,9 @@ import { PrismaEventTypeRepository } from "@/lib/repositories/prisma-event-type. import { PrismaOOORepository } from "@/lib/repositories/prisma-ooo.repository"; import { PrismaRoutingFormResponseRepository } from "@/lib/repositories/prisma-routing-form-response.repository"; import { PrismaScheduleRepository } from "@/lib/repositories/prisma-schedule.repository"; -import { PrismaSelectedSlotsRepository } from "@/lib/repositories/prisma-selected-slots.repository"; import { PrismaTeamRepository } from "@/lib/repositories/prisma-team.repository"; import { PrismaUserRepository } from "@/lib/repositories/prisma-user.repository"; +import { PrismaSelectedSlotRepository } from "@/lib/repositories/prismaSelectedSlotRepository"; import { AvailableSlotsService } from "@/lib/services/available-slots.service"; import { PrismaModule } from "@/modules/prisma/prisma.module"; import { Module } from "@nestjs/common"; @@ -16,7 +16,7 @@ import { Module } from "@nestjs/common"; PrismaOOORepository, PrismaScheduleRepository, PrismaBookingRepository, - PrismaSelectedSlotsRepository, + PrismaSelectedSlotRepository, PrismaUserRepository, PrismaEventTypeRepository, PrismaRoutingFormResponseRepository, diff --git a/apps/api/v2/src/lib/repositories/prisma-selected-slots.repository.ts b/apps/api/v2/src/lib/repositories/prismaSelectedSlotRepository.ts similarity index 83% rename from apps/api/v2/src/lib/repositories/prisma-selected-slots.repository.ts rename to apps/api/v2/src/lib/repositories/prismaSelectedSlotRepository.ts index bbc92a3b2cfb00..ec51d39218f6ad 100644 --- a/apps/api/v2/src/lib/repositories/prisma-selected-slots.repository.ts +++ b/apps/api/v2/src/lib/repositories/prismaSelectedSlotRepository.ts @@ -5,7 +5,7 @@ import { PrismaSelectedSlotsRepository as PrismaSelectedSlotsRepositoryLib } fro import { PrismaClient } from "@calcom/prisma"; @Injectable() -export class PrismaSelectedSlotsRepository extends PrismaSelectedSlotsRepositoryLib { +export class PrismaSelectedSlotRepository extends PrismaSelectedSlotsRepositoryLib { constructor(private readonly dbWrite: PrismaWriteService) { super(dbWrite.prisma as unknown as PrismaClient); } diff --git a/apps/api/v2/src/lib/services/available-slots.service.ts b/apps/api/v2/src/lib/services/available-slots.service.ts index 7be3b2675cc00e..92df27e7505cd4 100644 --- a/apps/api/v2/src/lib/services/available-slots.service.ts +++ b/apps/api/v2/src/lib/services/available-slots.service.ts @@ -3,9 +3,9 @@ import { PrismaEventTypeRepository } from "@/lib/repositories/prisma-event-type. import { PrismaOOORepository } from "@/lib/repositories/prisma-ooo.repository"; import { PrismaRoutingFormResponseRepository } from "@/lib/repositories/prisma-routing-form-response.repository"; import { PrismaScheduleRepository } from "@/lib/repositories/prisma-schedule.repository"; -import { PrismaSelectedSlotsRepository } from "@/lib/repositories/prisma-selected-slots.repository"; import { PrismaTeamRepository } from "@/lib/repositories/prisma-team.repository"; import { PrismaUserRepository } from "@/lib/repositories/prisma-user.repository"; +import { PrismaSelectedSlotRepository } from "@/lib/repositories/prismaSelectedSlotRepository"; import { Injectable } from "@nestjs/common"; import { AvailableSlotsService as BaseAvailableSlotsService } from "@calcom/platform-libraries/slots"; @@ -18,7 +18,7 @@ export class AvailableSlotsService extends BaseAvailableSlotsService { private readonly teamRepository: PrismaTeamRepository, private readonly routingFormResponseRepository: PrismaRoutingFormResponseRepository, private readonly bookingRepository: PrismaBookingRepository, - private readonly selectedSlotsRepository: PrismaSelectedSlotsRepository, + private readonly selectedSlotRepository: PrismaSelectedSlotRepository, private readonly eventTypeRepository: PrismaEventTypeRepository, private readonly userRepository: PrismaUserRepository ) { @@ -28,7 +28,7 @@ export class AvailableSlotsService extends BaseAvailableSlotsService { teamRepo: teamRepository, routingFormResponseRepo: routingFormResponseRepository, bookingRepo: bookingRepository, - selectedSlotRepo: selectedSlotsRepository, + selectedSlotRepo: selectedSlotRepository, eventTypeRepo: eventTypeRepository, userRepo: userRepository, }); From 44ddbdfc1e3d79b8d3ebdcd7f4b2398bc6284887 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Wed, 23 Jul 2025 17:27:56 +0000 Subject: [PATCH 04/17] fix: rename SelectedSlotsRepositoryFixture to SelectedSlotRepositoryFixture for consistency - Rename test fixture class from SelectedSlotsRepositoryFixture to SelectedSlotRepositoryFixture (singular) - Update all import statements in test files to use the renamed class - Resolves naming mismatch between fixture class and variable declarations - Fixes TypeScript compilation errors in CI tests Co-Authored-By: alex@cal.com --- .../controllers/slots.controller.e2e-spec.ts | 2 +- .../e2e/team-event-type-slots.controller.e2e-spec.ts | 2 +- .../e2e/user-event-type-slots.controller.e2e-spec.ts | 6 +++--- .../repository/selected-slots.repository.fixture.ts | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/api/v2/src/modules/slots/slots-2024-04-15/controllers/slots.controller.e2e-spec.ts b/apps/api/v2/src/modules/slots/slots-2024-04-15/controllers/slots.controller.e2e-spec.ts index f8c8f898588361..ef0b8b6c1396fa 100644 --- a/apps/api/v2/src/modules/slots/slots-2024-04-15/controllers/slots.controller.e2e-spec.ts +++ b/apps/api/v2/src/modules/slots/slots-2024-04-15/controllers/slots.controller.e2e-spec.ts @@ -16,7 +16,7 @@ import { AttendeeRepositoryFixture } from "test/fixtures/repository/attendee.rep import { BookingSeatRepositoryFixture } from "test/fixtures/repository/booking-seat.repository.fixture"; import { BookingsRepositoryFixture } from "test/fixtures/repository/bookings.repository.fixture"; import { EventTypesRepositoryFixture } from "test/fixtures/repository/event-types.repository.fixture"; -import { SelectedSlotsRepositoryFixture } from "test/fixtures/repository/selected-slots.repository.fixture"; +import { SelectedSlotRepositoryFixture } from "test/fixtures/repository/selected-slots.repository.fixture"; import { UserRepositoryFixture } from "test/fixtures/repository/users.repository.fixture"; import { randomString } from "test/utils/randomString"; import { withApiAuth } from "test/utils/withApiAuth"; diff --git a/apps/api/v2/src/modules/slots/slots-2024-09-04/controllers/e2e/team-event-type-slots.controller.e2e-spec.ts b/apps/api/v2/src/modules/slots/slots-2024-09-04/controllers/e2e/team-event-type-slots.controller.e2e-spec.ts index cd234d344f92ac..0bcd5045d79ec8 100644 --- a/apps/api/v2/src/modules/slots/slots-2024-09-04/controllers/e2e/team-event-type-slots.controller.e2e-spec.ts +++ b/apps/api/v2/src/modules/slots/slots-2024-09-04/controllers/e2e/team-event-type-slots.controller.e2e-spec.ts @@ -21,7 +21,7 @@ import { ApiKeysRepositoryFixture } from "test/fixtures/repository/api-keys.repo import { BookingsRepositoryFixture } from "test/fixtures/repository/bookings.repository.fixture"; import { EventTypesRepositoryFixture } from "test/fixtures/repository/event-types.repository.fixture"; import { MembershipRepositoryFixture } from "test/fixtures/repository/membership.repository.fixture"; -import { SelectedSlotsRepositoryFixture } from "test/fixtures/repository/selected-slots.repository.fixture"; +import { SelectedSlotRepositoryFixture } from "test/fixtures/repository/selected-slots.repository.fixture"; import { TeamRepositoryFixture } from "test/fixtures/repository/team.repository.fixture"; import { UserRepositoryFixture } from "test/fixtures/repository/users.repository.fixture"; import { randomString } from "test/utils/randomString"; diff --git a/apps/api/v2/src/modules/slots/slots-2024-09-04/controllers/e2e/user-event-type-slots.controller.e2e-spec.ts b/apps/api/v2/src/modules/slots/slots-2024-09-04/controllers/e2e/user-event-type-slots.controller.e2e-spec.ts index e4cae9054c304b..f4e8998082a5d8 100644 --- a/apps/api/v2/src/modules/slots/slots-2024-09-04/controllers/e2e/user-event-type-slots.controller.e2e-spec.ts +++ b/apps/api/v2/src/modules/slots/slots-2024-09-04/controllers/e2e/user-event-type-slots.controller.e2e-spec.ts @@ -30,7 +30,7 @@ import { BookingsRepositoryFixture } from "test/fixtures/repository/bookings.rep import { EventTypesRepositoryFixture } from "test/fixtures/repository/event-types.repository.fixture"; import { MembershipRepositoryFixture } from "test/fixtures/repository/membership.repository.fixture"; import { OOORepositoryFixture } from "test/fixtures/repository/ooo.repository.fixture"; -import { SelectedSlotsRepositoryFixture } from "test/fixtures/repository/selected-slots.repository.fixture"; +import { SelectedSlotRepositoryFixture } from "test/fixtures/repository/selected-slots.repository.fixture"; import { TeamRepositoryFixture } from "test/fixtures/repository/team.repository.fixture"; import { UserRepositoryFixture } from "test/fixtures/repository/users.repository.fixture"; import { randomString } from "test/utils/randomString"; @@ -49,7 +49,7 @@ describe("Slots 2024-09-04 Endpoints", () => { let userRepositoryFixture: UserRepositoryFixture; let schedulesService: SchedulesService_2024_06_11; let eventTypesRepositoryFixture: EventTypesRepositoryFixture; - let selectedSlotRepositoryFixture: SelectedSlotsRepositoryFixture; + let selectedSlotRepositoryFixture: SelectedSlotRepositoryFixture; let bookingsRepositoryFixture: BookingsRepositoryFixture; let bookingSeatsRepositoryFixture: BookingSeatRepositoryFixture; let attendeesRepositoryFixture: AttendeeRepositoryFixture; @@ -104,7 +104,7 @@ describe("Slots 2024-09-04 Endpoints", () => { userRepositoryFixture = new UserRepositoryFixture(moduleRef); schedulesService = moduleRef.get(SchedulesService_2024_06_11); eventTypesRepositoryFixture = new EventTypesRepositoryFixture(moduleRef); - selectedSlotRepositoryFixture = new SelectedSlotsRepositoryFixture(moduleRef); + selectedSlotRepositoryFixture = new SelectedSlotRepositoryFixture(moduleRef); bookingsRepositoryFixture = new BookingsRepositoryFixture(moduleRef); bookingSeatsRepositoryFixture = new BookingSeatRepositoryFixture(moduleRef); attendeesRepositoryFixture = new AttendeeRepositoryFixture(moduleRef); diff --git a/apps/api/v2/test/fixtures/repository/selected-slots.repository.fixture.ts b/apps/api/v2/test/fixtures/repository/selected-slots.repository.fixture.ts index e894935d39ea30..ab75a943f67f05 100644 --- a/apps/api/v2/test/fixtures/repository/selected-slots.repository.fixture.ts +++ b/apps/api/v2/test/fixtures/repository/selected-slots.repository.fixture.ts @@ -3,7 +3,7 @@ import { PrismaWriteService } from "@/modules/prisma/prisma-write.service"; import { TestingModule } from "@nestjs/testing"; import { SelectedSlots } from "@prisma/client"; -export class SelectedSlotsRepositoryFixture { +export class SelectedSlotRepositoryFixture { private prismaReadClient: PrismaReadService["prisma"]; private prismaWriteClient: PrismaWriteService["prisma"]; From bc611a4f2a1171be16a8753893d7a3caa4c3b5a8 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Wed, 23 Jul 2025 18:16:01 +0000 Subject: [PATCH 05/17] feat: add SelectedSlotRepositoryInterface and update DI to use interface Co-Authored-By: alex@cal.com --- .../lib/services/available-slots.service.ts | 4 +- .../lib/server/repository/selectedSlots.ts | 40 +++++++++++++++---- .../trpc/server/routers/viewer/slots/util.ts | 4 +- 3 files changed, 37 insertions(+), 11 deletions(-) diff --git a/apps/api/v2/src/lib/services/available-slots.service.ts b/apps/api/v2/src/lib/services/available-slots.service.ts index 92df27e7505cd4..5a7f1e72e627a6 100644 --- a/apps/api/v2/src/lib/services/available-slots.service.ts +++ b/apps/api/v2/src/lib/services/available-slots.service.ts @@ -5,9 +5,9 @@ import { PrismaRoutingFormResponseRepository } from "@/lib/repositories/prisma-r import { PrismaScheduleRepository } from "@/lib/repositories/prisma-schedule.repository"; import { PrismaTeamRepository } from "@/lib/repositories/prisma-team.repository"; import { PrismaUserRepository } from "@/lib/repositories/prisma-user.repository"; -import { PrismaSelectedSlotRepository } from "@/lib/repositories/prismaSelectedSlotRepository"; import { Injectable } from "@nestjs/common"; +import { SelectedSlotRepositoryInterface } from "@calcom/lib/server/repository/selectedSlots"; import { AvailableSlotsService as BaseAvailableSlotsService } from "@calcom/platform-libraries/slots"; @Injectable() @@ -18,7 +18,7 @@ export class AvailableSlotsService extends BaseAvailableSlotsService { private readonly teamRepository: PrismaTeamRepository, private readonly routingFormResponseRepository: PrismaRoutingFormResponseRepository, private readonly bookingRepository: PrismaBookingRepository, - private readonly selectedSlotRepository: PrismaSelectedSlotRepository, + private readonly selectedSlotRepository: SelectedSlotRepositoryInterface, private readonly eventTypeRepository: PrismaEventTypeRepository, private readonly userRepository: PrismaUserRepository ) { diff --git a/packages/lib/server/repository/selectedSlots.ts b/packages/lib/server/repository/selectedSlots.ts index 0ad2ee8304c0d5..8ff26540a70b88 100644 --- a/packages/lib/server/repository/selectedSlots.ts +++ b/packages/lib/server/repository/selectedSlots.ts @@ -1,5 +1,3 @@ -import type { Prisma } from "@prisma/client"; - import type { PrismaClient } from "@calcom/prisma"; type WhereCondition = { @@ -14,7 +12,7 @@ export type FindManyArgs = { where?: WhereCondition & { OR?: WhereCondition[]; }; - select?: Prisma.SelectedSlotsSelect; + select?: any; }; export type TimeSlot = { @@ -22,14 +20,42 @@ export type TimeSlot = { utcEndIso: string; }; -export class PrismaSelectedSlotRepository { +export interface SelectedSlotRepositoryInterface { + findMany(args: any): Promise; + findFirst(args: any): Promise; + findReservedByOthers(args: { slot: TimeSlot; eventTypeId: number; uid: string }): Promise; + findManyReservedByOthers( + slots: TimeSlot[], + eventTypeId: number, + uid: string + ): Promise< + Array<{ + slotUtcStartDate: Date; + slotUtcEndDate: Date; + }> + >; + findManyUnexpiredSlots(args: { userIds: number[]; currentTimeInUtc: string }): Promise< + Array<{ + id: number; + slotUtcStartDate: Date; + slotUtcEndDate: Date; + userId: number | null; + isSeat: boolean; + eventTypeId: number; + uid: string; + }> + >; + deleteManyExpiredSlots(args: { eventTypeId: number; currentTimeInUtc: string }): Promise<{ count: number }>; +} + +export class PrismaSelectedSlotRepository implements SelectedSlotRepositoryInterface { constructor(private prismaClient: PrismaClient) {} - async findMany({ where, select }: FindManyArgs) { + async findMany({ where, select }: any) { return await this.prismaClient.selectedSlots.findMany({ where, select }); } - async findFirst({ where }: { where: Prisma.SelectedSlotsWhereInput }) { + async findFirst({ where }: any) { return await this.prismaClient.selectedSlots.findFirst({ where, }); @@ -56,7 +82,7 @@ export class PrismaSelectedSlotRepository { } async findManyReservedByOthers(slots: TimeSlot[], eventTypeId: number, uid: string) { - return await this.findMany({ + return await this.prismaClient.selectedSlots.findMany({ where: { OR: slots.map((slot) => ({ slotUtcStartDate: slot.utcStartIso, diff --git a/packages/trpc/server/routers/viewer/slots/util.ts b/packages/trpc/server/routers/viewer/slots/util.ts index 91dd799e9a94c0..a01f8cbb5887a3 100644 --- a/packages/trpc/server/routers/viewer/slots/util.ts +++ b/packages/trpc/server/routers/viewer/slots/util.ts @@ -47,7 +47,7 @@ import type { EventTypeRepository } from "@calcom/lib/server/repository/eventTyp import type { RoutingFormResponseRepository } from "@calcom/lib/server/repository/formResponse"; import type { PrismaOOORepository } from "@calcom/lib/server/repository/ooo"; import type { ScheduleRepository } from "@calcom/lib/server/repository/schedule"; -import type { PrismaSelectedSlotRepository } from "@calcom/lib/server/repository/selectedSlots"; +import type { SelectedSlotRepositoryInterface } from "@calcom/lib/server/repository/selectedSlots"; import type { TeamRepository } from "@calcom/lib/server/repository/team"; import type { UserRepository } from "@calcom/lib/server/repository/user"; import { withSelectedCalendars } from "@calcom/lib/server/repository/user"; @@ -93,7 +93,7 @@ export type GetAvailableSlotsResponse = Awaited< export interface IAvailableSlotsService { oooRepo: PrismaOOORepository; scheduleRepo: ScheduleRepository; - selectedSlotRepo: PrismaSelectedSlotRepository; + selectedSlotRepo: SelectedSlotRepositoryInterface; teamRepo: TeamRepository; userRepo: UserRepository; bookingRepo: BookingRepository; From d275a12d0439f4e07e95a0cc265e2b72b48bb604 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Wed, 23 Jul 2025 18:47:44 +0000 Subject: [PATCH 06/17] refactor: rename selectedSlots.ts to selectedSlot.ts and update all imports Co-Authored-By: alex@cal.com --- ...SlotRepository.ts => prisma-selected-slots.repository.ts} | 0 apps/api/v2/src/lib/services/available-slots.service.ts | 5 +++-- packages/lib/di/modules/selectedSlots.ts | 2 +- .../server/repository/{selectedSlots.ts => selectedSlot.ts} | 0 packages/platform/libraries/repositories.ts | 2 +- .../trpc/server/routers/viewer/slots/isAvailable.handler.ts | 2 +- .../trpc/server/routers/viewer/slots/reserveSlot.handler.ts | 2 +- packages/trpc/server/routers/viewer/slots/util.ts | 2 +- 8 files changed, 8 insertions(+), 7 deletions(-) rename apps/api/v2/src/lib/repositories/{prismaSelectedSlotRepository.ts => prisma-selected-slots.repository.ts} (100%) rename packages/lib/server/repository/{selectedSlots.ts => selectedSlot.ts} (100%) diff --git a/apps/api/v2/src/lib/repositories/prismaSelectedSlotRepository.ts b/apps/api/v2/src/lib/repositories/prisma-selected-slots.repository.ts similarity index 100% rename from apps/api/v2/src/lib/repositories/prismaSelectedSlotRepository.ts rename to apps/api/v2/src/lib/repositories/prisma-selected-slots.repository.ts diff --git a/apps/api/v2/src/lib/services/available-slots.service.ts b/apps/api/v2/src/lib/services/available-slots.service.ts index 5a7f1e72e627a6..f53074c898df73 100644 --- a/apps/api/v2/src/lib/services/available-slots.service.ts +++ b/apps/api/v2/src/lib/services/available-slots.service.ts @@ -3,11 +3,12 @@ import { PrismaEventTypeRepository } from "@/lib/repositories/prisma-event-type. import { PrismaOOORepository } from "@/lib/repositories/prisma-ooo.repository"; import { PrismaRoutingFormResponseRepository } from "@/lib/repositories/prisma-routing-form-response.repository"; import { PrismaScheduleRepository } from "@/lib/repositories/prisma-schedule.repository"; +import { PrismaSelectedSlotRepository } from "@/lib/repositories/prisma-selected-slots.repository"; import { PrismaTeamRepository } from "@/lib/repositories/prisma-team.repository"; import { PrismaUserRepository } from "@/lib/repositories/prisma-user.repository"; import { Injectable } from "@nestjs/common"; -import { SelectedSlotRepositoryInterface } from "@calcom/lib/server/repository/selectedSlots"; +import { SelectedSlotRepositoryInterface } from "@calcom/lib/server/repository/selectedSlot"; import { AvailableSlotsService as BaseAvailableSlotsService } from "@calcom/platform-libraries/slots"; @Injectable() @@ -18,7 +19,7 @@ export class AvailableSlotsService extends BaseAvailableSlotsService { private readonly teamRepository: PrismaTeamRepository, private readonly routingFormResponseRepository: PrismaRoutingFormResponseRepository, private readonly bookingRepository: PrismaBookingRepository, - private readonly selectedSlotRepository: SelectedSlotRepositoryInterface, + private readonly selectedSlotRepository: PrismaSelectedSlotRepository, private readonly eventTypeRepository: PrismaEventTypeRepository, private readonly userRepository: PrismaUserRepository ) { diff --git a/packages/lib/di/modules/selectedSlots.ts b/packages/lib/di/modules/selectedSlots.ts index 06d722b884dd5c..ac1078e6802564 100644 --- a/packages/lib/di/modules/selectedSlots.ts +++ b/packages/lib/di/modules/selectedSlots.ts @@ -1,7 +1,7 @@ import { createModule } from "@evyweb/ioctopus"; import { DI_TOKENS } from "@calcom/lib/di/tokens"; -import { PrismaSelectedSlotRepository } from "@calcom/lib/server/repository/selectedSlots"; +import { PrismaSelectedSlotRepository } from "@calcom/lib/server/repository/selectedSlot"; export const selectedSlotsRepositoryModule = createModule(); selectedSlotsRepositoryModule diff --git a/packages/lib/server/repository/selectedSlots.ts b/packages/lib/server/repository/selectedSlot.ts similarity index 100% rename from packages/lib/server/repository/selectedSlots.ts rename to packages/lib/server/repository/selectedSlot.ts diff --git a/packages/platform/libraries/repositories.ts b/packages/platform/libraries/repositories.ts index 520613b261b319..557417291b842e 100644 --- a/packages/platform/libraries/repositories.ts +++ b/packages/platform/libraries/repositories.ts @@ -3,6 +3,6 @@ export { ScheduleRepository as PrismaScheduleRepository } from "@calcom/lib/serv export { BookingRepository as PrismaBookingRepository } from "@calcom/lib/server/repository/booking"; export { EventTypeRepository as PrismaEventTypeRepository } from "@calcom/lib/server/repository/eventTypeRepository"; export { RoutingFormResponseRepository as PrismaRoutingFormResponseRepository } from "@calcom/lib/server/repository/formResponse"; -export { PrismaSelectedSlotRepository as PrismaSelectedSlotsRepository } from "@calcom/lib/server/repository/selectedSlots"; +export { PrismaSelectedSlotRepository as PrismaSelectedSlotsRepository } from "@calcom/lib/server/repository/selectedSlot"; export { TeamRepository as PrismaTeamRepository } from "@calcom/lib/server/repository/team"; export { UserRepository as PrismaUserRepository } from "@calcom/lib/server/repository/user"; diff --git a/packages/trpc/server/routers/viewer/slots/isAvailable.handler.ts b/packages/trpc/server/routers/viewer/slots/isAvailable.handler.ts index 98ca85b9810bd2..a30b6aabb8b4fe 100644 --- a/packages/trpc/server/routers/viewer/slots/isAvailable.handler.ts +++ b/packages/trpc/server/routers/viewer/slots/isAvailable.handler.ts @@ -3,7 +3,7 @@ import type { NextApiRequest } from "next"; import { HttpError } from "@calcom/lib/http-error"; import { getPastTimeAndMinimumBookingNoticeBoundsStatus } from "@calcom/lib/isOutOfBounds"; import { EventTypeRepository } from "@calcom/lib/server/repository/eventTypeRepository"; -import { PrismaSelectedSlotRepository } from "@calcom/lib/server/repository/selectedSlots"; +import { PrismaSelectedSlotRepository } from "@calcom/lib/server/repository/selectedSlot"; import type { PrismaClient } from "@calcom/prisma"; import type { TIsAvailableInputSchema, TIsAvailableOutputSchema } from "./isAvailable.schema"; diff --git a/packages/trpc/server/routers/viewer/slots/reserveSlot.handler.ts b/packages/trpc/server/routers/viewer/slots/reserveSlot.handler.ts index e24fd712a4f520..29936aed1b3ba1 100644 --- a/packages/trpc/server/routers/viewer/slots/reserveSlot.handler.ts +++ b/packages/trpc/server/routers/viewer/slots/reserveSlot.handler.ts @@ -5,7 +5,7 @@ import { v4 as uuid } from "uuid"; import dayjs from "@calcom/dayjs"; import { WEBAPP_URL } from "@calcom/lib/constants"; import { MINUTES_TO_BOOK } from "@calcom/lib/constants"; -import { PrismaSelectedSlotRepository } from "@calcom/lib/server/repository/selectedSlots"; +import { PrismaSelectedSlotRepository } from "@calcom/lib/server/repository/selectedSlot"; import type { PrismaClient } from "@calcom/prisma"; import { BookingStatus } from "@calcom/prisma/enums"; diff --git a/packages/trpc/server/routers/viewer/slots/util.ts b/packages/trpc/server/routers/viewer/slots/util.ts index a01f8cbb5887a3..61911216a27a2d 100644 --- a/packages/trpc/server/routers/viewer/slots/util.ts +++ b/packages/trpc/server/routers/viewer/slots/util.ts @@ -47,7 +47,7 @@ import type { EventTypeRepository } from "@calcom/lib/server/repository/eventTyp import type { RoutingFormResponseRepository } from "@calcom/lib/server/repository/formResponse"; import type { PrismaOOORepository } from "@calcom/lib/server/repository/ooo"; import type { ScheduleRepository } from "@calcom/lib/server/repository/schedule"; -import type { SelectedSlotRepositoryInterface } from "@calcom/lib/server/repository/selectedSlots"; +import type { SelectedSlotRepositoryInterface } from "@calcom/lib/server/repository/selectedSlot"; import type { TeamRepository } from "@calcom/lib/server/repository/team"; import type { UserRepository } from "@calcom/lib/server/repository/user"; import { withSelectedCalendars } from "@calcom/lib/server/repository/user"; From d086ef4be069ac8e171d488d8ab7f55a371d0f8f Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Wed, 23 Jul 2025 19:10:50 +0000 Subject: [PATCH 07/17] fix: update test mock import path after file rename Co-Authored-By: alex@cal.com --- .../server/routers/viewer/slots/reserveSlot.handler.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/trpc/server/routers/viewer/slots/reserveSlot.handler.test.ts b/packages/trpc/server/routers/viewer/slots/reserveSlot.handler.test.ts index d89715a35a2732..7712be8299bf67 100644 --- a/packages/trpc/server/routers/viewer/slots/reserveSlot.handler.test.ts +++ b/packages/trpc/server/routers/viewer/slots/reserveSlot.handler.test.ts @@ -12,7 +12,7 @@ const dynamicImportHandler = async () => await import("./reserveSlot.handler"); // The repository instance method is used to check for an existing reservation by someone else. // To keep this unit test isolated from the database layer, we stub this to always resolve falsey. -vi.mock("@calcom/lib/server/repository/selectedSlots", () => ({ +vi.mock("@calcom/lib/server/repository/selectedSlot", () => ({ PrismaSelectedSlotRepository: vi.fn().mockImplementation(() => ({ findReservedByOthers: vi.fn().mockResolvedValue(null), })), From eba9b20278299802225d734633f0b45567dac311 Mon Sep 17 00:00:00 2001 From: Alex van Andel Date: Thu, 24 Jul 2025 01:55:01 +0100 Subject: [PATCH 08/17] Update apps/api/v2/src/lib/modules/available-slots.module.ts --- apps/api/v2/src/lib/modules/available-slots.module.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/api/v2/src/lib/modules/available-slots.module.ts b/apps/api/v2/src/lib/modules/available-slots.module.ts index c5d9e73b6742ac..6e5bdf09d1c2a1 100644 --- a/apps/api/v2/src/lib/modules/available-slots.module.ts +++ b/apps/api/v2/src/lib/modules/available-slots.module.ts @@ -5,7 +5,7 @@ import { PrismaRoutingFormResponseRepository } from "@/lib/repositories/prisma-r import { PrismaScheduleRepository } from "@/lib/repositories/prisma-schedule.repository"; import { PrismaTeamRepository } from "@/lib/repositories/prisma-team.repository"; import { PrismaUserRepository } from "@/lib/repositories/prisma-user.repository"; -import { PrismaSelectedSlotRepository } from "@/lib/repositories/prismaSelectedSlotRepository"; +import { PrismaSelectedSlotsRepository } from "@/lib/repositories/prisma-selected-slots.repository"; import { AvailableSlotsService } from "@/lib/services/available-slots.service"; import { PrismaModule } from "@/modules/prisma/prisma.module"; import { Module } from "@nestjs/common"; From e90e0e9aa0918a651994c35cbc26ad5d4e71aee3 Mon Sep 17 00:00:00 2001 From: Alex van Andel Date: Thu, 24 Jul 2025 01:55:53 +0100 Subject: [PATCH 09/17] Update apps/api/v2/src/lib/modules/available-slots.module.ts --- apps/api/v2/src/lib/modules/available-slots.module.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/api/v2/src/lib/modules/available-slots.module.ts b/apps/api/v2/src/lib/modules/available-slots.module.ts index 6e5bdf09d1c2a1..559c0bdcb4faea 100644 --- a/apps/api/v2/src/lib/modules/available-slots.module.ts +++ b/apps/api/v2/src/lib/modules/available-slots.module.ts @@ -5,7 +5,7 @@ import { PrismaRoutingFormResponseRepository } from "@/lib/repositories/prisma-r import { PrismaScheduleRepository } from "@/lib/repositories/prisma-schedule.repository"; import { PrismaTeamRepository } from "@/lib/repositories/prisma-team.repository"; import { PrismaUserRepository } from "@/lib/repositories/prisma-user.repository"; -import { PrismaSelectedSlotsRepository } from "@/lib/repositories/prisma-selected-slots.repository"; +import { PrismaSelectedSlotsRepository } from "@/lib/repositories/prisma-selected-slot.repository"; import { AvailableSlotsService } from "@/lib/services/available-slots.service"; import { PrismaModule } from "@/modules/prisma/prisma.module"; import { Module } from "@nestjs/common"; From 11f559b43ae3ea5ae5f000d33f44f0991445000f Mon Sep 17 00:00:00 2001 From: Alex van Andel Date: Thu, 24 Jul 2025 16:27:43 +0100 Subject: [PATCH 10/17] Implement DTO --- ....ts => prisma-selected-slot.repository.ts} | 0 .../lib/services/available-slots.service.ts | 2 +- packages/lib/di/modules/selectedSlots.ts | 4 +- packages/lib/di/tokens.ts | 4 +- .../repository/ISelectedSlotRepository.ts | 24 ++++++++ ...lot.ts => PrismaSelectedSlotRepository.ts} | 58 ++----------------- .../lib/server/repository/dto/SelectedSlot.ts | 6 ++ .../server/repository/dto/hashedLinkSelect.ts | 19 ++++++ ...selectedSlotDeleteManyExpiredSlotsInput.ts | 0 ...lectedSlotFindManyReservedByOthersInput.ts | 0 ...selectedSlotFindManyUnexpiredSlotsInput.ts | 0 .../selectedSlotFindReservedByOthersInput.ts | 0 .../viewer/slots/isAvailable.handler.ts | 2 +- .../viewer/slots/reserveSlot.handler.test.ts | 2 +- .../viewer/slots/reserveSlot.handler.ts | 2 +- .../trpc/server/routers/viewer/slots/util.ts | 4 +- 16 files changed, 64 insertions(+), 63 deletions(-) rename apps/api/v2/src/lib/repositories/{prisma-selected-slots.repository.ts => prisma-selected-slot.repository.ts} (100%) create mode 100644 packages/lib/server/repository/ISelectedSlotRepository.ts rename packages/lib/server/repository/{selectedSlot.ts => PrismaSelectedSlotRepository.ts} (56%) create mode 100644 packages/lib/server/repository/dto/SelectedSlot.ts create mode 100644 packages/lib/server/repository/dto/hashedLinkSelect.ts create mode 100644 packages/lib/server/repository/dto/selectedSlotDeleteManyExpiredSlotsInput.ts create mode 100644 packages/lib/server/repository/dto/selectedSlotFindManyReservedByOthersInput.ts create mode 100644 packages/lib/server/repository/dto/selectedSlotFindManyUnexpiredSlotsInput.ts create mode 100644 packages/lib/server/repository/dto/selectedSlotFindReservedByOthersInput.ts diff --git a/apps/api/v2/src/lib/repositories/prisma-selected-slots.repository.ts b/apps/api/v2/src/lib/repositories/prisma-selected-slot.repository.ts similarity index 100% rename from apps/api/v2/src/lib/repositories/prisma-selected-slots.repository.ts rename to apps/api/v2/src/lib/repositories/prisma-selected-slot.repository.ts diff --git a/apps/api/v2/src/lib/services/available-slots.service.ts b/apps/api/v2/src/lib/services/available-slots.service.ts index f53074c898df73..71826c7d28ba54 100644 --- a/apps/api/v2/src/lib/services/available-slots.service.ts +++ b/apps/api/v2/src/lib/services/available-slots.service.ts @@ -3,7 +3,7 @@ import { PrismaEventTypeRepository } from "@/lib/repositories/prisma-event-type. import { PrismaOOORepository } from "@/lib/repositories/prisma-ooo.repository"; import { PrismaRoutingFormResponseRepository } from "@/lib/repositories/prisma-routing-form-response.repository"; import { PrismaScheduleRepository } from "@/lib/repositories/prisma-schedule.repository"; -import { PrismaSelectedSlotRepository } from "@/lib/repositories/prisma-selected-slots.repository"; +import { PrismaSelectedSlotRepository } from "@/lib/repositories/prisma-selected-slot.repository"; import { PrismaTeamRepository } from "@/lib/repositories/prisma-team.repository"; import { PrismaUserRepository } from "@/lib/repositories/prisma-user.repository"; import { Injectable } from "@nestjs/common"; diff --git a/packages/lib/di/modules/selectedSlots.ts b/packages/lib/di/modules/selectedSlots.ts index ac1078e6802564..10d76f18b759c6 100644 --- a/packages/lib/di/modules/selectedSlots.ts +++ b/packages/lib/di/modules/selectedSlots.ts @@ -1,9 +1,9 @@ import { createModule } from "@evyweb/ioctopus"; import { DI_TOKENS } from "@calcom/lib/di/tokens"; -import { PrismaSelectedSlotRepository } from "@calcom/lib/server/repository/selectedSlot"; +import { PrismaSelectedSlotRepository } from "@calcom/lib/server/repository/PrismaSelectedSlotRepository"; export const selectedSlotsRepositoryModule = createModule(); selectedSlotsRepositoryModule - .bind(DI_TOKENS.SELECTED_SLOTS_REPOSITORY) + .bind(DI_TOKENS.SELECTED_SLOT_REPOSITORY) .toClass(PrismaSelectedSlotRepository, [DI_TOKENS.PRISMA_CLIENT]); diff --git a/packages/lib/di/tokens.ts b/packages/lib/di/tokens.ts index b778389a895a56..7b59701c473260 100644 --- a/packages/lib/di/tokens.ts +++ b/packages/lib/di/tokens.ts @@ -6,8 +6,8 @@ export const DI_TOKENS = { OOO_REPOSITORY_MODULE: Symbol("OOORepositoryModule"), SCHEDULE_REPOSITORY: Symbol("ScheduleRepository"), SCHEDULE_REPOSITORY_MODULE: Symbol("ScheduleRepositoryModule"), - SELECTED_SLOTS_REPOSITORY: Symbol("SelectedSlotsRepository"), - SELECTED_SLOTS_REPOSITORY_MODULE: Symbol("SelectedSlotsRepositoryModule"), + SELECTED_SLOT_REPOSITORY: Symbol("SelectedSlotRepository"), + SELECTED_SLOT_REPOSITORY_MODULE: Symbol("SelectedSlotRepositoryModule"), TEAM_REPOSITORY: Symbol("TeamRepository"), TEAM_REPOSITORY_MODULE: Symbol("TeamRepositoryModule"), USER_REPOSITORY: Symbol("UserRepository"), diff --git a/packages/lib/server/repository/ISelectedSlotRepository.ts b/packages/lib/server/repository/ISelectedSlotRepository.ts new file mode 100644 index 00000000000000..7f645e872e0032 --- /dev/null +++ b/packages/lib/server/repository/ISelectedSlotRepository.ts @@ -0,0 +1,24 @@ +import type { SelectedSlot } from "./dto/SelectedSlot"; + +export type TimeSlot = { + utcStartIso: string; + utcEndIso: string; +}; + +export interface ISelectedSlotRepository { + findReservedByOthers(args: { + slot: TimeSlot; + eventTypeId: number; + uid: string; + }): Promise; + findManyReservedByOthers( + slots: TimeSlot[], + eventTypeId: number, + uid: string + ): Promise>>; + findManyUnexpiredSlots(args: { + userIds: number[]; + currentTimeInUtc: string; + }): Promise>>; + deleteManyExpiredSlots(args: { eventTypeId: number; currentTimeInUtc: string }): Promise<{ count: number }>; +} diff --git a/packages/lib/server/repository/selectedSlot.ts b/packages/lib/server/repository/PrismaSelectedSlotRepository.ts similarity index 56% rename from packages/lib/server/repository/selectedSlot.ts rename to packages/lib/server/repository/PrismaSelectedSlotRepository.ts index 8ff26540a70b88..da0cff8905a3ec 100644 --- a/packages/lib/server/repository/selectedSlot.ts +++ b/packages/lib/server/repository/PrismaSelectedSlotRepository.ts @@ -1,61 +1,13 @@ import type { PrismaClient } from "@calcom/prisma"; +import type { Prisma } from "@calcom/prisma/client"; -type WhereCondition = { - slotUtcStartDate?: Date | string; - slotUtcEndDate?: Date | string; - eventTypeId?: number; - uid?: string | { not: string }; - releaseAt?: { gt: Date }; -}; +import type { ISelectedSlotRepository } from "./ISelectedSlotRepository"; +import type { TimeSlot } from "./ISelectedSlotRepository"; -export type FindManyArgs = { - where?: WhereCondition & { - OR?: WhereCondition[]; - }; - select?: any; -}; - -export type TimeSlot = { - utcStartIso: string; - utcEndIso: string; -}; - -export interface SelectedSlotRepositoryInterface { - findMany(args: any): Promise; - findFirst(args: any): Promise; - findReservedByOthers(args: { slot: TimeSlot; eventTypeId: number; uid: string }): Promise; - findManyReservedByOthers( - slots: TimeSlot[], - eventTypeId: number, - uid: string - ): Promise< - Array<{ - slotUtcStartDate: Date; - slotUtcEndDate: Date; - }> - >; - findManyUnexpiredSlots(args: { userIds: number[]; currentTimeInUtc: string }): Promise< - Array<{ - id: number; - slotUtcStartDate: Date; - slotUtcEndDate: Date; - userId: number | null; - isSeat: boolean; - eventTypeId: number; - uid: string; - }> - >; - deleteManyExpiredSlots(args: { eventTypeId: number; currentTimeInUtc: string }): Promise<{ count: number }>; -} - -export class PrismaSelectedSlotRepository implements SelectedSlotRepositoryInterface { +export class PrismaSelectedSlotRepository implements ISelectedSlotRepository { constructor(private prismaClient: PrismaClient) {} - async findMany({ where, select }: any) { - return await this.prismaClient.selectedSlots.findMany({ where, select }); - } - - async findFirst({ where }: any) { + private async findFirst({ where }: { where: Prisma.SelectedSlotsWhereInput }) { return await this.prismaClient.selectedSlots.findFirst({ where, }); diff --git a/packages/lib/server/repository/dto/SelectedSlot.ts b/packages/lib/server/repository/dto/SelectedSlot.ts new file mode 100644 index 00000000000000..156647702afa5e --- /dev/null +++ b/packages/lib/server/repository/dto/SelectedSlot.ts @@ -0,0 +1,6 @@ +import type { SelectedSlots } from "@prisma/client"; + +export type SelectedSlot = Pick< + SelectedSlots, + "id" | "uid" | "eventTypeId" | "slotUtcStartDate" | "slotUtcEndDate" | "releaseAt" +>; diff --git a/packages/lib/server/repository/dto/hashedLinkSelect.ts b/packages/lib/server/repository/dto/hashedLinkSelect.ts new file mode 100644 index 00000000000000..04691c2ce20566 --- /dev/null +++ b/packages/lib/server/repository/dto/hashedLinkSelect.ts @@ -0,0 +1,19 @@ +import type { Prisma } from "@prisma/client"; + +type EnforceTrueOrNested = { + [K in keyof T]: T[K] extends object ? EnforceTrueOrNested : true; // only allow `true` at leaves +}; + +export type HashedLinkSelect = EnforceTrueOrNested< + Pick & { + eventType?: Pick & { + hosts?: { + user?: Prisma.UserSelect; + }; + profile?: { + user?: Prisma.UserSelect; + }; + owner?: Prisma.UserSelect; + }; + } +>; diff --git a/packages/lib/server/repository/dto/selectedSlotDeleteManyExpiredSlotsInput.ts b/packages/lib/server/repository/dto/selectedSlotDeleteManyExpiredSlotsInput.ts new file mode 100644 index 00000000000000..e69de29bb2d1d6 diff --git a/packages/lib/server/repository/dto/selectedSlotFindManyReservedByOthersInput.ts b/packages/lib/server/repository/dto/selectedSlotFindManyReservedByOthersInput.ts new file mode 100644 index 00000000000000..e69de29bb2d1d6 diff --git a/packages/lib/server/repository/dto/selectedSlotFindManyUnexpiredSlotsInput.ts b/packages/lib/server/repository/dto/selectedSlotFindManyUnexpiredSlotsInput.ts new file mode 100644 index 00000000000000..e69de29bb2d1d6 diff --git a/packages/lib/server/repository/dto/selectedSlotFindReservedByOthersInput.ts b/packages/lib/server/repository/dto/selectedSlotFindReservedByOthersInput.ts new file mode 100644 index 00000000000000..e69de29bb2d1d6 diff --git a/packages/trpc/server/routers/viewer/slots/isAvailable.handler.ts b/packages/trpc/server/routers/viewer/slots/isAvailable.handler.ts index a30b6aabb8b4fe..d970dbc2ebfc6b 100644 --- a/packages/trpc/server/routers/viewer/slots/isAvailable.handler.ts +++ b/packages/trpc/server/routers/viewer/slots/isAvailable.handler.ts @@ -2,8 +2,8 @@ import type { NextApiRequest } from "next"; import { HttpError } from "@calcom/lib/http-error"; import { getPastTimeAndMinimumBookingNoticeBoundsStatus } from "@calcom/lib/isOutOfBounds"; +import { PrismaSelectedSlotRepository } from "@calcom/lib/server/repository/PrismaSelectedSlotRepository"; import { EventTypeRepository } from "@calcom/lib/server/repository/eventTypeRepository"; -import { PrismaSelectedSlotRepository } from "@calcom/lib/server/repository/selectedSlot"; import type { PrismaClient } from "@calcom/prisma"; import type { TIsAvailableInputSchema, TIsAvailableOutputSchema } from "./isAvailable.schema"; diff --git a/packages/trpc/server/routers/viewer/slots/reserveSlot.handler.test.ts b/packages/trpc/server/routers/viewer/slots/reserveSlot.handler.test.ts index 7712be8299bf67..7972d90a2a4a3f 100644 --- a/packages/trpc/server/routers/viewer/slots/reserveSlot.handler.test.ts +++ b/packages/trpc/server/routers/viewer/slots/reserveSlot.handler.test.ts @@ -12,7 +12,7 @@ const dynamicImportHandler = async () => await import("./reserveSlot.handler"); // The repository instance method is used to check for an existing reservation by someone else. // To keep this unit test isolated from the database layer, we stub this to always resolve falsey. -vi.mock("@calcom/lib/server/repository/selectedSlot", () => ({ +vi.mock("@calcom/lib/server/repository/PrismaSelectedSlotRepository", () => ({ PrismaSelectedSlotRepository: vi.fn().mockImplementation(() => ({ findReservedByOthers: vi.fn().mockResolvedValue(null), })), diff --git a/packages/trpc/server/routers/viewer/slots/reserveSlot.handler.ts b/packages/trpc/server/routers/viewer/slots/reserveSlot.handler.ts index 29936aed1b3ba1..ccd4f13539dcc0 100644 --- a/packages/trpc/server/routers/viewer/slots/reserveSlot.handler.ts +++ b/packages/trpc/server/routers/viewer/slots/reserveSlot.handler.ts @@ -5,7 +5,7 @@ import { v4 as uuid } from "uuid"; import dayjs from "@calcom/dayjs"; import { WEBAPP_URL } from "@calcom/lib/constants"; import { MINUTES_TO_BOOK } from "@calcom/lib/constants"; -import { PrismaSelectedSlotRepository } from "@calcom/lib/server/repository/selectedSlot"; +import { PrismaSelectedSlotRepository } from "@calcom/lib/server/repository/PrismaSelectedSlotRepository"; import type { PrismaClient } from "@calcom/prisma"; import { BookingStatus } from "@calcom/prisma/enums"; diff --git a/packages/trpc/server/routers/viewer/slots/util.ts b/packages/trpc/server/routers/viewer/slots/util.ts index 61911216a27a2d..ed5d4a23549050 100644 --- a/packages/trpc/server/routers/viewer/slots/util.ts +++ b/packages/trpc/server/routers/viewer/slots/util.ts @@ -42,12 +42,12 @@ 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 type { ISelectedSlotRepository } from "@calcom/lib/server/repository/ISelectedSlotRepository"; import type { BookingRepository } from "@calcom/lib/server/repository/booking"; import type { EventTypeRepository } from "@calcom/lib/server/repository/eventTypeRepository"; import type { RoutingFormResponseRepository } from "@calcom/lib/server/repository/formResponse"; import type { PrismaOOORepository } from "@calcom/lib/server/repository/ooo"; import type { ScheduleRepository } from "@calcom/lib/server/repository/schedule"; -import type { SelectedSlotRepositoryInterface } from "@calcom/lib/server/repository/selectedSlot"; import type { TeamRepository } from "@calcom/lib/server/repository/team"; import type { UserRepository } from "@calcom/lib/server/repository/user"; import { withSelectedCalendars } from "@calcom/lib/server/repository/user"; @@ -93,7 +93,7 @@ export type GetAvailableSlotsResponse = Awaited< export interface IAvailableSlotsService { oooRepo: PrismaOOORepository; scheduleRepo: ScheduleRepository; - selectedSlotRepo: SelectedSlotRepositoryInterface; + selectedSlotRepo: ISelectedSlotRepository; teamRepo: TeamRepository; userRepo: UserRepository; bookingRepo: BookingRepository; From e532119765d37febc2ddf3417bb9ac134adc5e13 Mon Sep 17 00:00:00 2001 From: Alex van Andel Date: Thu, 24 Jul 2025 16:46:41 +0100 Subject: [PATCH 11/17] dont declare dependencies locally, duplicating --- .../prisma-selected-slot.repository.ts | 4 ++-- .../src/lib/services/available-slots.service.ts | 17 ++++++++--------- packages/platform/libraries/repositories.ts | 2 +- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/apps/api/v2/src/lib/repositories/prisma-selected-slot.repository.ts b/apps/api/v2/src/lib/repositories/prisma-selected-slot.repository.ts index ec51d39218f6ad..09a77f5b6a93e6 100644 --- a/apps/api/v2/src/lib/repositories/prisma-selected-slot.repository.ts +++ b/apps/api/v2/src/lib/repositories/prisma-selected-slot.repository.ts @@ -1,11 +1,11 @@ import { PrismaWriteService } from "@/modules/prisma/prisma-write.service"; import { Injectable } from "@nestjs/common"; -import { PrismaSelectedSlotsRepository as PrismaSelectedSlotsRepositoryLib } from "@calcom/platform-libraries/repositories"; +import { PrismaSelectedSlotRepository as PrismaSelectedSlotRepositoryLib } from "@calcom/platform-libraries/repositories"; import { PrismaClient } from "@calcom/prisma"; @Injectable() -export class PrismaSelectedSlotRepository extends PrismaSelectedSlotsRepositoryLib { +export class PrismaSelectedSlotRepository extends PrismaSelectedSlotRepositoryLib { constructor(private readonly dbWrite: PrismaWriteService) { super(dbWrite.prisma as unknown as PrismaClient); } diff --git a/apps/api/v2/src/lib/services/available-slots.service.ts b/apps/api/v2/src/lib/services/available-slots.service.ts index 71826c7d28ba54..7f6ce1725c70f4 100644 --- a/apps/api/v2/src/lib/services/available-slots.service.ts +++ b/apps/api/v2/src/lib/services/available-slots.service.ts @@ -8,20 +8,19 @@ import { PrismaTeamRepository } from "@/lib/repositories/prisma-team.repository" import { PrismaUserRepository } from "@/lib/repositories/prisma-user.repository"; import { Injectable } from "@nestjs/common"; -import { SelectedSlotRepositoryInterface } from "@calcom/lib/server/repository/selectedSlot"; import { AvailableSlotsService as BaseAvailableSlotsService } from "@calcom/platform-libraries/slots"; @Injectable() export class AvailableSlotsService extends BaseAvailableSlotsService { constructor( - private readonly oooRepoDependency: PrismaOOORepository, - private readonly scheduleRepoDependency: PrismaScheduleRepository, - private readonly teamRepository: PrismaTeamRepository, - private readonly routingFormResponseRepository: PrismaRoutingFormResponseRepository, - private readonly bookingRepository: PrismaBookingRepository, - private readonly selectedSlotRepository: PrismaSelectedSlotRepository, - private readonly eventTypeRepository: PrismaEventTypeRepository, - private readonly userRepository: PrismaUserRepository + oooRepoDependency: PrismaOOORepository, + scheduleRepoDependency: PrismaScheduleRepository, + teamRepository: PrismaTeamRepository, + routingFormResponseRepository: PrismaRoutingFormResponseRepository, + bookingRepository: PrismaBookingRepository, + selectedSlotRepository: PrismaSelectedSlotRepository, + eventTypeRepository: PrismaEventTypeRepository, + userRepository: PrismaUserRepository ) { super({ oooRepo: oooRepoDependency, diff --git a/packages/platform/libraries/repositories.ts b/packages/platform/libraries/repositories.ts index 557417291b842e..536345d29e1bc5 100644 --- a/packages/platform/libraries/repositories.ts +++ b/packages/platform/libraries/repositories.ts @@ -3,6 +3,6 @@ export { ScheduleRepository as PrismaScheduleRepository } from "@calcom/lib/serv export { BookingRepository as PrismaBookingRepository } from "@calcom/lib/server/repository/booking"; export { EventTypeRepository as PrismaEventTypeRepository } from "@calcom/lib/server/repository/eventTypeRepository"; export { RoutingFormResponseRepository as PrismaRoutingFormResponseRepository } from "@calcom/lib/server/repository/formResponse"; -export { PrismaSelectedSlotRepository as PrismaSelectedSlotsRepository } from "@calcom/lib/server/repository/selectedSlot"; +export { PrismaSelectedSlotRepository } from "@calcom/lib/server/repository/PrismaSelectedSlotRepository"; export { TeamRepository as PrismaTeamRepository } from "@calcom/lib/server/repository/team"; export { UserRepository as PrismaUserRepository } from "@calcom/lib/server/repository/user"; From d35da22f3e140fc4944823741874e47ef4e230c0 Mon Sep 17 00:00:00 2001 From: Alex van Andel Date: Thu, 24 Jul 2025 17:11:06 +0100 Subject: [PATCH 12/17] Small DTO/token fix --- packages/lib/di/containers/available-slots.ts | 2 +- packages/lib/di/modules/available-slots.ts | 2 +- packages/lib/server/repository/dto/SelectedSlot.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/lib/di/containers/available-slots.ts b/packages/lib/di/containers/available-slots.ts index 824467363a0baf..927b042d66e191 100644 --- a/packages/lib/di/containers/available-slots.ts +++ b/packages/lib/di/containers/available-slots.ts @@ -18,7 +18,7 @@ const container = createContainer(); container.load(DI_TOKENS.PRISMA_MODULE, prismaModule); container.load(DI_TOKENS.OOO_REPOSITORY_MODULE, oooRepositoryModule); container.load(DI_TOKENS.SCHEDULE_REPOSITORY_MODULE, scheduleRepositoryModule); -container.load(DI_TOKENS.SELECTED_SLOTS_REPOSITORY_MODULE, selectedSlotsRepositoryModule); +container.load(DI_TOKENS.SELECTED_SLOT_REPOSITORY_MODULE, selectedSlotsRepositoryModule); container.load(DI_TOKENS.TEAM_REPOSITORY_MODULE, teamRepositoryModule); container.load(DI_TOKENS.USER_REPOSITORY_MODULE, userRepositoryModule); container.load(DI_TOKENS.BOOKING_REPOSITORY_MODULE, bookingRepositoryModule); diff --git a/packages/lib/di/modules/available-slots.ts b/packages/lib/di/modules/available-slots.ts index ea26b2238b29af..5c34f94f506a3b 100644 --- a/packages/lib/di/modules/available-slots.ts +++ b/packages/lib/di/modules/available-slots.ts @@ -9,7 +9,7 @@ export const availableSlotsModule = createModule(); availableSlotsModule.bind(DI_TOKENS.AVAILABLE_SLOTS_SERVICE).toClass(AvailableSlotsService, { oooRepo: DI_TOKENS.OOO_REPOSITORY, scheduleRepo: DI_TOKENS.SCHEDULE_REPOSITORY, - selectedSlotRepo: DI_TOKENS.SELECTED_SLOTS_REPOSITORY, + selectedSlotRepo: DI_TOKENS.SELECTED_SLOT_REPOSITORY, teamRepo: DI_TOKENS.TEAM_REPOSITORY, userRepo: DI_TOKENS.USER_REPOSITORY, bookingRepo: DI_TOKENS.BOOKING_REPOSITORY, diff --git a/packages/lib/server/repository/dto/SelectedSlot.ts b/packages/lib/server/repository/dto/SelectedSlot.ts index 156647702afa5e..68a37af2496548 100644 --- a/packages/lib/server/repository/dto/SelectedSlot.ts +++ b/packages/lib/server/repository/dto/SelectedSlot.ts @@ -2,5 +2,5 @@ import type { SelectedSlots } from "@prisma/client"; export type SelectedSlot = Pick< SelectedSlots, - "id" | "uid" | "eventTypeId" | "slotUtcStartDate" | "slotUtcEndDate" | "releaseAt" + "id" | "uid" | "eventTypeId" | "slotUtcStartDate" | "slotUtcEndDate" | "releaseAt" | "isSeat" >; From 0f039ac55e115bccc0f97cd51cf8f3bdc899f11b Mon Sep 17 00:00:00 2001 From: Somay Chauhan Date: Sat, 26 Jul 2025 00:36:17 +0530 Subject: [PATCH 13/17] chore: bump @calcom/platform-libraries from 0.0.266 to 0.0.267 --- apps/api/v2/package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/api/v2/package.json b/apps/api/v2/package.json index 35edf235f406fb..87c2b98682e4c0 100644 --- a/apps/api/v2/package.json +++ b/apps/api/v2/package.json @@ -38,7 +38,7 @@ "@axiomhq/winston": "^1.2.0", "@calcom/platform-constants": "*", "@calcom/platform-enums": "*", - "@calcom/platform-libraries": "npm:@calcom/platform-libraries@0.0.266", + "@calcom/platform-libraries": "npm:@calcom/platform-libraries@0.0.267", "@calcom/platform-types": "*", "@calcom/platform-utils": "*", "@calcom/prisma": "*", diff --git a/yarn.lock b/yarn.lock index 3e39ce232343e7..a58fc44fa2cd20 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2722,7 +2722,7 @@ __metadata: "@axiomhq/winston": ^1.2.0 "@calcom/platform-constants": "*" "@calcom/platform-enums": "*" - "@calcom/platform-libraries": "npm:@calcom/platform-libraries@0.0.266" + "@calcom/platform-libraries": "npm:@calcom/platform-libraries@0.0.267" "@calcom/platform-types": "*" "@calcom/platform-utils": "*" "@calcom/prisma": "*" @@ -3794,13 +3794,13 @@ __metadata: languageName: unknown linkType: soft -"@calcom/platform-libraries@npm:@calcom/platform-libraries@0.0.266": - version: 0.0.266 - resolution: "@calcom/platform-libraries@npm:0.0.266" +"@calcom/platform-libraries@npm:@calcom/platform-libraries@0.0.267": + version: 0.0.267 + resolution: "@calcom/platform-libraries@npm:0.0.267" dependencies: "@calcom/features": "*" "@calcom/lib": "*" - checksum: 20f140bfb9fc1a08f4f302deb9cf247110ab385974dd0235a3c8ab73df4d2440d3e38cb494ca22d7f58445754e2bf6a6c981933a8e8106eaf55861a61945ce26 + checksum: 0c385514a04ddbd96ab3277774815233801a6eaf9a0d406b473eb7a446602f6f7d98de7f16747893b9fe1d50257db13b050a5726c8e7fe9500750d3ebf7be23a languageName: node linkType: hard From 2c310bb5fd7c53fe74b75c617ab8756e373e327b Mon Sep 17 00:00:00 2001 From: Alex van Andel Date: Fri, 25 Jul 2025 22:45:44 +0100 Subject: [PATCH 14/17] oops. --- apps/api/v2/src/lib/modules/available-slots.module.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/api/v2/src/lib/modules/available-slots.module.ts b/apps/api/v2/src/lib/modules/available-slots.module.ts index 559c0bdcb4faea..c1f55f55f3fc70 100644 --- a/apps/api/v2/src/lib/modules/available-slots.module.ts +++ b/apps/api/v2/src/lib/modules/available-slots.module.ts @@ -3,9 +3,9 @@ import { PrismaEventTypeRepository } from "@/lib/repositories/prisma-event-type. import { PrismaOOORepository } from "@/lib/repositories/prisma-ooo.repository"; import { PrismaRoutingFormResponseRepository } from "@/lib/repositories/prisma-routing-form-response.repository"; import { PrismaScheduleRepository } from "@/lib/repositories/prisma-schedule.repository"; +import { PrismaSelectedSlotRepository } from "@/lib/repositories/prisma-selected-slot.repository"; import { PrismaTeamRepository } from "@/lib/repositories/prisma-team.repository"; import { PrismaUserRepository } from "@/lib/repositories/prisma-user.repository"; -import { PrismaSelectedSlotsRepository } from "@/lib/repositories/prisma-selected-slot.repository"; import { AvailableSlotsService } from "@/lib/services/available-slots.service"; import { PrismaModule } from "@/modules/prisma/prisma.module"; import { Module } from "@nestjs/common"; From cfadec414641e4af3864f683b9e278e9035ec022 Mon Sep 17 00:00:00 2001 From: Alex van Andel Date: Fri, 25 Jul 2025 23:06:42 +0100 Subject: [PATCH 15/17] Update fixture names also --- .../controllers/slots.controller.e2e-spec.ts | 6 +++--- .../e2e/team-event-type-slots.controller.e2e-spec.ts | 2 +- ...itory.fixture.ts => selected-slot.repository.fixture.ts} | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) rename apps/api/v2/test/fixtures/repository/{selected-slots.repository.fixture.ts => selected-slot.repository.fixture.ts} (93%) diff --git a/apps/api/v2/src/modules/slots/slots-2024-04-15/controllers/slots.controller.e2e-spec.ts b/apps/api/v2/src/modules/slots/slots-2024-04-15/controllers/slots.controller.e2e-spec.ts index ef0b8b6c1396fa..028a0461f41ff4 100644 --- a/apps/api/v2/src/modules/slots/slots-2024-04-15/controllers/slots.controller.e2e-spec.ts +++ b/apps/api/v2/src/modules/slots/slots-2024-04-15/controllers/slots.controller.e2e-spec.ts @@ -16,7 +16,7 @@ import { AttendeeRepositoryFixture } from "test/fixtures/repository/attendee.rep import { BookingSeatRepositoryFixture } from "test/fixtures/repository/booking-seat.repository.fixture"; import { BookingsRepositoryFixture } from "test/fixtures/repository/bookings.repository.fixture"; import { EventTypesRepositoryFixture } from "test/fixtures/repository/event-types.repository.fixture"; -import { SelectedSlotRepositoryFixture } from "test/fixtures/repository/selected-slots.repository.fixture"; +import { SelectedSlotRepositoryFixture } from "test/fixtures/repository/selected-slot.repository.fixture"; import { UserRepositoryFixture } from "test/fixtures/repository/users.repository.fixture"; import { randomString } from "test/utils/randomString"; import { withApiAuth } from "test/utils/withApiAuth"; @@ -250,7 +250,7 @@ describe("Slots 2024-04-15 Endpoints", () => { let userRepositoryFixture: UserRepositoryFixture; let schedulesService: SchedulesService_2024_06_11; let eventTypesRepositoryFixture: EventTypesRepositoryFixture; - let selectedSlotRepositoryFixture: SelectedSlotsRepositoryFixture; + let selectedSlotRepositoryFixture: SelectedSlotRepositoryFixture; let bookingsRepositoryFixture: BookingsRepositoryFixture; let bookingSeatsRepositoryFixture: BookingSeatRepositoryFixture; let attendeesRepositoryFixture: AttendeeRepositoryFixture; @@ -288,7 +288,7 @@ describe("Slots 2024-04-15 Endpoints", () => { userRepositoryFixture = new UserRepositoryFixture(moduleRef); schedulesService = moduleRef.get(SchedulesService_2024_06_11); eventTypesRepositoryFixture = new EventTypesRepositoryFixture(moduleRef); - selectedSlotRepositoryFixture = new SelectedSlotsRepositoryFixture(moduleRef); + selectedSlotRepositoryFixture = new SelectedSlotRepositoryFixture(moduleRef); bookingsRepositoryFixture = new BookingsRepositoryFixture(moduleRef); bookingSeatsRepositoryFixture = new BookingSeatRepositoryFixture(moduleRef); attendeesRepositoryFixture = new AttendeeRepositoryFixture(moduleRef); diff --git a/apps/api/v2/src/modules/slots/slots-2024-09-04/controllers/e2e/team-event-type-slots.controller.e2e-spec.ts b/apps/api/v2/src/modules/slots/slots-2024-09-04/controllers/e2e/team-event-type-slots.controller.e2e-spec.ts index 0bcd5045d79ec8..382f7d2859e2ec 100644 --- a/apps/api/v2/src/modules/slots/slots-2024-09-04/controllers/e2e/team-event-type-slots.controller.e2e-spec.ts +++ b/apps/api/v2/src/modules/slots/slots-2024-09-04/controllers/e2e/team-event-type-slots.controller.e2e-spec.ts @@ -44,7 +44,7 @@ describe("Slots 2024-09-04 Endpoints", () => { let membershipsRepositoryFixture: MembershipRepositoryFixture; let bookingsRepositoryFixture: BookingsRepositoryFixture; let apiKeysRepositoryFixture: ApiKeysRepositoryFixture; - let selectedSlotRepositoryFixture: SelectedSlotsRepositoryFixture; + let selectedSlotRepositoryFixture: SelectedSlotRepositoryFixture; const teammateEmailOne = `slots-2024-09-04-user-1-team-slots-${randomString()}`; let teammateApiKeyString: string; diff --git a/apps/api/v2/test/fixtures/repository/selected-slots.repository.fixture.ts b/apps/api/v2/test/fixtures/repository/selected-slot.repository.fixture.ts similarity index 93% rename from apps/api/v2/test/fixtures/repository/selected-slots.repository.fixture.ts rename to apps/api/v2/test/fixtures/repository/selected-slot.repository.fixture.ts index ab75a943f67f05..e4f9221e845c5e 100644 --- a/apps/api/v2/test/fixtures/repository/selected-slots.repository.fixture.ts +++ b/apps/api/v2/test/fixtures/repository/selected-slot.repository.fixture.ts @@ -7,7 +7,7 @@ export class SelectedSlotRepositoryFixture { private prismaReadClient: PrismaReadService["prisma"]; private prismaWriteClient: PrismaWriteService["prisma"]; - constructor(private readonly module: TestingModule) { + constructor(module: TestingModule) { this.prismaReadClient = module.get(PrismaReadService).prisma; this.prismaWriteClient = module.get(PrismaWriteService).prisma; } From a1110fed4a4f6b2a7cd9dcc21cced53ffdb60c7f Mon Sep 17 00:00:00 2001 From: Alex van Andel Date: Fri, 25 Jul 2025 23:23:05 +0100 Subject: [PATCH 16/17] Omg these vscode actions preventing saves --- .../e2e/team-event-type-slots.controller.e2e-spec.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/api/v2/src/modules/slots/slots-2024-09-04/controllers/e2e/team-event-type-slots.controller.e2e-spec.ts b/apps/api/v2/src/modules/slots/slots-2024-09-04/controllers/e2e/team-event-type-slots.controller.e2e-spec.ts index 382f7d2859e2ec..a2db140ad48de2 100644 --- a/apps/api/v2/src/modules/slots/slots-2024-09-04/controllers/e2e/team-event-type-slots.controller.e2e-spec.ts +++ b/apps/api/v2/src/modules/slots/slots-2024-09-04/controllers/e2e/team-event-type-slots.controller.e2e-spec.ts @@ -21,7 +21,7 @@ import { ApiKeysRepositoryFixture } from "test/fixtures/repository/api-keys.repo import { BookingsRepositoryFixture } from "test/fixtures/repository/bookings.repository.fixture"; import { EventTypesRepositoryFixture } from "test/fixtures/repository/event-types.repository.fixture"; import { MembershipRepositoryFixture } from "test/fixtures/repository/membership.repository.fixture"; -import { SelectedSlotRepositoryFixture } from "test/fixtures/repository/selected-slots.repository.fixture"; +import { SelectedSlotRepositoryFixture } from "test/fixtures/repository/selected-slot.repository.fixture"; import { TeamRepositoryFixture } from "test/fixtures/repository/team.repository.fixture"; import { UserRepositoryFixture } from "test/fixtures/repository/users.repository.fixture"; import { randomString } from "test/utils/randomString"; @@ -93,7 +93,7 @@ describe("Slots 2024-09-04 Endpoints", () => { membershipsRepositoryFixture = new MembershipRepositoryFixture(moduleRef); bookingsRepositoryFixture = new BookingsRepositoryFixture(moduleRef); apiKeysRepositoryFixture = new ApiKeysRepositoryFixture(moduleRef); - selectedSlotRepositoryFixture = new SelectedSlotsRepositoryFixture(moduleRef); + selectedSlotRepositoryFixture = new SelectedSlotRepositoryFixture(moduleRef); teammateOne = await userRepositoryFixture.create({ email: teammateEmailOne, From aa6d85684f25214a2ccb0539d8dafd13cd9e324a Mon Sep 17 00:00:00 2001 From: Alex van Andel Date: Fri, 25 Jul 2025 23:38:46 +0100 Subject: [PATCH 17/17] Final fix, hopefully --- .../e2e/user-event-type-slots.controller.e2e-spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/api/v2/src/modules/slots/slots-2024-09-04/controllers/e2e/user-event-type-slots.controller.e2e-spec.ts b/apps/api/v2/src/modules/slots/slots-2024-09-04/controllers/e2e/user-event-type-slots.controller.e2e-spec.ts index f4e8998082a5d8..1fe42764d24ef2 100644 --- a/apps/api/v2/src/modules/slots/slots-2024-09-04/controllers/e2e/user-event-type-slots.controller.e2e-spec.ts +++ b/apps/api/v2/src/modules/slots/slots-2024-09-04/controllers/e2e/user-event-type-slots.controller.e2e-spec.ts @@ -30,7 +30,7 @@ import { BookingsRepositoryFixture } from "test/fixtures/repository/bookings.rep import { EventTypesRepositoryFixture } from "test/fixtures/repository/event-types.repository.fixture"; import { MembershipRepositoryFixture } from "test/fixtures/repository/membership.repository.fixture"; import { OOORepositoryFixture } from "test/fixtures/repository/ooo.repository.fixture"; -import { SelectedSlotRepositoryFixture } from "test/fixtures/repository/selected-slots.repository.fixture"; +import { SelectedSlotRepositoryFixture } from "test/fixtures/repository/selected-slot.repository.fixture"; import { TeamRepositoryFixture } from "test/fixtures/repository/team.repository.fixture"; import { UserRepositoryFixture } from "test/fixtures/repository/users.repository.fixture"; import { randomString } from "test/utils/randomString";