feat: inject required repositories into AvailableSlotsService using dependency injection (#22413)

* feat: inject all repositories into AvailableSlotsService using dependency injection

- Create DI modules for SelectedSlotsRepository, TeamRepository, UserRepository, BookingRepository, EventTypeRepository, RoutingFormResponseRepository
- Update available-slots DI module to bind all 6 repositories
- Update DI container to load all new repository modules
- Replace all 10 direct repository instantiations with injected dependencies
- Add missing DI tokens for repository modules
- Expand IAvailableSlotsService interface to include all repository dependencies

This follows the same dependency injection pattern established in previous repository refactoring PRs and enables better testability and modularity by making all dependencies explicit and configurable.

Co-Authored-By: morgan@cal.com <morgan@cal.com>

* chore: DI available slots repo on api v2

* 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:
devin-ai-integration[bot]
2025-07-11 17:37:24 +03:00
committed by GitHub
co-authored by morgan@cal.com
parent a1571d01bd
commit 13cb99b7fe
30 changed files with 265 additions and 62 deletions
+1 -1
View File
@@ -38,7 +38,7 @@
"@axiomhq/winston": "^1.2.0",
"@calcom/platform-constants": "*",
"@calcom/platform-enums": "*",
"@calcom/platform-libraries": "npm:@calcom/platform-libraries@0.0.256",
"@calcom/platform-libraries": "npm:@calcom/platform-libraries@0.0.257",
"@calcom/platform-types": "*",
"@calcom/platform-utils": "*",
"@calcom/prisma": "*",
@@ -0,0 +1,28 @@
import { PrismaBookingRepository } from "@/lib/repositories/prisma-booking.repository";
import { PrismaEventTypeRepository } from "@/lib/repositories/prisma-event-type.repository";
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 { AvailableSlotsService } from "@/lib/services/available-slots.service";
import { PrismaModule } from "@/modules/prisma/prisma.module";
import { Module } from "@nestjs/common";
@Module({
imports: [PrismaModule],
providers: [
PrismaOOORepository,
PrismaScheduleRepository,
PrismaBookingRepository,
PrismaSelectedSlotsRepository,
PrismaUserRepository,
PrismaEventTypeRepository,
PrismaRoutingFormResponseRepository,
PrismaTeamRepository,
AvailableSlotsService,
],
exports: [AvailableSlotsService],
})
export class AvailableSlotsModule {}
@@ -0,0 +1,12 @@
import { PrismaWriteService } from "@/modules/prisma/prisma-write.service";
import { Injectable } from "@nestjs/common";
import { PrismaBookingRepository as PrismaBookingRepositoryLib } from "@calcom/platform-libraries/repositories";
import { PrismaClient } from "@calcom/prisma";
@Injectable()
export class PrismaBookingRepository extends PrismaBookingRepositoryLib {
constructor(private readonly dbWrite: PrismaWriteService) {
super(dbWrite.prisma as unknown as PrismaClient);
}
}
@@ -0,0 +1,12 @@
import { PrismaWriteService } from "@/modules/prisma/prisma-write.service";
import { Injectable } from "@nestjs/common";
import { PrismaEventTypeRepository as PrismaEventTypeRepositoryLib } from "@calcom/platform-libraries/repositories";
import { PrismaClient } from "@calcom/prisma";
@Injectable()
export class PrismaEventTypeRepository extends PrismaEventTypeRepositoryLib {
constructor(private readonly dbWrite: PrismaWriteService) {
super(dbWrite.prisma as unknown as PrismaClient);
}
}
@@ -1,11 +1,11 @@
import { PrismaWriteService } from "@/modules/prisma/prisma-write.service";
import { Injectable } from "@nestjs/common";
import { PrismaOOORepository } from "@calcom/platform-libraries/repositories";
import { PrismaOOORepository as PrismaOOORepositoryLib } from "@calcom/platform-libraries/repositories";
import { PrismaClient } from "@calcom/prisma";
@Injectable()
export class OOORepository extends PrismaOOORepository {
export class PrismaOOORepository extends PrismaOOORepositoryLib {
constructor(private readonly dbWrite: PrismaWriteService) {
super(dbWrite.prisma as unknown as PrismaClient);
}
@@ -0,0 +1,12 @@
import { PrismaWriteService } from "@/modules/prisma/prisma-write.service";
import { Injectable } from "@nestjs/common";
import { PrismaRoutingFormResponseRepository as PrismaRoutingFormResponseRepositoryLib } from "@calcom/platform-libraries/repositories";
import { PrismaClient } from "@calcom/prisma";
@Injectable()
export class PrismaRoutingFormResponseRepository extends PrismaRoutingFormResponseRepositoryLib {
constructor(private readonly dbWrite: PrismaWriteService) {
super(dbWrite.prisma as unknown as PrismaClient);
}
}
@@ -0,0 +1,12 @@
import { PrismaWriteService } from "@/modules/prisma/prisma-write.service";
import { Injectable } from "@nestjs/common";
import { PrismaScheduleRepository as PrismaScheduleRepositoryLib } from "@calcom/platform-libraries/repositories";
import { PrismaClient } from "@calcom/prisma";
@Injectable()
export class PrismaScheduleRepository extends PrismaScheduleRepositoryLib {
constructor(private readonly dbWrite: PrismaWriteService) {
super(dbWrite.prisma as unknown as PrismaClient);
}
}
@@ -0,0 +1,12 @@
import { PrismaWriteService } from "@/modules/prisma/prisma-write.service";
import { Injectable } from "@nestjs/common";
import { PrismaSelectedSlotsRepository as PrismaSelectedSlotsRepositoryLib } from "@calcom/platform-libraries/repositories";
import { PrismaClient } from "@calcom/prisma";
@Injectable()
export class PrismaSelectedSlotsRepository extends PrismaSelectedSlotsRepositoryLib {
constructor(private readonly dbWrite: PrismaWriteService) {
super(dbWrite.prisma as unknown as PrismaClient);
}
}
@@ -1,11 +1,11 @@
import { PrismaWriteService } from "@/modules/prisma/prisma-write.service";
import { Injectable } from "@nestjs/common";
import { PrismaScheduleRepository } from "@calcom/platform-libraries/repositories";
import { PrismaTeamRepository as PrismaTeamRepositoryLib } from "@calcom/platform-libraries/repositories";
import { PrismaClient } from "@calcom/prisma";
@Injectable()
export class ScheduleRepository extends PrismaScheduleRepository {
export class PrismaTeamRepository extends PrismaTeamRepositoryLib {
constructor(private readonly dbWrite: PrismaWriteService) {
super(dbWrite.prisma as unknown as PrismaClient);
}
@@ -0,0 +1,12 @@
import { PrismaWriteService } from "@/modules/prisma/prisma-write.service";
import { Injectable } from "@nestjs/common";
import { PrismaUserRepository as PrismaUserRepositoryLib } from "@calcom/platform-libraries/repositories";
import { PrismaClient } from "@calcom/prisma";
@Injectable()
export class PrismaUserRepository extends PrismaUserRepositoryLib {
constructor(private readonly dbWrite: PrismaWriteService) {
super(dbWrite.prisma as unknown as PrismaClient);
}
}
@@ -1,15 +0,0 @@
import { OOORepository } from "@/lib/repositories/PrismaOOORepository";
import { ScheduleRepository } from "@/lib/repositories/PrismaScheduleRepository";
import { Injectable } from "@nestjs/common";
import { AvailableSlotsService as BaseAvailableSlotsService } from "@calcom/platform-libraries/slots";
@Injectable()
export class AvailableSlotsService extends BaseAvailableSlotsService {
constructor(
private readonly oooRepoDependency: OOORepository,
private readonly scheduleRepoDependency: ScheduleRepository
) {
super({ oooRepo: oooRepoDependency, scheduleRepo: scheduleRepoDependency });
}
}
@@ -0,0 +1,36 @@
import { PrismaBookingRepository } from "@/lib/repositories/prisma-booking.repository";
import { PrismaEventTypeRepository } from "@/lib/repositories/prisma-event-type.repository";
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 { Injectable } from "@nestjs/common";
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 selectedSlotsRepository: PrismaSelectedSlotsRepository,
private readonly eventTypeRepository: PrismaEventTypeRepository,
private readonly userRepository: PrismaUserRepository
) {
super({
oooRepo: oooRepoDependency,
scheduleRepo: scheduleRepoDependency,
teamRepo: teamRepository,
routingFormResponseRepo: routingFormResponseRepository,
bookingRepo: bookingRepository,
selectedSlotsRepo: selectedSlotsRepository,
eventTypeRepo: eventTypeRepository,
userRepo: userRepository,
});
}
}
@@ -1,5 +1,5 @@
import { TRPC_ERROR_CODE, TRPC_ERROR_MAP, TRPCErrorCode } from "@/filters/trpc-exception.filter";
import { AvailableSlotsService } from "@/lib/services/AvailableSlots";
import { AvailableSlotsService } from "@/lib/services/available-slots.service";
import { SlotsOutputService_2024_04_15 } from "@/modules/slots/slots-2024-04-15/services/slots-output.service";
import type { RangeSlots, TimeSlots } from "@/modules/slots/slots-2024-04-15/services/slots-output.service";
import { SlotsWorkerService_2024_04_15 } from "@/modules/slots/slots-2024-04-15/services/slots-worker.service";
@@ -1,7 +1,5 @@
import { EventTypesModule_2024_04_15 } from "@/ee/event-types/event-types_2024_04_15/event-types.module";
import { OOORepository as PrismaOOORepository } from "@/lib/repositories/PrismaOOORepository";
import { ScheduleRepository as PrismaScheduleRepository } from "@/lib/repositories/PrismaScheduleRepository";
import { AvailableSlotsService } from "@/lib/services/AvailableSlots";
import { AvailableSlotsModule } from "@/lib/modules/available-slots.module";
import { PrismaModule } from "@/modules/prisma/prisma.module";
import { SlotsController_2024_04_15 } from "@/modules/slots/slots-2024-04-15/controllers/slots.controller";
import { SlotsOutputService_2024_04_15 } from "@/modules/slots/slots-2024-04-15/services/slots-output.service";
@@ -11,15 +9,12 @@ import { SlotsRepository_2024_04_15 } from "@/modules/slots/slots-2024-04-15/slo
import { Module } from "@nestjs/common";
@Module({
imports: [PrismaModule, EventTypesModule_2024_04_15],
imports: [PrismaModule, EventTypesModule_2024_04_15, AvailableSlotsModule],
providers: [
SlotsRepository_2024_04_15,
SlotsService_2024_04_15,
SlotsOutputService_2024_04_15,
SlotsWorkerService_2024_04_15,
PrismaOOORepository,
PrismaScheduleRepository,
AvailableSlotsService,
],
controllers: [SlotsController_2024_04_15],
exports: [SlotsService_2024_04_15],
@@ -1,9 +1,7 @@
// apps/api/v2/src/modules/slots/slots-2024-04-15/workers/slots-worker.module.ts
// Needed if ConfigService is used anywhere
import appConfig from "@/config/app";
import { OOORepository as PrismaOOORepository } from "@/lib/repositories/PrismaOOORepository";
import { ScheduleRepository as PrismaScheduleRepository } from "@/lib/repositories/PrismaScheduleRepository";
import { AvailableSlotsService } from "@/lib/services/AvailableSlots";
import { AvailableSlotsModule } from "@/lib/modules/available-slots.module";
import { PrismaModule } from "@/modules/prisma/prisma.module";
import { Module, Logger } from "@nestjs/common";
import { ConfigModule } from "@nestjs/config";
@@ -18,7 +16,8 @@ import { SentryModule } from "@sentry/nestjs/setup";
load: [appConfig],
}),
PrismaModule,
AvailableSlotsModule,
],
providers: [Logger, PrismaOOORepository, PrismaScheduleRepository, AvailableSlotsService],
providers: [Logger],
})
export class SlotsWorkerModule {}
@@ -1,4 +1,4 @@
import { AvailableSlotsService } from "@/lib/services/AvailableSlots";
import { AvailableSlotsService } from "@/lib/services/available-slots.service";
import { Logger } from "@nestjs/common";
import { NestFactory } from "@nestjs/core";
import { IncomingMessage } from "http";
@@ -1,5 +1,5 @@
import { EventTypesRepository_2024_06_14 } from "@/ee/event-types/event-types_2024_06_14/event-types.repository";
import { AvailableSlotsService } from "@/lib/services/AvailableSlots";
import { AvailableSlotsService } from "@/lib/services/available-slots.service";
import { MembershipsRepository } from "@/modules/memberships/memberships.repository";
import { MembershipsService } from "@/modules/memberships/services/memberships.service";
import { TimeSlots } from "@/modules/slots/slots-2024-04-15/services/slots-output.service";
@@ -1,7 +1,5 @@
import { EventTypesModule_2024_06_14 } from "@/ee/event-types/event-types_2024_06_14/event-types.module";
import { OOORepository as PrismaOOORepository } from "@/lib/repositories/PrismaOOORepository";
import { ScheduleRepository as PrismaScheduleRepository } from "@/lib/repositories/PrismaScheduleRepository";
import { AvailableSlotsService } from "@/lib/services/AvailableSlots";
import { AvailableSlotsModule } from "@/lib/modules/available-slots.module";
import { MembershipsModule } from "@/modules/memberships/memberships.module";
import { OrganizationsRepository } from "@/modules/organizations/index/organizations.repository";
import { OrganizationsTeamsRepository } from "@/modules/organizations/teams/index/organizations-teams.repository";
@@ -26,6 +24,7 @@ import { Module } from "@nestjs/common";
TeamsModule,
MembershipsModule,
TeamsEventTypesModule,
AvailableSlotsModule,
],
providers: [
SlotsRepository_2024_09_04,
@@ -36,9 +35,6 @@ import { Module } from "@nestjs/common";
OrganizationsUsersRepository,
OrganizationsRepository,
OrganizationsTeamsRepository,
PrismaOOORepository,
PrismaScheduleRepository,
AvailableSlotsService,
],
controllers: [SlotsController_2024_09_04],
exports: [SlotsService_2024_09_04],
@@ -5,13 +5,25 @@ import { prismaModule } from "@calcom/prisma/prisma.module";
import type { AvailableSlotsService } from "@calcom/trpc/server/routers/viewer/slots/util";
import { availableSlotsModule } from "../modules/available-slots";
import { bookingRepositoryModule } from "../modules/booking";
import { eventTypeRepositoryModule } from "../modules/eventType";
import { oooRepositoryModule } from "../modules/ooo";
import { routingFormResponseRepositoryModule } from "../modules/routingFormResponse";
import { scheduleRepositoryModule } from "../modules/schedule";
import { selectedSlotsRepositoryModule } from "../modules/selectedSlots";
import { teamRepositoryModule } from "../modules/team";
import { userRepositoryModule } from "../modules/user";
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.TEAM_REPOSITORY_MODULE, teamRepositoryModule);
container.load(DI_TOKENS.USER_REPOSITORY_MODULE, userRepositoryModule);
container.load(DI_TOKENS.BOOKING_REPOSITORY_MODULE, bookingRepositoryModule);
container.load(DI_TOKENS.EVENT_TYPE_REPOSITORY_MODULE, eventTypeRepositoryModule);
container.load(DI_TOKENS.ROUTING_FORM_RESPONSE_REPOSITORY_MODULE, routingFormResponseRepositoryModule);
container.load(DI_TOKENS.AVAILABLE_SLOTS_SERVICE_MODULE, availableSlotsModule);
export function getAvailableSlotsService() {
@@ -9,4 +9,10 @@ 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,
teamRepo: DI_TOKENS.TEAM_REPOSITORY,
userRepo: DI_TOKENS.USER_REPOSITORY,
bookingRepo: DI_TOKENS.BOOKING_REPOSITORY,
eventTypeRepo: DI_TOKENS.EVENT_TYPE_REPOSITORY,
routingFormResponseRepo: DI_TOKENS.ROUTING_FORM_RESPONSE_REPOSITORY,
} satisfies Record<keyof IAvailableSlotsService, symbol>);
+9
View File
@@ -0,0 +1,9 @@
import { createModule } from "@evyweb/ioctopus";
import { DI_TOKENS } from "@calcom/lib/di/tokens";
import { BookingRepository } from "@calcom/lib/server/repository/booking";
export const bookingRepositoryModule = createModule();
bookingRepositoryModule
.bind(DI_TOKENS.BOOKING_REPOSITORY)
.toClass(BookingRepository, [DI_TOKENS.PRISMA_CLIENT]);
+9
View File
@@ -0,0 +1,9 @@
import { createModule } from "@evyweb/ioctopus";
import { DI_TOKENS } from "@calcom/lib/di/tokens";
import { EventTypeRepository } from "@calcom/lib/server/repository/eventType";
export const eventTypeRepositoryModule = createModule();
eventTypeRepositoryModule
.bind(DI_TOKENS.EVENT_TYPE_REPOSITORY)
.toClass(EventTypeRepository, [DI_TOKENS.PRISMA_CLIENT]);
@@ -0,0 +1,9 @@
import { createModule } from "@evyweb/ioctopus";
import { DI_TOKENS } from "@calcom/lib/di/tokens";
import { RoutingFormResponseRepository } from "@calcom/lib/server/repository/formResponse";
export const routingFormResponseRepositoryModule = createModule();
routingFormResponseRepositoryModule
.bind(DI_TOKENS.ROUTING_FORM_RESPONSE_REPOSITORY)
.toClass(RoutingFormResponseRepository, [DI_TOKENS.PRISMA_CLIENT]);
+9
View File
@@ -0,0 +1,9 @@
import { createModule } from "@evyweb/ioctopus";
import { DI_TOKENS } from "@calcom/lib/di/tokens";
import { SelectedSlotsRepository } from "@calcom/lib/server/repository/selectedSlots";
export const selectedSlotsRepositoryModule = createModule();
selectedSlotsRepositoryModule
.bind(DI_TOKENS.SELECTED_SLOTS_REPOSITORY)
.toClass(SelectedSlotsRepository, [DI_TOKENS.PRISMA_CLIENT]);
+7
View File
@@ -0,0 +1,7 @@
import { createModule } from "@evyweb/ioctopus";
import { DI_TOKENS } from "@calcom/lib/di/tokens";
import { TeamRepository } from "@calcom/lib/server/repository/team";
export const teamRepositoryModule = createModule();
teamRepositoryModule.bind(DI_TOKENS.TEAM_REPOSITORY).toClass(TeamRepository, [DI_TOKENS.PRISMA_CLIENT]);
+7
View File
@@ -0,0 +1,7 @@
import { createModule } from "@evyweb/ioctopus";
import { DI_TOKENS } from "@calcom/lib/di/tokens";
import { UserRepository } from "@calcom/lib/server/repository/user";
export const userRepositoryModule = createModule();
userRepositoryModule.bind(DI_TOKENS.USER_REPOSITORY).toClass(UserRepository, [DI_TOKENS.PRISMA_CLIENT]);
+12
View File
@@ -6,6 +6,18 @@ 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"),
TEAM_REPOSITORY: Symbol("TeamRepository"),
TEAM_REPOSITORY_MODULE: Symbol("TeamRepositoryModule"),
USER_REPOSITORY: Symbol("UserRepository"),
USER_REPOSITORY_MODULE: Symbol("UserRepositoryModule"),
BOOKING_REPOSITORY: Symbol("BookingRepository"),
BOOKING_REPOSITORY_MODULE: Symbol("BookingRepositoryModule"),
EVENT_TYPE_REPOSITORY: Symbol("EventTypeRepository"),
EVENT_TYPE_REPOSITORY_MODULE: Symbol("EventTypeRepositoryModule"),
ROUTING_FORM_RESPONSE_REPOSITORY: Symbol("RoutingFormResponseRepository"),
ROUTING_FORM_RESPONSE_REPOSITORY_MODULE: Symbol("RoutingFormResponseRepositoryModule"),
AVAILABLE_SLOTS_SERVICE: Symbol("AvailableSlotsService"),
AVAILABLE_SLOTS_SERVICE_MODULE: Symbol("AvailableSlotsModule"),
};
@@ -1,2 +1,8 @@
export { PrismaOOORepository } from "@calcom/lib/server/repository/ooo";
export { ScheduleRepository as PrismaScheduleRepository } from "@calcom/lib/server/repository/schedule";
export { BookingRepository as PrismaBookingRepository } from "@calcom/lib/server/repository/booking";
export { EventTypeRepository as PrismaEventTypeRepository } from "@calcom/lib/server/repository/eventType";
export { RoutingFormResponseRepository as PrismaRoutingFormResponseRepository } from "@calcom/lib/server/repository/formResponse";
export { SelectedSlotsRepository 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";
@@ -41,16 +41,16 @@ 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 } from "@calcom/lib/server/repository/booking";
import { EventTypeRepository } from "@calcom/lib/server/repository/eventType";
import { RoutingFormResponseRepository } from "@calcom/lib/server/repository/formResponse";
import type { BookingRepository } from "@calcom/lib/server/repository/booking";
import type { EventTypeRepository } from "@calcom/lib/server/repository/eventType";
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 { SelectedSlotsRepository } from "@calcom/lib/server/repository/selectedSlots";
import { TeamRepository } from "@calcom/lib/server/repository/team";
import { UserRepository, withSelectedCalendars } from "@calcom/lib/server/repository/user";
import type { SelectedSlotsRepository } 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";
import getSlots from "@calcom/lib/slots";
import prisma from "@calcom/prisma";
import { PeriodType } from "@calcom/prisma/client";
import { SchedulingType } from "@calcom/prisma/enums";
import type { EventBusyDate, EventBusyDetails } from "@calcom/types/Calendar";
@@ -92,6 +92,12 @@ export type GetAvailableSlotsResponse = Awaited<
export interface IAvailableSlotsService {
oooRepo: PrismaOOORepository;
scheduleRepo: ScheduleRepository;
selectedSlotsRepo: SelectedSlotsRepository;
teamRepo: TeamRepository;
userRepo: UserRepository;
bookingRepo: BookingRepository;
eventTypeRepo: EventTypeRepository;
routingFormResponseRepo: RoutingFormResponseRepository;
}
export class AvailableSlotsService {
@@ -107,7 +113,7 @@ export class AvailableSlotsService {
eventTypeId: number;
}) {
const currentTimeInUtc = dayjs.utc().format();
const slotsRepo = new SelectedSlotsRepository(prisma);
const slotsRepo = this.dependencies.selectedSlotsRepo;
const unexpiredSelectedSlots =
(await slotsRepo.findManyUnexpiredSlots({
@@ -142,7 +148,7 @@ export class AvailableSlotsService {
}
const dynamicEventType = getDefaultEvent(input.eventTypeSlug);
const userRepo = new UserRepository(prisma);
const userRepo = this.dependencies.userRepo;
const usersForDynamicEventType = await userRepo.findManyUsersForDynamicEventType({
currentOrgDomain: isValidOrgDomain ? currentOrgDomain : null,
usernameList: Array.isArray(input.usernameList)
@@ -212,7 +218,7 @@ export class AvailableSlotsService {
return null;
}
const eventTypeRepo = new EventTypeRepository(prisma);
const eventTypeRepo = this.dependencies.eventTypeRepo;
return await eventTypeRepo.findForSlots({ id: eventTypeId });
}
@@ -250,7 +256,7 @@ export class AvailableSlotsService {
) {
const { currentOrgDomain, isValidOrgDomain } = organizationDetails;
log.info("getUserIdFromUsername", safeStringify({ organizationDetails, username }));
const userRepo = new UserRepository(prisma);
const userRepo = this.dependencies.userRepo;
const [user] = await userRepo.findUsersByUsername({
usernameList: [username],
orgSlug: isValidOrgDomain ? currentOrgDomain : null,
@@ -284,7 +290,7 @@ export class AvailableSlotsService {
organizationDetails ?? { currentOrgDomain: null, isValidOrgDomain: false }
);
}
const eventTypeRepo = new EventTypeRepository(prisma);
const eventTypeRepo = this.dependencies.eventTypeRepo;
const eventType = await eventTypeRepo.findFirstEventTypeId({ slug: eventTypeSlug, teamId, userId });
if (!eventType) {
throw new TRPCError({ code: "NOT_FOUND" });
@@ -297,7 +303,7 @@ export class AvailableSlotsService {
organizationDetails: { currentOrgDomain: string | null; isValidOrgDomain: boolean }
) {
const { currentOrgDomain, isValidOrgDomain } = organizationDetails;
const teamRepo = new TeamRepository(prisma);
const teamRepo = this.dependencies.teamRepo;
const team = await teamRepo.findFirstBySlugAndParentSlug({
slug,
parentSlug: isValidOrgDomain && currentOrgDomain ? currentOrgDomain : null,
@@ -510,7 +516,7 @@ export class AvailableSlotsService {
bookingLimits
);
const bookingRepo = new BookingRepository(prisma);
const bookingRepo = this.dependencies.bookingRepo;
const bookings = await bookingRepo.getAllAcceptedTeamBookingsOfUsers({
users,
teamId,
@@ -713,7 +719,7 @@ 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 bookingRepo = this.dependencies.bookingRepo;
const [currentBookingsAllUsers, outOfOfficeDaysAllUsers] = await Promise.all([
bookingRepo.findAllExistingBookingsForEventTypeBetween({
startDate: startTimeDate,
@@ -940,12 +946,12 @@ export class AvailableSlotsService {
let routingFormResponse = null;
if (routingFormResponseId) {
const formResponseRepo = new RoutingFormResponseRepository(prisma);
const formResponseRepo = this.dependencies.routingFormResponseRepo;
routingFormResponse = await formResponseRepo.findFormResponseIncludeForm({
routingFormResponseId,
});
} else if (queuedFormResponseId) {
const formResponseRepo = new RoutingFormResponseRepository(prisma);
const formResponseRepo = this.dependencies.routingFormResponseRepo;
routingFormResponse = await formResponseRepo.findQueuedFormResponseIncludeForm({
queuedFormResponseId,
});
+5 -5
View File
@@ -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.256"
"@calcom/platform-libraries": "npm:@calcom/platform-libraries@0.0.257"
"@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.256":
version: 0.0.256
resolution: "@calcom/platform-libraries@npm:0.0.256"
"@calcom/platform-libraries@npm:@calcom/platform-libraries@0.0.257":
version: 0.0.257
resolution: "@calcom/platform-libraries@npm:0.0.257"
dependencies:
"@calcom/features": "*"
"@calcom/lib": "*"
checksum: 4c0b238ce803f7c660803bfcf4bc90435aef76a2efd1a476c10755a57e720354c739e88e3eaf44b176369750b211f81fc4a83f3eea452bac1d512bbf808a1085
checksum: d45647591a26b6a73b6ae7602d8b8e59d87339de0e49468737437ffdd716fbd953898cd59a1eff8938326eba9ca895c28990bc91355aa55006980a2e716ddfd0
languageName: node
linkType: hard