Skip to content

Commit c3634b3

Browse files
refactor: getUserAvailability into service with DI (calcom#22881)
* refactor: getUserAvailability into service with DI * chore: bump platform libs * disable bull queue in e2e for bookings * chore: bump platform libs * chore: bump platform libs * fix: should update event type bookingFields test --------- Co-authored-by: Alex van Andel <me@alexvanandel.com>
1 parent cd576f5 commit c3634b3

24 files changed

Lines changed: 768 additions & 635 deletions

File tree

apps/api/v1/pages/api/availability/_get.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type { NextApiRequest } from "next";
22
import { z } from "zod";
33

4-
import { getUserAvailability } from "@calcom/lib/getUserAvailability";
4+
import { getUserAvailabilityService } from "@calcom/lib/di/containers/get-user-availability";
55
import { HttpError } from "@calcom/lib/http-error";
66
import { defaultResponder } from "@calcom/lib/server/defaultResponder";
77
import prisma from "@calcom/prisma";
@@ -191,8 +191,9 @@ const availabilitySchema = z
191191
async function handler(req: NextApiRequest) {
192192
const { isSystemWideAdmin, userId: reqUserId } = req;
193193
const { username, userId, eventTypeId, dateTo, dateFrom, teamId } = availabilitySchema.parse(req.query);
194+
const userAvailabilityService = getUserAvailabilityService()
194195
if (!teamId)
195-
return getUserAvailability({
196+
return userAvailabilityService.getUserAvailability({
196197
username,
197198
dateFrom,
198199
dateTo,
@@ -230,7 +231,7 @@ async function handler(req: NextApiRequest) {
230231
const availabilities = members.map(async (user) => {
231232
return {
232233
userId: user.id,
233-
availability: await getUserAvailability({
234+
availability: await userAvailabilityService.getUserAvailability({
234235
userId: user.id,
235236
dateFrom,
236237
dateTo,

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.276",
41+
"@calcom/platform-libraries": "npm:@calcom/platform-libraries@0.0.283",
4242
"@calcom/platform-types": "*",
4343
"@calcom/platform-utils": "*",
4444
"@calcom/prisma": "*",

apps/api/v2/src/ee/event-types/event-types_2024_04_15/controllers/event-types.controller.e2e-spec.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,10 @@ describe("Event types Endpoints", () => {
290290
expect(responseBookingFields).toBeDefined();
291291
// note(Lauris): response bookingFields are already existing default bookingFields + the new one
292292
const responseBookingField = responseBookingFields.find((field) => field.name === bookingFieldName);
293-
expect(responseBookingField).toEqual(bookingFields[0]);
293+
const fields = responseBookingField
294+
//@ts-ignore
295+
delete fields.labelAsSafeHtml
296+
expect(fields).toEqual(bookingFields[0]);
294297
eventType.bookingFields = responseBookingFields;
295298
});
296299
});

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { CacheService } from "@/lib/services/cache.service";
1212
import { CheckBookingLimitsService } from "@/lib/services/check-booking-limits.service";
1313
import { PrismaModule } from "@/modules/prisma/prisma.module";
1414
import { Module } from "@nestjs/common";
15+
import { UserAvailabilityService } from "@/lib/services/user-availability.service";
1516

1617
@Module({
1718
imports: [PrismaModule],
@@ -28,6 +29,7 @@ import { Module } from "@nestjs/common";
2829
CheckBookingLimitsService,
2930
CacheService,
3031
AvailableSlotsService,
32+
UserAvailabilityService
3133
],
3234
exports: [AvailableSlotsService],
3335
})

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { CheckBookingLimitsService } from "@/lib/services/check-booking-limits.s
1212
import { Injectable } from "@nestjs/common";
1313

1414
import { AvailableSlotsService as BaseAvailableSlotsService } from "@calcom/platform-libraries/slots";
15+
import { UserAvailabilityService } from "./user-availability.service";
1516

1617
@Injectable()
1718
export class AvailableSlotsService extends BaseAvailableSlotsService {
@@ -37,6 +38,7 @@ export class AvailableSlotsService extends BaseAvailableSlotsService {
3738
userRepo: userRepository,
3839
checkBookingLimitsService: new CheckBookingLimitsService(bookingRepository) as any,
3940
cacheService: new CacheService(featuresRepository),
41+
userAvailabilityService: new UserAvailabilityService(oooRepoDependency, bookingRepository, eventTypeRepository)
4042
});
4143
}
4244
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { PrismaBookingRepository } from "@/lib/repositories/prisma-booking.repository";
2+
import { PrismaEventTypeRepository } from "@/lib/repositories/prisma-event-type.repository";
3+
4+
import { PrismaOOORepository } from "@/lib/repositories/prisma-ooo.repository";
5+
6+
import { Injectable } from "@nestjs/common";
7+
8+
import { UserAvailabilityService as BaseUserAvailabilityService } from "@calcom/platform-libraries/schedules";
9+
10+
@Injectable()
11+
export class UserAvailabilityService extends BaseUserAvailabilityService {
12+
constructor(
13+
oooRepoDependency: PrismaOOORepository,
14+
bookingRepository: PrismaBookingRepository,
15+
eventTypeRepository: PrismaEventTypeRepository,
16+
17+
18+
) {
19+
super({
20+
oooRepo: oooRepoDependency,
21+
22+
bookingRepo: bookingRepository,
23+
24+
eventTypeRepo: eventTypeRepository,
25+
});
26+
}
27+
}

apps/api/v2/src/modules/billing/services/billing.service.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -403,6 +403,10 @@ export class BillingService implements OnModuleDestroy {
403403
fromReschedule?: string | null;
404404
}
405405
) {
406+
407+
if (this.configService.get("e2e")) {
408+
return true;
409+
}
406410
const { uid, startTime, fromReschedule } = booking;
407411

408412
const delay = startTime.getTime() - Date.now();
@@ -427,6 +431,9 @@ export class BillingService implements OnModuleDestroy {
427431
* Removing an attendee from a booking does not cancel the usage increment job.
428432
*/
429433
async cancelUsageByBookingUid(bookingUid: string) {
434+
if (this.configService.get("e2e")) {
435+
return true;
436+
}
430437
const job = await this.billingQueue.getJob(`increment-${bookingUid}`);
431438
if (job) {
432439
await job.remove();
@@ -458,6 +465,7 @@ export class BillingService implements OnModuleDestroy {
458465

459466
async onModuleDestroy() {
460467
try {
468+
461469
await this.billingQueue.close();
462470
} catch (err) {
463471
this.logger.error(err);

packages/features/bookings/lib/handleNewBooking/ensureAvailableUsers.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { checkForConflicts } from "@calcom/features/bookings/lib/conflictChecker
66
import { buildDateRanges } from "@calcom/lib/date-ranges";
77
import { ErrorCode } from "@calcom/lib/errorCodes";
88
import { getBusyTimesForLimitChecks } from "@calcom/lib/getBusyTimes";
9-
import { getUsersAvailability } from "@calcom/lib/getUserAvailability";
9+
import { getUserAvailabilityService } from "@calcom/lib/di/containers/get-user-availability";
1010
import { parseBookingLimit } from "@calcom/lib/intervalLimits/isBookingLimits";
1111
import { parseDurationLimit } from "@calcom/lib/intervalLimits/isDurationLimits";
1212
import { getPiiFreeUser } from "@calcom/lib/piiFreeData";
@@ -62,6 +62,7 @@ const _ensureAvailableUsers = async (
6262
shouldServeCache?: boolean
6363
// ReturnType hint of at least one IsFixedAwareUser, as it's made sure at least one entry exists
6464
): Promise<[IsFixedAwareUser, ...IsFixedAwareUser[]]> => {
65+
const userAvailabilityService = getUserAvailabilityService()
6566
const availableUsers: IsFixedAwareUser[] = [];
6667

6768
const startDateTimeUtc = getDateTimeInUtc(input.dateFrom, input.timeZone);
@@ -86,7 +87,7 @@ const _ensureAvailableUsers = async (
8687
})
8788
: [];
8889

89-
const usersAvailability = await getUsersAvailability({
90+
const usersAvailability = await userAvailabilityService.getUsersAvailability({
9091
users: eventType.users,
9192
query: {
9293
...input,

packages/lib/di/containers/available-slots.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { scheduleRepositoryModule } from "../modules/schedule";
1616
import { selectedSlotsRepositoryModule } from "../modules/selectedSlots";
1717
import { teamRepositoryModule } from "../modules/team";
1818
import { userRepositoryModule } from "../modules/user";
19+
import { getUserAvailabilityModule } from "../modules/get-user-availability";
1920

2021
const container = createContainer();
2122
container.load(DI_TOKENS.PRISMA_MODULE, prismaModule);
@@ -31,7 +32,7 @@ container.load(DI_TOKENS.FEATURES_REPOSITORY_MODULE, featuresRepositoryModule);
3132
container.load(DI_TOKENS.CACHE_SERVICE_MODULE, cacheModule);
3233
container.load(DI_TOKENS.CHECK_BOOKING_LIMITS_SERVICE_MODULE, checkBookingLimitsModule);
3334
container.load(DI_TOKENS.AVAILABLE_SLOTS_SERVICE_MODULE, availableSlotsModule);
34-
35+
container.load(DI_TOKENS.GET_USER_AVAILABILITY_SERVICE_MODULE, getUserAvailabilityModule)
3536
export function getAvailableSlotsService() {
3637
return container.get<AvailableSlotsService>(DI_TOKENS.AVAILABLE_SLOTS_SERVICE);
3738
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { createContainer } from "@evyweb/ioctopus";
2+
3+
import { DI_TOKENS } from "@calcom/lib/di/tokens";
4+
import { prismaModule } from "@calcom/prisma/prisma.module";
5+
6+
import { getUserAvailabilityModule } from "../modules/get-user-availability";
7+
import { bookingRepositoryModule } from "../modules/booking";
8+
9+
import { eventTypeRepositoryModule } from "../modules/eventType";
10+
11+
import { oooRepositoryModule } from "../modules/ooo";
12+
import { UserAvailabilityService } from "../../getUserAvailability";
13+
14+
const container = createContainer();
15+
container.load(DI_TOKENS.PRISMA_MODULE, prismaModule);
16+
container.load(DI_TOKENS.OOO_REPOSITORY_MODULE, oooRepositoryModule);
17+
container.load(DI_TOKENS.BOOKING_REPOSITORY_MODULE, bookingRepositoryModule);
18+
container.load(DI_TOKENS.EVENT_TYPE_REPOSITORY_MODULE, eventTypeRepositoryModule);
19+
container.load(DI_TOKENS.GET_USER_AVAILABILITY_SERVICE_MODULE, getUserAvailabilityModule);
20+
21+
export function getUserAvailabilityService() {
22+
return container.get<UserAvailabilityService>(DI_TOKENS.GET_USER_AVAILABILITY_SERVICE);
23+
}

0 commit comments

Comments
 (0)