diff --git a/packages/features/bookings/lib/di/containers/RegularBookingServiceContainer.ts b/packages/features/bookings/lib/di/containers/RegularBookingServiceContainer.ts deleted file mode 100644 index 3bea0eec2c..0000000000 --- a/packages/features/bookings/lib/di/containers/RegularBookingServiceContainer.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { createContainer } from "@evyweb/ioctopus"; - -import { DI_TOKENS } from "@calcom/lib/di/tokens"; - -import type { RegularBookingService } from "../modules/RegularBookingServiceModule"; -import { - regularBookingServiceModule, - loadModuleDeps, - moduleToken, -} from "../modules/RegularBookingServiceModule"; - -const regularBookingServiceContainer = createContainer(); - -regularBookingServiceContainer.load(DI_TOKENS.REGULAR_BOOKING_SERVICE_MODULE, regularBookingServiceModule); - -export function getRegularBookingService(): RegularBookingService { - loadModuleDeps(regularBookingServiceContainer); - - return regularBookingServiceContainer.get(moduleToken); -} diff --git a/packages/features/bookings/lib/di/modules/RegularBookingServiceModule.ts b/packages/features/bookings/lib/di/modules/RegularBookingServiceModule.ts deleted file mode 100644 index 7b9ec65ef4..0000000000 --- a/packages/features/bookings/lib/di/modules/RegularBookingServiceModule.ts +++ /dev/null @@ -1,39 +0,0 @@ -import type { Container } from "@evyweb/ioctopus"; -import { createModule } from "@evyweb/ioctopus"; - -import { bookingRepositoryModule } from "@calcom/lib/di/modules/Booking"; -import { cacheModule } from "@calcom/lib/di/modules/Cache"; -import { checkBookingAndDurationLimitsModule } from "@calcom/lib/di/modules/CheckBookingAndDurationLimits"; -import { checkBookingLimitsModule } from "@calcom/lib/di/modules/CheckBookingLimits"; -import { featuresRepositoryModule } from "@calcom/lib/di/modules/Features"; -import { DI_TOKENS } from "@calcom/lib/di/tokens"; -import { prismaModule } from "@calcom/prisma/prisma.module"; - -import { RegularBookingService } from "../../handleNewBooking"; - -export const regularBookingServiceModule = createModule(); -const moduleToken = DI_TOKENS.REGULAR_BOOKING_SERVICE; -regularBookingServiceModule.bind(moduleToken).toClass(RegularBookingService, { - cacheService: DI_TOKENS.CACHE_SERVICE, - checkBookingAndDurationLimitsService: DI_TOKENS.CHECK_BOOKING_AND_DURATION_LIMITS_SERVICE, - prismaClient: DI_TOKENS.PRISMA_CLIENT, - bookingRepository: DI_TOKENS.BOOKING_REPOSITORY, - featuresRepository: DI_TOKENS.FEATURES_REPOSITORY, - checkBookingLimitsService: DI_TOKENS.CHECK_BOOKING_LIMITS_SERVICE, -}); - -// Load the dependencies defined for the module above -function loadModuleDeps(container: Container) { - container.load(DI_TOKENS.CACHE_SERVICE_MODULE, cacheModule); - container.load( - DI_TOKENS.CHECK_BOOKING_AND_DURATION_LIMITS_SERVICE_MODULE, - checkBookingAndDurationLimitsModule - ); - container.load(DI_TOKENS.PRISMA_MODULE, prismaModule); - container.load(DI_TOKENS.BOOKING_REPOSITORY_MODULE, bookingRepositoryModule); - container.load(DI_TOKENS.FEATURES_REPOSITORY_MODULE, featuresRepositoryModule); - container.load(DI_TOKENS.CHECK_BOOKING_LIMITS_SERVICE_MODULE, checkBookingLimitsModule); -} - -export { loadModuleDeps, moduleToken }; -export type { RegularBookingService }; diff --git a/packages/features/redis/di/redisModule.ts b/packages/features/redis/di/redisModule.ts index 32545b0c19..8301285d7c 100644 --- a/packages/features/redis/di/redisModule.ts +++ b/packages/features/redis/di/redisModule.ts @@ -1,5 +1,4 @@ -import { createModule } from "@evyweb/ioctopus"; - +import { createModule } from "@calcom/lib/di/di"; import { DI_TOKENS } from "@calcom/lib/di/tokens"; import { NoopRedisService } from "../NoopRedisService"; diff --git a/packages/features/bookings/lib/di/containers/InstantBookingCreateServiceContainer.ts b/packages/lib/di/bookings/containers/InstantBookingCreateService.container.ts similarity index 59% rename from packages/features/bookings/lib/di/containers/InstantBookingCreateServiceContainer.ts rename to packages/lib/di/bookings/containers/InstantBookingCreateService.container.ts index 79715e4d20..63bf89ce2a 100644 --- a/packages/features/bookings/lib/di/containers/InstantBookingCreateServiceContainer.ts +++ b/packages/lib/di/bookings/containers/InstantBookingCreateService.container.ts @@ -1,9 +1,10 @@ -import { createContainer } from "@evyweb/ioctopus"; - import { DI_TOKENS } from "@calcom/lib/di/tokens"; -import type { InstantBookingCreateService } from "../modules/InstantBookingCreateServiceModule"; -import { instantBookingCreateServiceModule } from "../modules/InstantBookingCreateServiceModule"; +import { createContainer } from "../../di"; +import { + type InstantBookingCreateService, + instantBookingCreateServiceModule, +} from "../modules/InstantBookingCreateService.module"; const container = createContainer(); container.load(DI_TOKENS.INSTANT_BOOKING_CREATE_SERVICE_MODULE, instantBookingCreateServiceModule); diff --git a/packages/features/bookings/lib/di/containers/RecurringBookingServiceContainer.ts b/packages/lib/di/bookings/containers/RecurringBookingService.container.ts similarity index 84% rename from packages/features/bookings/lib/di/containers/RecurringBookingServiceContainer.ts rename to packages/lib/di/bookings/containers/RecurringBookingService.container.ts index 90bb64829d..bf2f84aad4 100644 --- a/packages/features/bookings/lib/di/containers/RecurringBookingServiceContainer.ts +++ b/packages/lib/di/bookings/containers/RecurringBookingService.container.ts @@ -1,5 +1,3 @@ -import { createContainer } from "@evyweb/ioctopus"; - import { bookingRepositoryModule } from "@calcom/lib/di/modules/Booking"; import { cacheModule } from "@calcom/lib/di/modules/Cache"; import { checkBookingAndDurationLimitsModule } from "@calcom/lib/di/modules/CheckBookingAndDurationLimits"; @@ -8,8 +6,11 @@ import { featuresRepositoryModule } from "@calcom/lib/di/modules/Features"; import { DI_TOKENS } from "@calcom/lib/di/tokens"; import { prismaModule } from "@calcom/prisma/prisma.module"; -import type { RecurringBookingService } from "../modules/RecurringBookingServiceModule"; -import { recurringBookingServiceModule } from "../modules/RecurringBookingServiceModule"; +import { createContainer } from "../../di"; +import { + type RecurringBookingService, + recurringBookingServiceModule, +} from "../modules/RecurringBookingService.module"; const container = createContainer(); container.load(DI_TOKENS.PRISMA_MODULE, prismaModule); diff --git a/packages/lib/di/bookings/containers/RegularBookingService.container.ts b/packages/lib/di/bookings/containers/RegularBookingService.container.ts new file mode 100644 index 0000000000..b4df8cb790 --- /dev/null +++ b/packages/lib/di/bookings/containers/RegularBookingService.container.ts @@ -0,0 +1,13 @@ +import { createContainer } from "../../di"; +import { + type RegularBookingService, + regularBookingServiceModule, +} from "../modules/RegularBookingService.module"; + +const regularBookingServiceContainer = createContainer(); + +export function getRegularBookingService(): RegularBookingService { + regularBookingServiceModule.loadModule(regularBookingServiceContainer); + + return regularBookingServiceContainer.get(regularBookingServiceModule.token); +} diff --git a/packages/features/bookings/lib/di/modules/InstantBookingCreateServiceModule.ts b/packages/lib/di/bookings/modules/InstantBookingCreateService.module.ts similarity index 88% rename from packages/features/bookings/lib/di/modules/InstantBookingCreateServiceModule.ts rename to packages/lib/di/bookings/modules/InstantBookingCreateService.module.ts index 57b2cc72f6..c20327944b 100644 --- a/packages/features/bookings/lib/di/modules/InstantBookingCreateServiceModule.ts +++ b/packages/lib/di/bookings/modules/InstantBookingCreateService.module.ts @@ -1,8 +1,8 @@ -import { createModule } from "@evyweb/ioctopus"; - import { InstantBookingCreateService } from "@calcom/features/instant-meeting/handleInstantMeeting"; import { DI_TOKENS } from "@calcom/lib/di/tokens"; +import { createModule } from "../../di"; + export const instantBookingCreateServiceModule = createModule(); instantBookingCreateServiceModule diff --git a/packages/features/bookings/lib/di/modules/RecurringBookingServiceModule.ts b/packages/lib/di/bookings/modules/RecurringBookingService.module.ts similarity index 70% rename from packages/features/bookings/lib/di/modules/RecurringBookingServiceModule.ts rename to packages/lib/di/bookings/modules/RecurringBookingService.module.ts index c8350cdb94..8ff9fdc255 100644 --- a/packages/features/bookings/lib/di/modules/RecurringBookingServiceModule.ts +++ b/packages/lib/di/bookings/modules/RecurringBookingService.module.ts @@ -1,8 +1,7 @@ -import { createModule } from "@evyweb/ioctopus"; - +import { RecurringBookingService } from "@calcom/features/bookings/lib/handleNewRecurringBooking"; import { DI_TOKENS } from "@calcom/lib/di/tokens"; -import { RecurringBookingService } from "../../handleNewRecurringBooking"; +import { createModule } from "../../di"; export const recurringBookingServiceModule = createModule(); diff --git a/packages/lib/di/bookings/modules/RegularBookingService.module.ts b/packages/lib/di/bookings/modules/RegularBookingService.module.ts new file mode 100644 index 0000000000..d1e3c920ad --- /dev/null +++ b/packages/lib/di/bookings/modules/RegularBookingService.module.ts @@ -0,0 +1,35 @@ +import { RegularBookingService } from "@calcom/features/bookings/lib/handleNewBooking"; +import { moduleLoader as bookingRepositoryModuleLoader } from "@calcom/lib/di/modules/Booking"; +import { moduleLoader as cacheModuleLoader } from "@calcom/lib/di/modules/Cache"; +import { moduleLoader as checkBookingAndDurationLimitsModuleLoader } from "@calcom/lib/di/modules/CheckBookingAndDurationLimits"; +import { moduleLoader as checkBookingLimitsModuleLoader } from "@calcom/lib/di/modules/CheckBookingLimits"; +import { moduleLoader as featuresRepositoryModuleLoader } from "@calcom/lib/di/modules/Features"; +import { DI_TOKENS } from "@calcom/lib/di/tokens"; +import { moduleLoader as prismaModuleLoader } from "@calcom/prisma/prisma.module"; + +import { bindModuleToClassOnToken, createModule } from "../../di"; + +const thisModule = createModule(); +const token = DI_TOKENS.REGULAR_BOOKING_SERVICE; +const moduleToken = DI_TOKENS.REGULAR_BOOKING_SERVICE_MODULE; +const loadModule = bindModuleToClassOnToken({ + module: thisModule, + moduleToken, + token, + classs: RegularBookingService, + depsMap: { + cacheService: cacheModuleLoader, + checkBookingAndDurationLimitsService: checkBookingAndDurationLimitsModuleLoader, + prismaClient: prismaModuleLoader, + bookingRepository: bookingRepositoryModuleLoader, + featuresRepository: featuresRepositoryModuleLoader, + checkBookingLimitsService: checkBookingLimitsModuleLoader, + }, +}); + +export const regularBookingServiceModule = { + token, + loadModule, +}; + +export type { RegularBookingService }; diff --git a/packages/lib/di/bookings/tokens.ts b/packages/lib/di/bookings/tokens.ts new file mode 100644 index 0000000000..84f8827cc3 --- /dev/null +++ b/packages/lib/di/bookings/tokens.ts @@ -0,0 +1,8 @@ +export const BOOKING_DI_TOKENS = { + REGULAR_BOOKING_SERVICE: Symbol("RegularBookingService"), + REGULAR_BOOKING_SERVICE_MODULE: Symbol("RegularBookingServiceModule"), + RECURRING_BOOKING_SERVICE: Symbol("RecurringBookingService"), + RECURRING_BOOKING_SERVICE_MODULE: Symbol("RecurringBookingServiceModule"), + INSTANT_BOOKING_CREATE_SERVICE: Symbol("InstantBookingCreateService"), + INSTANT_BOOKING_CREATE_SERVICE_MODULE: Symbol("InstantBookingCreateServiceModule"), +}; diff --git a/packages/lib/di/containers/AvailableSlots.ts b/packages/lib/di/containers/AvailableSlots.ts index ca858ea970..99e6eb1495 100644 --- a/packages/lib/di/containers/AvailableSlots.ts +++ b/packages/lib/di/containers/AvailableSlots.ts @@ -1,10 +1,9 @@ -import { createContainer } from "@evyweb/ioctopus"; - import { redisModule } from "@calcom/features/redis/di/redisModule"; import { DI_TOKENS } from "@calcom/lib/di/tokens"; import { prismaModule } from "@calcom/prisma/prisma.module"; import type { AvailableSlotsService } from "@calcom/trpc/server/routers/viewer/slots/util"; +import { createContainer } from "../di"; import { availableSlotsModule } from "../modules/AvailableSlots"; import { bookingRepositoryModule } from "../modules/Booking"; import { busyTimesModule } from "../modules/BusyTimes"; diff --git a/packages/lib/di/containers/BookingLimits.ts b/packages/lib/di/containers/BookingLimits.ts index aabedde8b5..f1e5fc828a 100644 --- a/packages/lib/di/containers/BookingLimits.ts +++ b/packages/lib/di/containers/BookingLimits.ts @@ -1,10 +1,9 @@ -import { createContainer } from "@evyweb/ioctopus"; - import { DI_TOKENS } from "@calcom/lib/di/tokens"; import { prismaModule } from "@calcom/prisma/prisma.module"; import type { CheckBookingAndDurationLimitsService } from "../../../features/bookings/lib/handleNewBooking/checkBookingAndDurationLimits"; import type { CheckBookingLimitsService } from "../../intervalLimits/server/checkBookingLimits"; +import { createContainer } from "../di"; import { bookingRepositoryModule } from "../modules/Booking"; import { checkBookingAndDurationLimitsModule } from "../modules/CheckBookingAndDurationLimits"; import { checkBookingLimitsModule } from "../modules/CheckBookingLimits"; diff --git a/packages/lib/di/containers/BusyTimes.ts b/packages/lib/di/containers/BusyTimes.ts index c8a83300c1..c63e39a099 100644 --- a/packages/lib/di/containers/BusyTimes.ts +++ b/packages/lib/di/containers/BusyTimes.ts @@ -1,9 +1,8 @@ -import { createContainer } from "@evyweb/ioctopus"; - import { DI_TOKENS } from "@calcom/lib/di/tokens"; import { prismaModule } from "@calcom/prisma/prisma.module"; import type { BusyTimesService } from "../../getBusyTimes"; +import { createContainer } from "../di"; import { bookingRepositoryModule } from "../modules/Booking"; import { busyTimesModule } from "../modules/BusyTimes"; diff --git a/packages/lib/di/containers/Cache.ts b/packages/lib/di/containers/Cache.ts index 002255a900..52bae05781 100644 --- a/packages/lib/di/containers/Cache.ts +++ b/packages/lib/di/containers/Cache.ts @@ -1,9 +1,8 @@ -import { createContainer } from "@evyweb/ioctopus"; - import { DI_TOKENS } from "@calcom/lib/di/tokens"; import { prismaModule } from "@calcom/prisma/prisma.module"; import type { CacheService } from "../../../features/calendar-cache/lib/getShouldServeCache"; +import { createContainer } from "../di"; import { cacheModule } from "../modules/Cache"; import { featuresRepositoryModule } from "../modules/Features"; diff --git a/packages/lib/di/containers/FilterHosts.ts b/packages/lib/di/containers/FilterHosts.ts index c83de8841d..c84f8cf2d7 100644 --- a/packages/lib/di/containers/FilterHosts.ts +++ b/packages/lib/di/containers/FilterHosts.ts @@ -1,9 +1,8 @@ -import { createContainer } from "@evyweb/ioctopus"; - import { DI_TOKENS } from "@calcom/lib/di/tokens"; import { prismaModule } from "@calcom/prisma/prisma.module"; import type { FilterHostsService } from "../../bookings/filterHostsBySameRoundRobinHost"; +import { createContainer } from "../di"; import { bookingRepositoryModule } from "../modules/Booking"; import { filterHostsModule } from "../modules/FilterHosts"; diff --git a/packages/lib/di/containers/GetUserAvailability.ts b/packages/lib/di/containers/GetUserAvailability.ts index e30143e4be..536346fa28 100644 --- a/packages/lib/di/containers/GetUserAvailability.ts +++ b/packages/lib/di/containers/GetUserAvailability.ts @@ -1,10 +1,9 @@ -import { createContainer } from "@evyweb/ioctopus"; - import { redisModule } from "@calcom/features/redis/di/redisModule"; import { DI_TOKENS } from "@calcom/lib/di/tokens"; import { prismaModule } from "@calcom/prisma/prisma.module"; import type { UserAvailabilityService } from "../../getUserAvailability"; +import { createContainer } from "../di"; import { bookingRepositoryModule } from "../modules/Booking"; import { busyTimesModule } from "../modules/BusyTimes"; import { eventTypeRepositoryModule } from "../modules/EventType"; diff --git a/packages/lib/di/containers/InsightsBooking.ts b/packages/lib/di/containers/InsightsBooking.ts index a5fe712d51..1e9881a1db 100644 --- a/packages/lib/di/containers/InsightsBooking.ts +++ b/packages/lib/di/containers/InsightsBooking.ts @@ -1,5 +1,3 @@ -import { createContainer } from "@evyweb/ioctopus"; - import { DI_TOKENS } from "@calcom/lib/di/tokens"; import type { InsightsBookingServicePublicOptions, @@ -9,6 +7,7 @@ import type { import type { InsightsBookingService } from "@calcom/lib/server/service/InsightsBookingDIService"; import { prismaModule } from "@calcom/prisma/prisma.module"; +import { createContainer } from "../di"; import { insightsBookingModule } from "../modules/InsightsBooking"; export function getInsightsBookingService({ diff --git a/packages/lib/di/containers/InsightsRouting.ts b/packages/lib/di/containers/InsightsRouting.ts index 53013cb0ad..2f341ab6de 100644 --- a/packages/lib/di/containers/InsightsRouting.ts +++ b/packages/lib/di/containers/InsightsRouting.ts @@ -1,5 +1,3 @@ -import { createContainer } from "@evyweb/ioctopus"; - import { DI_TOKENS } from "@calcom/lib/di/tokens"; import type { InsightsRoutingServicePublicOptions, @@ -9,6 +7,7 @@ import type { import type { InsightsRoutingService } from "@calcom/lib/server/service/InsightsRoutingDIService"; import { prismaModule } from "@calcom/prisma/prisma.module"; +import { createContainer } from "../di"; import { insightsRoutingModule } from "../modules/InsightsRouting"; export function getInsightsRoutingService({ diff --git a/packages/lib/di/containers/LuckyUser.ts b/packages/lib/di/containers/LuckyUser.ts index 8d3d049ce9..51d635a09b 100644 --- a/packages/lib/di/containers/LuckyUser.ts +++ b/packages/lib/di/containers/LuckyUser.ts @@ -1,9 +1,8 @@ -import { createContainer } from "@evyweb/ioctopus"; - import { DI_TOKENS } from "@calcom/lib/di/tokens"; import type { LuckyUserService } from "@calcom/lib/server/getLuckyUser"; import { prismaModule } from "@calcom/prisma/prisma.module"; +import { createContainer } from "../di"; import { attributeRepositoryModule } from "../modules/Attribute"; import { bookingRepositoryModule } from "../modules/Booking"; import { hostRepositoryModule } from "../modules/Host"; diff --git a/packages/lib/di/containers/NoSlotsNotification.ts b/packages/lib/di/containers/NoSlotsNotification.ts index dd35e281b7..eff2c4b85c 100644 --- a/packages/lib/di/containers/NoSlotsNotification.ts +++ b/packages/lib/di/containers/NoSlotsNotification.ts @@ -1,10 +1,9 @@ -import { createContainer } from "@evyweb/ioctopus"; - import { redisModule } from "@calcom/features/redis/di/redisModule"; import { DI_TOKENS } from "@calcom/lib/di/tokens"; import { prismaModule } from "@calcom/prisma/prisma.module"; import type { NoSlotsNotificationService } from "@calcom/trpc/server/routers/viewer/slots/handleNotificationWhenNoSlots"; +import { createContainer } from "../di"; import { membershipRepositoryModule } from "../modules/Membership"; import { noSlotsNotificationModule } from "../modules/NoSlotsNotification"; import { teamRepositoryModule } from "../modules/Team"; diff --git a/packages/lib/di/containers/QualifiedHosts.ts b/packages/lib/di/containers/QualifiedHosts.ts index 0ac3aabc98..089683e540 100644 --- a/packages/lib/di/containers/QualifiedHosts.ts +++ b/packages/lib/di/containers/QualifiedHosts.ts @@ -1,9 +1,8 @@ -import { createContainer } from "@evyweb/ioctopus"; - import { DI_TOKENS } from "@calcom/lib/di/tokens"; import { prismaModule } from "@calcom/prisma/prisma.module"; import type { QualifiedHostsService } from "../../bookings/findQualifiedHostsWithDelegationCredentials"; +import { createContainer } from "../di"; import { bookingRepositoryModule } from "../modules/Booking"; import { filterHostsModule } from "../modules/FilterHosts"; import { qualifiedHostsModule } from "../modules/QualifiedHosts"; diff --git a/packages/lib/di/di.ts b/packages/lib/di/di.ts new file mode 100644 index 0000000000..1db2355e2f --- /dev/null +++ b/packages/lib/di/di.ts @@ -0,0 +1,38 @@ +import type { Container, Module } from "@evyweb/ioctopus"; +import { createContainer, createModule } from "@evyweb/ioctopus"; + +/** + * A type-safe alternative to module.bind(token).toClass(classs, deps) that automatically ensures that all dependencies required by the Class are provided. + * It assumes that dependencies are stored under the `deps` property of the Class, which is a good convention to follow anyway + * + * @returns A function that can be used to load the dependencies into the container automatically. + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export function bindModuleToClassOnToken any>({ + module, + token, + classs, + depsMap, + moduleToken, +}: { + module: Module; + moduleToken: string | symbol; + token: string | symbol; + classs: TClass; + depsMap: Record< + keyof InstanceType["deps"], + { token: string | symbol; loadModule: (container: Container) => void } + >; +}) { + const depsObject = Object.fromEntries(Object.entries(depsMap).map(([key, value]) => [key, value.token])); + module.bind(token).toClass(classs, depsObject); + + return function loadModule(container: Container) { + container.load(moduleToken, module); + for (const key in depsMap) { + const loadModule = depsMap[key as keyof typeof depsMap].loadModule; + loadModule(container); + } + }; +} +export { createContainer, createModule, type Container, type Module }; diff --git a/packages/lib/di/modules/Attribute.ts b/packages/lib/di/modules/Attribute.ts index 8906b0d381..b3b581be76 100644 --- a/packages/lib/di/modules/Attribute.ts +++ b/packages/lib/di/modules/Attribute.ts @@ -1,8 +1,8 @@ -import { createModule } from "@evyweb/ioctopus"; - import { DI_TOKENS } from "@calcom/lib/di/tokens"; import { PrismaAttributeRepository } from "@calcom/lib/server/repository/PrismaAttributeRepository"; +import { createModule } from "../di"; + export const attributeRepositoryModule = createModule(); attributeRepositoryModule .bind(DI_TOKENS.ATTRIBUTE_REPOSITORY) diff --git a/packages/lib/di/modules/AvailableSlots.ts b/packages/lib/di/modules/AvailableSlots.ts index cdd971462b..57c6c7776f 100644 --- a/packages/lib/di/modules/AvailableSlots.ts +++ b/packages/lib/di/modules/AvailableSlots.ts @@ -1,8 +1,7 @@ -import { createModule } from "@evyweb/ioctopus"; - import type { IAvailableSlotsService } from "@calcom/trpc/server/routers/viewer/slots/util"; import { AvailableSlotsService } from "@calcom/trpc/server/routers/viewer/slots/util"; +import { createModule } from "../di"; import { DI_TOKENS } from "../tokens"; export const availableSlotsModule = createModule(); diff --git a/packages/lib/di/modules/Booking.ts b/packages/lib/di/modules/Booking.ts index 58d3f49eb1..802d95cf8f 100644 --- a/packages/lib/di/modules/Booking.ts +++ b/packages/lib/di/modules/Booking.ts @@ -1,9 +1,16 @@ -import { createModule } from "@evyweb/ioctopus"; - import { DI_TOKENS } from "@calcom/lib/di/tokens"; import { BookingRepository } from "@calcom/lib/server/repository/booking"; +import { type Container, createModule } from "../di"; + export const bookingRepositoryModule = createModule(); -bookingRepositoryModule - .bind(DI_TOKENS.BOOKING_REPOSITORY) - .toClass(BookingRepository, [DI_TOKENS.PRISMA_CLIENT]); +const token = DI_TOKENS.BOOKING_REPOSITORY; +const moduleToken = DI_TOKENS.BOOKING_REPOSITORY_MODULE; +bookingRepositoryModule.bind(token).toClass(BookingRepository, [DI_TOKENS.PRISMA_CLIENT]); + +export const moduleLoader = { + token, + loadModule: function (container: Container) { + container.load(moduleToken, bookingRepositoryModule); + }, +}; diff --git a/packages/lib/di/modules/BusyTimes.ts b/packages/lib/di/modules/BusyTimes.ts index 814d36e3cc..6ba085ee51 100644 --- a/packages/lib/di/modules/BusyTimes.ts +++ b/packages/lib/di/modules/BusyTimes.ts @@ -1,7 +1,6 @@ -import { createModule } from "@evyweb/ioctopus"; - import type { IBusyTimesService } from "../../getBusyTimes"; import { BusyTimesService } from "../../getBusyTimes"; +import { createModule } from "../di"; import { DI_TOKENS } from "../tokens"; export const busyTimesModule = createModule(); diff --git a/packages/lib/di/modules/Cache.ts b/packages/lib/di/modules/Cache.ts index 204c888b94..0c876b8471 100644 --- a/packages/lib/di/modules/Cache.ts +++ b/packages/lib/di/modules/Cache.ts @@ -1,11 +1,19 @@ -import { createModule } from "@evyweb/ioctopus"; - import type { ICacheService } from "@calcom/features/calendar-cache/lib/getShouldServeCache"; import { CacheService } from "@calcom/features/calendar-cache/lib/getShouldServeCache"; +import { type Container, createModule } from "../di"; import { DI_TOKENS } from "../tokens"; export const cacheModule = createModule(); -cacheModule.bind(DI_TOKENS.CACHE_SERVICE).toClass(CacheService, { +const token = DI_TOKENS.CACHE_SERVICE; +const moduleToken = DI_TOKENS.CACHE_SERVICE_MODULE; +cacheModule.bind(token).toClass(CacheService, { featuresRepository: DI_TOKENS.FEATURES_REPOSITORY, } satisfies Record); + +export const moduleLoader = { + token, + loadModule: (container: Container) => { + container.load(moduleToken, cacheModule); + }, +}; diff --git a/packages/lib/di/modules/CheckBookingAndDurationLimits.ts b/packages/lib/di/modules/CheckBookingAndDurationLimits.ts index d78a56d802..5c4020f73f 100644 --- a/packages/lib/di/modules/CheckBookingAndDurationLimits.ts +++ b/packages/lib/di/modules/CheckBookingAndDurationLimits.ts @@ -1,13 +1,19 @@ -import { createModule } from "@evyweb/ioctopus"; - import type { ICheckBookingAndDurationLimitsService } from "@calcom/features/bookings/lib/handleNewBooking/checkBookingAndDurationLimits"; import { CheckBookingAndDurationLimitsService } from "@calcom/features/bookings/lib/handleNewBooking/checkBookingAndDurationLimits"; +import { type Container, createModule } from "../di"; import { DI_TOKENS } from "../tokens"; export const checkBookingAndDurationLimitsModule = createModule(); -checkBookingAndDurationLimitsModule - .bind(DI_TOKENS.CHECK_BOOKING_AND_DURATION_LIMITS_SERVICE) - .toClass(CheckBookingAndDurationLimitsService, { - checkBookingLimitsService: DI_TOKENS.CHECK_BOOKING_LIMITS_SERVICE, - } satisfies Record); +const token = DI_TOKENS.CHECK_BOOKING_AND_DURATION_LIMITS_SERVICE; +const moduleToken = DI_TOKENS.CHECK_BOOKING_AND_DURATION_LIMITS_SERVICE_MODULE; +checkBookingAndDurationLimitsModule.bind(token).toClass(CheckBookingAndDurationLimitsService, { + checkBookingLimitsService: DI_TOKENS.CHECK_BOOKING_LIMITS_SERVICE, +} satisfies Record); + +export const moduleLoader = { + token, + loadModule: (container: Container) => { + container.load(moduleToken, checkBookingAndDurationLimitsModule); + }, +}; diff --git a/packages/lib/di/modules/CheckBookingLimits.ts b/packages/lib/di/modules/CheckBookingLimits.ts index fda897236f..5748af0dc0 100644 --- a/packages/lib/di/modules/CheckBookingLimits.ts +++ b/packages/lib/di/modules/CheckBookingLimits.ts @@ -1,9 +1,18 @@ -import { createModule } from "@evyweb/ioctopus"; - import { DI_TOKENS } from "@calcom/lib/di/tokens"; import { CheckBookingLimitsService } from "@calcom/lib/intervalLimits/server/checkBookingLimits"; +import { type Container, createModule } from "../di"; + +const token = DI_TOKENS.CHECK_BOOKING_LIMITS_SERVICE; +const moduleToken = DI_TOKENS.CHECK_BOOKING_LIMITS_SERVICE_MODULE; export const checkBookingLimitsModule = createModule(); checkBookingLimitsModule - .bind(DI_TOKENS.CHECK_BOOKING_LIMITS_SERVICE) + .bind(token) .toClass(CheckBookingLimitsService, { bookingRepo: DI_TOKENS.BOOKING_REPOSITORY }); + +export const moduleLoader = { + token, + loadModule: (container: Container) => { + container.load(moduleToken, checkBookingLimitsModule); + }, +}; diff --git a/packages/lib/di/modules/EventType.ts b/packages/lib/di/modules/EventType.ts index acefc2367d..0fbc5ffbb8 100644 --- a/packages/lib/di/modules/EventType.ts +++ b/packages/lib/di/modules/EventType.ts @@ -1,8 +1,8 @@ -import { createModule } from "@evyweb/ioctopus"; - import { DI_TOKENS } from "@calcom/lib/di/tokens"; import { EventTypeRepository } from "@calcom/lib/server/repository/eventTypeRepository"; +import { createModule } from "../di"; + export const eventTypeRepositoryModule = createModule(); eventTypeRepositoryModule .bind(DI_TOKENS.EVENT_TYPE_REPOSITORY) diff --git a/packages/lib/di/modules/Features.ts b/packages/lib/di/modules/Features.ts index 90ecdae23b..a13fe28965 100644 --- a/packages/lib/di/modules/Features.ts +++ b/packages/lib/di/modules/Features.ts @@ -1,9 +1,16 @@ -import { createModule } from "@evyweb/ioctopus"; - import { FeaturesRepository } from "@calcom/features/flags/features.repository"; import { DI_TOKENS } from "@calcom/lib/di/tokens"; +import { type Container, createModule } from "../di"; + export const featuresRepositoryModule = createModule(); -featuresRepositoryModule - .bind(DI_TOKENS.FEATURES_REPOSITORY) - .toClass(FeaturesRepository, [DI_TOKENS.PRISMA_CLIENT]); +const token = DI_TOKENS.FEATURES_REPOSITORY; +const moduleToken = DI_TOKENS.FEATURES_REPOSITORY_MODULE; +featuresRepositoryModule.bind(token).toClass(FeaturesRepository, [DI_TOKENS.PRISMA_CLIENT]); + +export const moduleLoader = { + token, + loadModule: (container: Container) => { + container.load(moduleToken, featuresRepositoryModule); + }, +}; diff --git a/packages/lib/di/modules/FilterHosts.ts b/packages/lib/di/modules/FilterHosts.ts index 3a17e33e7b..bf7a1f1893 100644 --- a/packages/lib/di/modules/FilterHosts.ts +++ b/packages/lib/di/modules/FilterHosts.ts @@ -1,7 +1,6 @@ -import { createModule } from "@evyweb/ioctopus"; - import type { IFilterHostsService } from "../../bookings/filterHostsBySameRoundRobinHost"; import { FilterHostsService } from "../../bookings/filterHostsBySameRoundRobinHost"; +import { createModule } from "../di"; import { DI_TOKENS } from "../tokens"; export const filterHostsModule = createModule(); diff --git a/packages/lib/di/modules/GetUserAvailability.ts b/packages/lib/di/modules/GetUserAvailability.ts index 5913cf2801..f2fefb9ac9 100644 --- a/packages/lib/di/modules/GetUserAvailability.ts +++ b/packages/lib/di/modules/GetUserAvailability.ts @@ -1,7 +1,6 @@ -import { createModule } from "@evyweb/ioctopus"; - import type { IUserAvailabilityService } from "../../getUserAvailability"; import { UserAvailabilityService } from "../../getUserAvailability"; +import { createModule } from "../di"; import { DI_TOKENS } from "../tokens"; export const getUserAvailabilityModule = createModule(); diff --git a/packages/lib/di/modules/Host.ts b/packages/lib/di/modules/Host.ts index 21449ef161..8810533eb4 100644 --- a/packages/lib/di/modules/Host.ts +++ b/packages/lib/di/modules/Host.ts @@ -1,7 +1,7 @@ -import { createModule } from "@evyweb/ioctopus"; - import { DI_TOKENS } from "@calcom/lib/di/tokens"; import { HostRepository } from "@calcom/lib/server/repository/host"; +import { createModule } from "../di"; + export const hostRepositoryModule = createModule(); hostRepositoryModule.bind(DI_TOKENS.HOST_REPOSITORY).toClass(HostRepository, [DI_TOKENS.PRISMA_CLIENT]); diff --git a/packages/lib/di/modules/InsightsBooking.ts b/packages/lib/di/modules/InsightsBooking.ts index 2d431c4a71..13d2d50433 100644 --- a/packages/lib/di/modules/InsightsBooking.ts +++ b/packages/lib/di/modules/InsightsBooking.ts @@ -1,8 +1,7 @@ -import { createModule } from "@evyweb/ioctopus"; - import type { IInsightsBookingService } from "@calcom/lib/server/service/InsightsBookingDIService"; import { InsightsBookingService } from "@calcom/lib/server/service/InsightsBookingDIService"; +import { createModule } from "../di"; import { DI_TOKENS } from "../tokens"; export const insightsBookingModule = createModule(); diff --git a/packages/lib/di/modules/InsightsRouting.ts b/packages/lib/di/modules/InsightsRouting.ts index eb5e0ce06a..29ed52b75c 100644 --- a/packages/lib/di/modules/InsightsRouting.ts +++ b/packages/lib/di/modules/InsightsRouting.ts @@ -1,8 +1,7 @@ -import { createModule } from "@evyweb/ioctopus"; - import type { IInsightsRoutingService } from "@calcom/lib/server/service/InsightsRoutingDIService"; import { InsightsRoutingService } from "@calcom/lib/server/service/InsightsRoutingDIService"; +import { createModule } from "../di"; import { DI_TOKENS } from "../tokens"; export const insightsRoutingModule = createModule(); diff --git a/packages/lib/di/modules/LuckyUser.ts b/packages/lib/di/modules/LuckyUser.ts index bf68f6ea8c..0017b485bf 100644 --- a/packages/lib/di/modules/LuckyUser.ts +++ b/packages/lib/di/modules/LuckyUser.ts @@ -1,8 +1,8 @@ -import { createModule } from "@evyweb/ioctopus"; - import { DI_TOKENS } from "@calcom/lib/di/tokens"; import { LuckyUserService } from "@calcom/lib/server/getLuckyUser"; +import { createModule } from "../di"; + export const luckyUserServiceModule = createModule(); luckyUserServiceModule.bind(DI_TOKENS.LUCKY_USER_SERVICE).toClass(LuckyUserService, { bookingRepository: DI_TOKENS.BOOKING_REPOSITORY, diff --git a/packages/lib/di/modules/Membership.ts b/packages/lib/di/modules/Membership.ts index b907f341d0..7c7d5e1ffd 100644 --- a/packages/lib/di/modules/Membership.ts +++ b/packages/lib/di/modules/Membership.ts @@ -1,8 +1,8 @@ -import { createModule } from "@evyweb/ioctopus"; - import { DI_TOKENS } from "@calcom/lib/di/tokens"; import { MembershipRepository } from "@calcom/lib/server/repository/membership"; +import { createModule } from "../di"; + export const membershipRepositoryModule = createModule(); membershipRepositoryModule .bind(DI_TOKENS.MEMBERSHIP_REPOSITORY) diff --git a/packages/lib/di/modules/NoSlotsNotification.ts b/packages/lib/di/modules/NoSlotsNotification.ts index baa99436a7..c8e9e65368 100644 --- a/packages/lib/di/modules/NoSlotsNotification.ts +++ b/packages/lib/di/modules/NoSlotsNotification.ts @@ -1,8 +1,7 @@ -import { createModule } from "@evyweb/ioctopus"; - import type { INoSlotsNotificationService } from "@calcom/trpc/server/routers/viewer/slots/handleNotificationWhenNoSlots"; import { NoSlotsNotificationService } from "@calcom/trpc/server/routers/viewer/slots/handleNotificationWhenNoSlots"; +import { createModule } from "../di"; import { DI_TOKENS } from "../tokens"; export const noSlotsNotificationModule = createModule(); diff --git a/packages/lib/di/modules/Ooo.ts b/packages/lib/di/modules/Ooo.ts index 5df7c37b55..e2b9722017 100644 --- a/packages/lib/di/modules/Ooo.ts +++ b/packages/lib/di/modules/Ooo.ts @@ -1,7 +1,7 @@ -import { createModule } from "@evyweb/ioctopus"; - import { DI_TOKENS } from "@calcom/lib/di/tokens"; import { PrismaOOORepository } from "@calcom/lib/server/repository/ooo"; +import { createModule } from "../di"; + export const oooRepositoryModule = createModule(); oooRepositoryModule.bind(DI_TOKENS.OOO_REPOSITORY).toClass(PrismaOOORepository, [DI_TOKENS.PRISMA_CLIENT]); diff --git a/packages/lib/di/modules/QualifiedHosts.ts b/packages/lib/di/modules/QualifiedHosts.ts index 5aa37f37f4..98c16bed04 100644 --- a/packages/lib/di/modules/QualifiedHosts.ts +++ b/packages/lib/di/modules/QualifiedHosts.ts @@ -1,7 +1,6 @@ -import { createModule } from "@evyweb/ioctopus"; - import type { IQualifiedHostsService } from "../../bookings/findQualifiedHostsWithDelegationCredentials"; import { QualifiedHostsService } from "../../bookings/findQualifiedHostsWithDelegationCredentials"; +import { createModule } from "../di"; import { DI_TOKENS } from "../tokens"; export const qualifiedHostsModule = createModule(); diff --git a/packages/lib/di/modules/RoutingFormResponse.ts b/packages/lib/di/modules/RoutingFormResponse.ts index 2db9b72918..6f85b8d9d8 100644 --- a/packages/lib/di/modules/RoutingFormResponse.ts +++ b/packages/lib/di/modules/RoutingFormResponse.ts @@ -1,8 +1,8 @@ -import { createModule } from "@evyweb/ioctopus"; - import { DI_TOKENS } from "@calcom/lib/di/tokens"; import { RoutingFormResponseRepository } from "@calcom/lib/server/repository/formResponse"; +import { createModule } from "../di"; + export const routingFormResponseRepositoryModule = createModule(); routingFormResponseRepositoryModule .bind(DI_TOKENS.ROUTING_FORM_RESPONSE_REPOSITORY) diff --git a/packages/lib/di/modules/Schedule.ts b/packages/lib/di/modules/Schedule.ts index 3c4f353bf9..a974b71fcf 100644 --- a/packages/lib/di/modules/Schedule.ts +++ b/packages/lib/di/modules/Schedule.ts @@ -1,8 +1,8 @@ -import { createModule } from "@evyweb/ioctopus"; - import { DI_TOKENS } from "@calcom/lib/di/tokens"; import { ScheduleRepository } from "@calcom/lib/server/repository/schedule"; +import { createModule } from "../di"; + export const scheduleRepositoryModule = createModule(); scheduleRepositoryModule .bind(DI_TOKENS.SCHEDULE_REPOSITORY) diff --git a/packages/lib/di/modules/SelectedSlots.ts b/packages/lib/di/modules/SelectedSlots.ts index 10d76f18b7..3aa52978ab 100644 --- a/packages/lib/di/modules/SelectedSlots.ts +++ b/packages/lib/di/modules/SelectedSlots.ts @@ -1,8 +1,8 @@ -import { createModule } from "@evyweb/ioctopus"; - import { DI_TOKENS } from "@calcom/lib/di/tokens"; import { PrismaSelectedSlotRepository } from "@calcom/lib/server/repository/PrismaSelectedSlotRepository"; +import { createModule } from "../di"; + export const selectedSlotsRepositoryModule = createModule(); selectedSlotsRepositoryModule .bind(DI_TOKENS.SELECTED_SLOT_REPOSITORY) diff --git a/packages/lib/di/modules/Team.ts b/packages/lib/di/modules/Team.ts index 96d8555a2f..b9c7c29445 100644 --- a/packages/lib/di/modules/Team.ts +++ b/packages/lib/di/modules/Team.ts @@ -1,7 +1,7 @@ -import { createModule } from "@evyweb/ioctopus"; - import { DI_TOKENS } from "@calcom/lib/di/tokens"; import { TeamRepository } from "@calcom/lib/server/repository/team"; +import { createModule } from "../di"; + export const teamRepositoryModule = createModule(); teamRepositoryModule.bind(DI_TOKENS.TEAM_REPOSITORY).toClass(TeamRepository, [DI_TOKENS.PRISMA_CLIENT]); diff --git a/packages/lib/di/modules/User.ts b/packages/lib/di/modules/User.ts index 35cae3ac1f..f89fd16d8e 100644 --- a/packages/lib/di/modules/User.ts +++ b/packages/lib/di/modules/User.ts @@ -1,7 +1,7 @@ -import { createModule } from "@evyweb/ioctopus"; - import { DI_TOKENS } from "@calcom/lib/di/tokens"; import { UserRepository } from "@calcom/lib/server/repository/user"; +import { createModule } from "../di"; + export const userRepositoryModule = createModule(); userRepositoryModule.bind(DI_TOKENS.USER_REPOSITORY).toClass(UserRepository, [DI_TOKENS.PRISMA_CLIENT]); diff --git a/packages/lib/di/tokens.ts b/packages/lib/di/tokens.ts index 0f2b0a601e..9936078b30 100644 --- a/packages/lib/di/tokens.ts +++ b/packages/lib/di/tokens.ts @@ -1,3 +1,5 @@ +import { BOOKING_DI_TOKENS } from "./bookings/tokens"; + export const DI_TOKENS = { PRISMA_CLIENT: Symbol("PrismaClient"), READ_ONLY_PRISMA_CLIENT: Symbol("ReadOnlyPrismaClient"), @@ -51,10 +53,6 @@ export const DI_TOKENS = { HOST_REPOSITORY_MODULE: Symbol("HostRepositoryModule"), ATTRIBUTE_REPOSITORY: Symbol("AttributeRepository"), ATTRIBUTE_REPOSITORY_MODULE: Symbol("AttributeRepositoryModule"), - REGULAR_BOOKING_SERVICE: Symbol("RegularBookingService"), - REGULAR_BOOKING_SERVICE_MODULE: Symbol("RegularBookingServiceModule"), - RECURRING_BOOKING_SERVICE: Symbol("RecurringBookingService"), - RECURRING_BOOKING_SERVICE_MODULE: Symbol("RecurringBookingServiceModule"), - INSTANT_BOOKING_CREATE_SERVICE: Symbol("InstantBookingCreateService"), - INSTANT_BOOKING_CREATE_SERVICE_MODULE: Symbol("InstantBookingCreateServiceModule"), + // Booking service tokens + ...BOOKING_DI_TOKENS, }; diff --git a/packages/prisma/prisma.module.ts b/packages/prisma/prisma.module.ts index a85634ada5..0845fe03ff 100644 --- a/packages/prisma/prisma.module.ts +++ b/packages/prisma/prisma.module.ts @@ -1,11 +1,19 @@ -import { createModule } from "@evyweb/ioctopus"; - +import { type Container, createModule } from "@calcom/lib/di/di"; import { DI_TOKENS } from "@calcom/lib/di/tokens"; import { prisma, readonlyPrisma } from "./index"; export const prismaModule = createModule(); +const token = DI_TOKENS.PRISMA_CLIENT; +const readOnlyToken = DI_TOKENS.READ_ONLY_PRISMA_CLIENT; +const moduleToken = DI_TOKENS.PRISMA_MODULE; +prismaModule.bind(token).toFactory(() => prisma, "singleton"); +prismaModule.bind(readOnlyToken).toFactory(() => readonlyPrisma, "singleton"); -prismaModule.bind(DI_TOKENS.PRISMA_CLIENT).toFactory(() => prisma, "singleton"); - -prismaModule.bind(DI_TOKENS.READ_ONLY_PRISMA_CLIENT).toFactory(() => readonlyPrisma, "singleton"); +export const moduleLoader = { + token, + readOnlyToken, + loadModule: (container: Container) => { + container.load(moduleToken, prismaModule); + }, +};