From 4ff5f5f3fad256d14ebe10205d726a06f8c7888c Mon Sep 17 00:00:00 2001 From: Eunjae Lee Date: Sat, 26 Jul 2025 03:32:27 +0200 Subject: [PATCH] refactor: use dependency injection for InsightsRoutingService (#22677) * refactor: use dependency injection for InsightsRoutingService * remove unused getter * clean up * Revert "clean up" This reverts commit a95b83d5dfd4c3236e44268df40bab935237101e. * Update insightsRoutingDI.ts * Revert "Update insightsRoutingDI.ts" This reverts commit 39ead809fa8dabfc17da043c6416bbc6d1fed58d. --------- Co-authored-by: Alex van Andel --- .../insights/hooks/useInsightsOrgTeams.ts | 2 +- .../features/insights/server/trpc-router.ts | 5 ++-- .../lib/di/containers/insights-routing.ts | 27 +++++++++++++++++ packages/lib/di/modules/insights-routing.ts | 11 +++++++ packages/lib/di/tokens.ts | 2 ++ .../insightsRouting.integration-test.ts | 2 +- ...ightsRouting.ts => insightsRoutingBase.ts} | 2 +- .../lib/server/service/insightsRoutingDI.ts | 29 +++++++++++++++++++ 8 files changed, 74 insertions(+), 6 deletions(-) create mode 100644 packages/lib/di/containers/insights-routing.ts create mode 100644 packages/lib/di/modules/insights-routing.ts rename packages/lib/server/service/{insightsRouting.ts => insightsRoutingBase.ts} (99%) create mode 100644 packages/lib/server/service/insightsRoutingDI.ts diff --git a/packages/features/insights/hooks/useInsightsOrgTeams.ts b/packages/features/insights/hooks/useInsightsOrgTeams.ts index ca1e260300..79718c4f67 100644 --- a/packages/features/insights/hooks/useInsightsOrgTeams.ts +++ b/packages/features/insights/hooks/useInsightsOrgTeams.ts @@ -15,7 +15,7 @@ export function useInsightsOrgTeams() { const teamId = orgTeamsType === "org" ? currentOrgId : orgTeamsType === "team" ? selectedTeamId : undefined; const userId = orgTeamsType === "yours" ? session.data?.user.id : undefined; - // Adding `scope` for InsightsRoutingService + // Adding `scope` for InsightsRoutingBaseService // (renaming 'yours' to 'user') const scope: "org" | "team" | "user" = orgTeamsType === "yours" ? "user" : orgTeamsType; diff --git a/packages/features/insights/server/trpc-router.ts b/packages/features/insights/server/trpc-router.ts index c99950f0ff..de7f4bf72e 100644 --- a/packages/features/insights/server/trpc-router.ts +++ b/packages/features/insights/server/trpc-router.ts @@ -10,8 +10,8 @@ import { routingRepositoryBaseInputSchema, bookingRepositoryBaseInputSchema, } from "@calcom/features/insights/server/raw-data.schema"; +import { getInsightsRoutingService } from "@calcom/lib/di/containers/insights-routing"; import { InsightsBookingService } from "@calcom/lib/server/service/insightsBooking"; -import { InsightsRoutingService } from "@calcom/lib/server/service/insightsRouting"; import type { readonlyPrisma } from "@calcom/prisma"; import { BookingStatus } from "@calcom/prisma/enums"; import authedProcedure from "@calcom/trpc/server/procedures/authedProcedure"; @@ -1688,8 +1688,7 @@ export const insightsRouter = router({ timeView, weekStart: ctx.user.weekStart, }); - const insightsRoutingService = new InsightsRoutingService({ - prisma: ctx.insightsDb, + const insightsRoutingService = getInsightsRoutingService({ options: { scope: input.scope, teamId: input.selectedTeamId, diff --git a/packages/lib/di/containers/insights-routing.ts b/packages/lib/di/containers/insights-routing.ts new file mode 100644 index 0000000000..a2e6c18ea8 --- /dev/null +++ b/packages/lib/di/containers/insights-routing.ts @@ -0,0 +1,27 @@ +import { createContainer } from "@evyweb/ioctopus"; + +import { DI_TOKENS } from "@calcom/lib/di/tokens"; +import type { + InsightsRoutingServicePublicOptions, + InsightsRoutingServiceFilterOptions, + InsightsRoutingBaseService, +} from "@calcom/lib/server/service/insightsRoutingBase"; +import type { InsightsRoutingService } from "@calcom/lib/server/service/insightsRoutingDI"; +import { prismaModule } from "@calcom/prisma/prisma.module"; + +import { insightsRoutingModule } from "../modules/insights-routing"; + +export function getInsightsRoutingService({ + options, + filters, +}: { + options: InsightsRoutingServicePublicOptions; + filters: InsightsRoutingServiceFilterOptions; +}): InsightsRoutingBaseService { + const container = createContainer(); + container.load(DI_TOKENS.READ_ONLY_PRISMA_CLIENT, prismaModule); + container.load(DI_TOKENS.INSIGHTS_ROUTING_SERVICE_MODULE, insightsRoutingModule); + + const diService = container.get(DI_TOKENS.INSIGHTS_ROUTING_SERVICE); + return diService.create({ options, filters }); +} diff --git a/packages/lib/di/modules/insights-routing.ts b/packages/lib/di/modules/insights-routing.ts new file mode 100644 index 0000000000..f51af9fbf7 --- /dev/null +++ b/packages/lib/di/modules/insights-routing.ts @@ -0,0 +1,11 @@ +import { createModule } from "@evyweb/ioctopus"; + +import type { IInsightsRoutingService } from "@calcom/lib/server/service/insightsRoutingDI"; +import { InsightsRoutingService } from "@calcom/lib/server/service/insightsRoutingDI"; + +import { DI_TOKENS } from "../tokens"; + +export const insightsRoutingModule = createModule(); +insightsRoutingModule.bind(DI_TOKENS.INSIGHTS_ROUTING_SERVICE).toClass(InsightsRoutingService, { + prisma: DI_TOKENS.READ_ONLY_PRISMA_CLIENT, +} satisfies Record); diff --git a/packages/lib/di/tokens.ts b/packages/lib/di/tokens.ts index 7b59701c47..b3ba3d1d32 100644 --- a/packages/lib/di/tokens.ts +++ b/packages/lib/di/tokens.ts @@ -20,4 +20,6 @@ export const DI_TOKENS = { ROUTING_FORM_RESPONSE_REPOSITORY_MODULE: Symbol("RoutingFormResponseRepositoryModule"), AVAILABLE_SLOTS_SERVICE: Symbol("AvailableSlotsService"), AVAILABLE_SLOTS_SERVICE_MODULE: Symbol("AvailableSlotsModule"), + INSIGHTS_ROUTING_SERVICE: Symbol("InsightsRoutingService"), + INSIGHTS_ROUTING_SERVICE_MODULE: Symbol("InsightsRoutingServiceModule"), }; diff --git a/packages/lib/server/service/__tests__/insightsRouting.integration-test.ts b/packages/lib/server/service/__tests__/insightsRouting.integration-test.ts index db0d70294c..6e90f26683 100644 --- a/packages/lib/server/service/__tests__/insightsRouting.integration-test.ts +++ b/packages/lib/server/service/__tests__/insightsRouting.integration-test.ts @@ -7,7 +7,7 @@ import { ColumnFilterType } from "@calcom/features/data-table/lib/types"; import prisma from "@calcom/prisma"; import { BookingStatus, MembershipRole } from "@calcom/prisma/enums"; -import { InsightsRoutingService } from "../../service/insightsRouting"; +import { InsightsRoutingBaseService as InsightsRoutingService } from "../../service/insightsRoutingBase"; // SQL condition constants for testing const NOTHING_CONDITION = Prisma.sql`1=0`; diff --git a/packages/lib/server/service/insightsRouting.ts b/packages/lib/server/service/insightsRoutingBase.ts similarity index 99% rename from packages/lib/server/service/insightsRouting.ts rename to packages/lib/server/service/insightsRoutingBase.ts index 4ae1e299e1..e1bc80ad5b 100644 --- a/packages/lib/server/service/insightsRouting.ts +++ b/packages/lib/server/service/insightsRoutingBase.ts @@ -53,7 +53,7 @@ export type InsightsRoutingServiceFilterOptions = { const NOTHING_CONDITION = Prisma.sql`1=0`; -export class InsightsRoutingService { +export class InsightsRoutingBaseService { private prisma: typeof readonlyPrisma; private options: InsightsRoutingServiceOptions | null; private filters: InsightsRoutingServiceFilterOptions; diff --git a/packages/lib/server/service/insightsRoutingDI.ts b/packages/lib/server/service/insightsRoutingDI.ts new file mode 100644 index 0000000000..4c70f9d555 --- /dev/null +++ b/packages/lib/server/service/insightsRoutingDI.ts @@ -0,0 +1,29 @@ +import type { readonlyPrisma } from "@calcom/prisma"; + +import { + InsightsRoutingBaseService, + type InsightsRoutingServicePublicOptions, + type InsightsRoutingServiceFilterOptions, +} from "./insightsRoutingBase"; + +export interface IInsightsRoutingService { + prisma: typeof readonlyPrisma; +} + +export class InsightsRoutingService { + constructor(private readonly dependencies: IInsightsRoutingService) {} + + create({ + options, + filters, + }: { + options: InsightsRoutingServicePublicOptions; + filters: InsightsRoutingServiceFilterOptions; + }): InsightsRoutingBaseService { + return new InsightsRoutingBaseService({ + prisma: this.dependencies.prisma, + options, + filters, + }); + } +}