Skip to content

Commit 1d1a242

Browse files
refactor: convert getShouldServeCache to CacheService with dependency injection (calcom#22814)
* refactor: convert getShouldServeCache to CacheService with dependency injection - Create CacheService class following AvailableSlotsService DI pattern - Add FeaturesRepository and CacheService to DI tokens and modules - Create cache container with proper dependency injection setup - Update handleNewBooking.ts and slots/util.ts to use new service - Maintain backward compatibility with error-throwing wrapper function - Follow established service patterns for clean architecture Co-Authored-By: morgan@cal.com <morgan@cal.com> * feat: inject CacheService into AvailableSlotsService via dependency injection - Add cacheService to IAvailableSlotsService interface - Update available-slots container to load cache modules - Update available-slots module to inject CacheService dependency - Replace direct getShouldServeCache call with injected service method - Add CacheService import to util.ts for proper typing Co-Authored-By: morgan@cal.com <morgan@cal.com> * chore: DI api v2 cache service * refactor: convert FeaturesRepository to use factory pattern in DI - Change from constructor injection to factory pattern to avoid PRISMA_CLIENT binding issues in tests - FeaturesRepository now uses default prisma instance instead of DI injection - Resolves test failures while maintaining DI container compatibility - Tests reduced from 123+ failures to only 5 unrelated failures Co-Authored-By: morgan@cal.com <morgan@cal.com> * revert: use direct FeaturesRepository instantiation in most usage points - Revert getFeaturesRepository() calls back to new FeaturesRepository() - Tests require direct instantiation for mocking compatibility - Keep DI container for specific use cases that need dependency injection - Resolves test failures while maintaining both DI and direct usage patterns Co-Authored-By: morgan@cal.com <morgan@cal.com> * fix: resolve FeaturesRepository DI container issues - Update cache module to use factory pattern with proper ICacheService interface - Remove featuresModule loading from cache and available-slots containers - Use direct FeaturesRepository instantiation via getFeaturesRepository() - Resolves 'No binding found for key: Symbol(FeaturesRepository)' errors - Reduces test failures from 125 to 7 (remaining failures appear unrelated) Co-Authored-By: morgan@cal.com <morgan@cal.com> * fix: update all FeaturesRepository instantiations to include prisma parameter - Add prisma parameter to all new FeaturesRepository() calls across the codebase - Update API v2 services to match main repo interfaces - Fix PrismaFeaturesRepository to implement IFeaturesRepository directly - Update CacheService in API v2 to expose required dependencies and getShouldServeCache - Implement CheckBookingLimitsService in API v2 with proper interface - Resolves type assignment errors between API v2 and main repo implementations Co-Authored-By: morgan@cal.com <morgan@cal.com> * fix: add prisma parameter to remaining FeaturesRepository instantiations in apps/web/lib - Update getServerSideProps files to pass prisma parameter to FeaturesRepository - Ensures all FeaturesRepository instantiations follow the new constructor pattern - Completes the refactoring to use direct instantiation with prisma parameter Co-Authored-By: morgan@cal.com <morgan@cal.com> * refactor clean and fix devin issues * chore: bump platform libs * chore: bump platform libs * chore: bump platform libs * chore: bump platform libs * fix: missing di * fix workflow test * fix workflow test * fix integration test --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: morgan@cal.com <morgan@cal.com> Co-authored-by: Morgan <33722304+ThyMinimalDev@users.noreply.github.com>
1 parent ad4af64 commit 1d1a242

51 files changed

Lines changed: 179 additions & 74 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

apps/api/v2/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
"@axiomhq/winston": "^1.2.0",
3939
"@calcom/platform-constants": "*",
4040
"@calcom/platform-enums": "*",
41-
"@calcom/platform-libraries": "npm:@calcom/platform-libraries@0.0.271",
41+
"@calcom/platform-libraries": "npm:@calcom/platform-libraries@0.0.276",
4242
"@calcom/platform-types": "*",
4343
"@calcom/platform-utils": "*",
4444
"@calcom/prisma": "*",

apps/api/v2/src/lib/modules/available-slots.module.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
import { PrismaBookingRepository } from "@/lib/repositories/prisma-booking.repository";
22
import { PrismaEventTypeRepository } from "@/lib/repositories/prisma-event-type.repository";
3+
import { PrismaFeaturesRepository } from "@/lib/repositories/prisma-features.repository";
34
import { PrismaOOORepository } from "@/lib/repositories/prisma-ooo.repository";
45
import { PrismaRoutingFormResponseRepository } from "@/lib/repositories/prisma-routing-form-response.repository";
56
import { PrismaScheduleRepository } from "@/lib/repositories/prisma-schedule.repository";
67
import { PrismaSelectedSlotRepository } from "@/lib/repositories/prisma-selected-slot.repository";
78
import { PrismaTeamRepository } from "@/lib/repositories/prisma-team.repository";
89
import { PrismaUserRepository } from "@/lib/repositories/prisma-user.repository";
910
import { AvailableSlotsService } from "@/lib/services/available-slots.service";
11+
import { CacheService } from "@/lib/services/cache.service";
1012
import { CheckBookingLimitsService } from "@/lib/services/check-booking-limits.service";
1113
import { PrismaModule } from "@/modules/prisma/prisma.module";
1214
import { Module } from "@nestjs/common";
@@ -22,7 +24,9 @@ import { Module } from "@nestjs/common";
2224
PrismaEventTypeRepository,
2325
PrismaRoutingFormResponseRepository,
2426
PrismaTeamRepository,
27+
PrismaFeaturesRepository,
2528
CheckBookingLimitsService,
29+
CacheService,
2630
AvailableSlotsService,
2731
],
2832
exports: [AvailableSlotsService],
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { PrismaWriteService } from "@/modules/prisma/prisma-write.service";
2+
import { Injectable } from "@nestjs/common";
3+
4+
import { PrismaFeaturesRepository as PrismaFeaturesRepositoryLib } from "@calcom/platform-libraries/repositories";
5+
import { PrismaClient } from "@calcom/prisma";
6+
7+
@Injectable()
8+
export class PrismaFeaturesRepository extends PrismaFeaturesRepositoryLib {
9+
constructor(private readonly dbWrite: PrismaWriteService) {
10+
super(dbWrite.prisma as unknown as PrismaClient);
11+
}
12+
}

apps/api/v2/src/lib/services/available-slots.service.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import { PrismaBookingRepository } from "@/lib/repositories/prisma-booking.repository";
22
import { PrismaEventTypeRepository } from "@/lib/repositories/prisma-event-type.repository";
3+
import { PrismaFeaturesRepository } from "@/lib/repositories/prisma-features.repository";
34
import { PrismaOOORepository } from "@/lib/repositories/prisma-ooo.repository";
45
import { PrismaRoutingFormResponseRepository } from "@/lib/repositories/prisma-routing-form-response.repository";
56
import { PrismaScheduleRepository } from "@/lib/repositories/prisma-schedule.repository";
67
import { PrismaSelectedSlotRepository } from "@/lib/repositories/prisma-selected-slot.repository";
78
import { PrismaTeamRepository } from "@/lib/repositories/prisma-team.repository";
89
import { PrismaUserRepository } from "@/lib/repositories/prisma-user.repository";
10+
import { CacheService } from "@/lib/services/cache.service";
911
import { CheckBookingLimitsService } from "@/lib/services/check-booking-limits.service";
1012
import { Injectable } from "@nestjs/common";
1113

@@ -21,7 +23,8 @@ export class AvailableSlotsService extends BaseAvailableSlotsService {
2123
bookingRepository: PrismaBookingRepository,
2224
selectedSlotRepository: PrismaSelectedSlotRepository,
2325
eventTypeRepository: PrismaEventTypeRepository,
24-
userRepository: PrismaUserRepository
26+
userRepository: PrismaUserRepository,
27+
featuresRepository: PrismaFeaturesRepository
2528
) {
2629
super({
2730
oooRepo: oooRepoDependency,
@@ -32,7 +35,8 @@ export class AvailableSlotsService extends BaseAvailableSlotsService {
3235
selectedSlotRepo: selectedSlotRepository,
3336
eventTypeRepo: eventTypeRepository,
3437
userRepo: userRepository,
35-
checkBookingLimitsService: new CheckBookingLimitsService(bookingRepository),
38+
checkBookingLimitsService: new CheckBookingLimitsService(bookingRepository) as any,
39+
cacheService: new CacheService(featuresRepository),
3640
});
3741
}
3842
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { PrismaFeaturesRepository } from "@/lib/repositories/prisma-features.repository";
2+
import { Injectable } from "@nestjs/common";
3+
4+
import { CacheService as BaseCacheService } from "@calcom/platform-libraries";
5+
6+
@Injectable()
7+
export class CacheService extends BaseCacheService {
8+
constructor(featuresRepository: PrismaFeaturesRepository) {
9+
super({ featuresRepository });
10+
}
11+
}

apps/web/app/(booking-page-wrapper)/team/[slug]/[type]/page.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { cookies, headers } from "next/headers";
77
import { getOrgFullOrigin } from "@calcom/features/ee/organizations/lib/orgDomains";
88
import { FeaturesRepository } from "@calcom/features/flags/features.repository";
99
import { loadTranslations } from "@calcom/lib/server/i18n";
10+
import { prisma } from "@calcom/prisma";
1011

1112
import { buildLegacyCtx, decodeParams } from "@lib/buildLegacyCtx";
1213
import { getServerSideProps } from "@lib/team/[slug]/[type]/getServerSideProps";
@@ -17,7 +18,7 @@ import type { PageProps as LegacyPageProps } from "~/team/type-view";
1718
import CachedTeamBooker, { generateMetadata as generateCachedMetadata } from "./pageWithCachedData";
1819

1920
async function isCachedTeamBookingEnabled(searchParams: SearchParams): Promise<boolean> {
20-
const featuresRepository = new FeaturesRepository();
21+
const featuresRepository = new FeaturesRepository(prisma);
2122
const isGloballyEnabled = await featuresRepository.checkIfFeatureIsEnabledGlobally(
2223
"team-booking-page-cache"
2324
);

apps/web/app/(booking-page-wrapper)/team/[slug]/[type]/queries.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ export async function getEnrichedEventType({
102102
}
103103

104104
export async function shouldUseApiV2ForTeamSlots(teamId: number): Promise<boolean> {
105-
const featureRepo = new FeaturesRepository();
105+
const featureRepo = new FeaturesRepository(prisma);
106106
const teamHasApiV2Route = await featureRepo.checkIfTeamHasFeature(teamId, "use-api-v2-for-team-slots");
107107
const useApiV2 = teamHasApiV2Route && Boolean(process.env.NEXT_PUBLIC_API_V2_URL);
108108

apps/web/app/(use-page-wrapper)/insights/layout.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@ import { notFound } from "next/navigation";
44
import { CTA_CONTAINER_CLASS_NAME } from "@calcom/features/data-table/lib/utils";
55
import { FeaturesRepository } from "@calcom/features/flags/features.repository";
66
import Shell from "@calcom/features/shell/Shell";
7+
import { prisma } from "@calcom/prisma";
78

89
import UpgradeTipWrapper from "./UpgradeTipWrapper";
910

1011
export default async function InsightsLayout({ children }: { children: React.ReactNode }) {
11-
const featuresRepository = new FeaturesRepository();
12+
const featuresRepository = new FeaturesRepository(prisma);
1213
const insightsEnabled = await featuresRepository.checkIfFeatureIsEnabledGlobally("insights");
1314

1415
if (!insightsEnabled) {

apps/web/app/(use-page-wrapper)/settings/(settings-layout)/layout.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { FeaturesRepository } from "@calcom/features/flags/features.repository";
99
import { PermissionMapper } from "@calcom/features/pbac/domain/mappers/PermissionMapper";
1010
import { Resource, CrudAction } from "@calcom/features/pbac/domain/types/permission-registry";
1111
import { PermissionCheckService } from "@calcom/features/pbac/services/permission-check.service";
12+
import { prisma } from "@calcom/prisma";
1213

1314
import { buildLegacyRequest } from "@lib/buildLegacyCtx";
1415

@@ -17,7 +18,7 @@ import SettingsLayoutAppDirClient from "./SettingsLayoutAppDirClient";
1718

1819
const getTeamFeatures = unstable_cache(
1920
async (teamId: number) => {
20-
const featuresRepository = new FeaturesRepository();
21+
const featuresRepository = new FeaturesRepository(prisma);
2122
return await featuresRepository.getTeamFeatures(teamId);
2223
},
2324
["team-features"],

apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/roles/page.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { Resource, CrudAction } from "@calcom/features/pbac/domain/types/permiss
1111
import { PermissionCheckService } from "@calcom/features/pbac/services/permission-check.service";
1212
import { RoleService } from "@calcom/features/pbac/services/role.service";
1313
import SettingsHeader from "@calcom/features/settings/appDir/SettingsHeader";
14+
import { prisma } from "@calcom/prisma";
1415

1516
import { buildLegacyRequest } from "@lib/buildLegacyCtx";
1617

@@ -29,7 +30,7 @@ const getCachedTeamRoles = unstable_cache(
2930

3031
const getCachedTeamFeature = unstable_cache(
3132
async (teamId: number, feature: keyof AppFlags) => {
32-
const featureRepo = new FeaturesRepository();
33+
const featureRepo = new FeaturesRepository(prisma);
3334
const res = await featureRepo.checkIfTeamHasFeature(teamId, feature);
3435
return res;
3536
},

0 commit comments

Comments
 (0)