From d158a1e00767d6a9e6bd9cd63a925a085bb9686e Mon Sep 17 00:00:00 2001 From: Somay Chauhan Date: Mon, 7 Apr 2025 12:11:19 +0530 Subject: [PATCH] fix: enabling weights on RR events breaks atoms (#20297) * fix: enabling weights on RR events breaks atoms * Update find-team-members-matching-attribute.input.ts * refactor: Extract team member processing logic into separate hook * Update find-team-members-matching-attribute.input.ts * moved `TeamMemberDto` and `FindTeamMembersMatchingAttributeOutputDto` to platform-types * `team-members.output.ts` -> `team-members-attributes.output.ts` * upgrade platform-libraries --- apps/api/v2/package.json | 2 +- apps/api/v2/src/modules/atoms/atoms.module.ts | 2 + .../atoms/controllers/atoms.controller.ts | 28 +++- ...d-team-members-matching-attribute.input.ts | 25 ++++ ...-team-members-matching-attribute.output.ts | 19 +++ .../atoms/services/attributes-atom.service.ts | 64 ++++++++ .../videos/views/videos-single-view.tsx | 2 +- .../EditWeightsForAllTeamMembers.tsx | 69 ++------- .../components/EventTypeDescription.tsx | 2 +- .../hooks/useTeamMembersWithSegment.tsx | 141 ++++++++++++++++++ packages/platform/libraries/index.ts | 3 + .../platform/types/teams/outputs/index.ts | 1 + .../outputs/team-members-attributes.output.ts | 26 ++++ yarn.lock | 10 +- 14 files changed, 327 insertions(+), 67 deletions(-) create mode 100644 apps/api/v2/src/modules/atoms/inputs/find-team-members-matching-attribute.input.ts create mode 100644 apps/api/v2/src/modules/atoms/outputs/find-team-members-matching-attribute.output.ts create mode 100644 apps/api/v2/src/modules/atoms/services/attributes-atom.service.ts create mode 100644 packages/platform/atoms/event-types/hooks/useTeamMembersWithSegment.tsx create mode 100644 packages/platform/types/teams/outputs/team-members-attributes.output.ts diff --git a/apps/api/v2/package.json b/apps/api/v2/package.json index 5ff6cee6ff..eaedc7d8e1 100644 --- a/apps/api/v2/package.json +++ b/apps/api/v2/package.json @@ -38,7 +38,7 @@ "@axiomhq/winston": "^1.2.0", "@calcom/platform-constants": "*", "@calcom/platform-enums": "*", - "@calcom/platform-libraries": "npm:@calcom/platform-libraries@0.0.171", + "@calcom/platform-libraries": "npm:@calcom/platform-libraries@0.0.172", "@calcom/platform-libraries-0.0.2": "npm:@calcom/platform-libraries@0.0.2", "@calcom/platform-types": "*", "@calcom/platform-utils": "*", diff --git a/apps/api/v2/src/modules/atoms/atoms.module.ts b/apps/api/v2/src/modules/atoms/atoms.module.ts index c7aa268984..90d15c253a 100644 --- a/apps/api/v2/src/modules/atoms/atoms.module.ts +++ b/apps/api/v2/src/modules/atoms/atoms.module.ts @@ -2,6 +2,7 @@ import { EventTypesModule_2024_06_14 } from "@/ee/event-types/event-types_2024_0 import { SchedulesRepository_2024_06_11 } from "@/ee/schedules/schedules_2024_06_11/schedules.repository"; import { AtomsRepository } from "@/modules/atoms/atoms.repository"; import { AtomsController } from "@/modules/atoms/controllers/atoms.controller"; +import { AttributesAtomsService } from "@/modules/atoms/services/attributes-atom.service"; import { ConferencingAtomsService } from "@/modules/atoms/services/conferencing-atom.service"; import { EventTypesAtomService } from "@/modules/atoms/services/event-types-atom.service"; import { CredentialsRepository } from "@/modules/credentials/credentials.repository"; @@ -19,6 +20,7 @@ import { Module } from "@nestjs/common"; providers: [ EventTypesAtomService, ConferencingAtomsService, + AttributesAtomsService, MembershipsRepository, CredentialsRepository, UsersRepository, diff --git a/apps/api/v2/src/modules/atoms/controllers/atoms.controller.ts b/apps/api/v2/src/modules/atoms/controllers/atoms.controller.ts index 8cacecf683..e91af03957 100644 --- a/apps/api/v2/src/modules/atoms/controllers/atoms.controller.ts +++ b/apps/api/v2/src/modules/atoms/controllers/atoms.controller.ts @@ -3,6 +3,8 @@ import { BulkUpdateEventTypeToDefaultLocationDto, EventTypesAppInput, } from "@/modules/atoms/inputs/event-types-app.input"; +import { FindTeamMembersMatchingAttributeQueryDto } from "@/modules/atoms/inputs/find-team-members-matching-attribute.input"; +import { AttributesAtomsService } from "@/modules/atoms/services/attributes-atom.service"; import { ConferencingAtomsService } from "@/modules/atoms/services/conferencing-atom.service"; import { EventTypesAtomService } from "@/modules/atoms/services/event-types-atom.service"; import { PlatformPlan } from "@/modules/auth/decorators/billing/platform-plan.decorator"; @@ -34,6 +36,8 @@ import { ConnectedApps } from "@calcom/platform-libraries/app-store"; import type { UpdateEventTypeReturn } from "@calcom/platform-libraries/event-types"; import { ApiResponse } from "@calcom/platform-types"; +import { FindTeamMembersMatchingAttributeResponseDto } from "../outputs/find-team-members-matching-attribute.output"; + /* Endpoints used only by platform atoms, reusing code from other modules, data is already formatted and ready to be used by frontend atoms @@ -50,7 +54,8 @@ these endpoints should not be recommended for use by third party and are exclude export class AtomsController { constructor( private readonly eventTypesService: EventTypesAtomService, - private readonly conferencingService: ConferencingAtomsService + private readonly conferencingService: ConferencingAtomsService, + private readonly attributesService: AttributesAtomsService ) {} @Get("event-types/:eventTypeId") @@ -222,4 +227,25 @@ export class AtomsController { data: conferencingApps, }; } + @Get("/organizations/:orgId/teams/:teamId/members-matching-attribute") + @Version(VERSION_NEUTRAL) + @UseGuards(ApiAuthGuard) + async findTeamMembersMatchingAttributes( + @GetUser() user: UserWithProfile, + @Param("teamId", ParseIntPipe) teamId: number, + @Param("orgId", ParseIntPipe) orgId: number, + @Query() query: FindTeamMembersMatchingAttributeQueryDto + ): Promise { + const result = await this.attributesService.findTeamMembersMatchingAttribute(teamId, orgId, { + attributesQueryValue: query.attributesQueryValue, + isPreview: query.isPreview, + enablePerf: query.enablePerf, + concurrency: query.concurrency, + }); + + return { + status: SUCCESS_STATUS, + data: result, + }; + } } diff --git a/apps/api/v2/src/modules/atoms/inputs/find-team-members-matching-attribute.input.ts b/apps/api/v2/src/modules/atoms/inputs/find-team-members-matching-attribute.input.ts new file mode 100644 index 0000000000..19ae695cff --- /dev/null +++ b/apps/api/v2/src/modules/atoms/inputs/find-team-members-matching-attribute.input.ts @@ -0,0 +1,25 @@ +import { ApiPropertyOptional } from "@nestjs/swagger"; + +import type { TFindTeamMembersMatchingAttributeLogicInputSchema } from "@calcom/platform-libraries"; + +export class FindTeamMembersMatchingAttributeQueryDto { + @ApiPropertyOptional({ + nullable: true, + }) + attributesQueryValue: TFindTeamMembersMatchingAttributeLogicInputSchema["attributesQueryValue"]; + + @ApiPropertyOptional({ + type: Boolean, + }) + isPreview?: boolean; + + @ApiPropertyOptional({ + type: Boolean, + }) + enablePerf?: boolean; + + @ApiPropertyOptional({ + type: Number, + }) + concurrency?: number; +} diff --git a/apps/api/v2/src/modules/atoms/outputs/find-team-members-matching-attribute.output.ts b/apps/api/v2/src/modules/atoms/outputs/find-team-members-matching-attribute.output.ts new file mode 100644 index 0000000000..2d80b40ae0 --- /dev/null +++ b/apps/api/v2/src/modules/atoms/outputs/find-team-members-matching-attribute.output.ts @@ -0,0 +1,19 @@ +import { ApiProperty } from "@nestjs/swagger"; +import { Expose, Type } from "class-transformer"; +import { IsString, ValidateNested } from "class-validator"; + +import { SUCCESS_STATUS, ERROR_STATUS } from "@calcom/platform-constants"; +import { FindTeamMembersMatchingAttributeOutputDto } from "@calcom/platform-types"; + +export class FindTeamMembersMatchingAttributeResponseDto { + @ApiProperty({ example: SUCCESS_STATUS, enum: [SUCCESS_STATUS, ERROR_STATUS] }) + @IsString() + @Expose() + readonly status!: typeof SUCCESS_STATUS | typeof ERROR_STATUS; + + @ValidateNested() + @Type(() => FindTeamMembersMatchingAttributeOutputDto) + @Expose() + @ApiProperty({ type: FindTeamMembersMatchingAttributeOutputDto }) + readonly data!: FindTeamMembersMatchingAttributeOutputDto; +} diff --git a/apps/api/v2/src/modules/atoms/services/attributes-atom.service.ts b/apps/api/v2/src/modules/atoms/services/attributes-atom.service.ts new file mode 100644 index 0000000000..d4f38e2f90 --- /dev/null +++ b/apps/api/v2/src/modules/atoms/services/attributes-atom.service.ts @@ -0,0 +1,64 @@ +import { UsersRepository } from "@/modules/users/users.repository"; +import { Logger } from "@nestjs/common"; +import { Injectable } from "@nestjs/common"; + +import { findTeamMembersMatchingAttributeLogic } from "@calcom/platform-libraries"; + +import { FindTeamMembersMatchingAttributeQueryDto } from "../inputs/find-team-members-matching-attribute.input"; + +@Injectable() +export class AttributesAtomsService { + private logger = new Logger("AttributesAtomService"); + + constructor(private readonly usersRepository: UsersRepository) {} + + async findTeamMembersMatchingAttribute( + teamId: number, + orgId: number, + input: FindTeamMembersMatchingAttributeQueryDto + ) { + const { + teamMembersMatchingAttributeLogic: matchingTeamMembersWithResult, + mainAttributeLogicBuildingWarnings: mainWarnings, + fallbackAttributeLogicBuildingWarnings: fallbackWarnings, + troubleshooter, + } = await findTeamMembersMatchingAttributeLogic( + { + teamId, + orgId, + attributesQueryValue: input.attributesQueryValue, + }, + { + enablePerf: input.enablePerf, + concurrency: input.concurrency, + enableTroubleshooter: input.enablePerf, + } + ); + + if (!matchingTeamMembersWithResult) { + return { + troubleshooter, + mainWarnings, + fallbackWarnings, + result: null, + }; + } + + const matchingTeamMembersIds = matchingTeamMembersWithResult.map( + (member: { userId: number }) => member.userId + ); + + const matchingTeamMembers = await this.usersRepository.findByIds(matchingTeamMembersIds); + + return { + mainWarnings, + fallbackWarnings, + troubleshooter: troubleshooter, + result: matchingTeamMembers.map((user) => ({ + id: user.id, + name: user.name, + email: user.email, + })), + }; + } +} diff --git a/apps/web/modules/videos/views/videos-single-view.tsx b/apps/web/modules/videos/views/videos-single-view.tsx index 2c323e3ed0..e018f37500 100644 --- a/apps/web/modules/videos/views/videos-single-view.tsx +++ b/apps/web/modules/videos/views/videos-single-view.tsx @@ -12,8 +12,8 @@ import { formatToLocalizedDate, formatToLocalizedTime } from "@calcom/lib/date-f import { useLocale } from "@calcom/lib/hooks/useLocale"; import { markdownToSafeHTML } from "@calcom/lib/markdownToSafeHTML"; import type { inferSSRProps } from "@calcom/types/inferSSRProps"; -import { Icon } from "@calcom/ui/components/icon"; import classNames from "@calcom/ui/classNames"; +import { Icon } from "@calcom/ui/components/icon"; import type { getServerSideProps } from "@lib/video/[uid]/getServerSideProps"; diff --git a/packages/features/eventtypes/components/EditWeightsForAllTeamMembers.tsx b/packages/features/eventtypes/components/EditWeightsForAllTeamMembers.tsx index 08bc5f61a4..2fef42dc7d 100644 --- a/packages/features/eventtypes/components/EditWeightsForAllTeamMembers.tsx +++ b/packages/features/eventtypes/components/EditWeightsForAllTeamMembers.tsx @@ -3,12 +3,12 @@ import Link from "next/link"; import { useState, useEffect, useRef, useMemo } from "react"; +import { useIsPlatform } from "@calcom/atoms/hooks/useIsPlatform"; import type { Host, TeamMember } from "@calcom/features/eventtypes/lib/types"; import ServerTrans from "@calcom/lib/components/ServerTrans"; import { downloadAsCsv } from "@calcom/lib/csvUtils"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import type { AttributesQueryValue } from "@calcom/lib/raqb/types"; -import { trpc } from "@calcom/trpc"; import { Avatar } from "@calcom/ui/components/avatar"; import { buttonClasses } from "@calcom/ui/components/button"; import { Button } from "@calcom/ui/components/button"; @@ -25,6 +25,11 @@ import { } from "@calcom/ui/components/sheet"; import { showToast } from "@calcom/ui/components/toast"; +import { + useTeamMembersWithSegment, + useTeamMembersWithSegmentPlatform, +} from "../../../platform/atoms/event-types/hooks/useTeamMembersWithSegment"; + type TeamMemberItemProps = { member: Omit & { weight?: number }; onWeightChange: (memberId: string, weight: number) => void; @@ -93,62 +98,6 @@ const TeamMemberItem = ({ member, onWeightChange }: TeamMemberItemProps) => { ); }; -interface UseTeamMembersWithSegmentProps { - initialTeamMembers: TeamMember[]; - assignRRMembersUsingSegment: boolean; - teamId?: number; - queryValue?: AttributesQueryValue | null; - value: Host[]; -} - -const useTeamMembersWithSegment = ({ - initialTeamMembers, - assignRRMembersUsingSegment, - teamId, - queryValue, - value, -}: UseTeamMembersWithSegmentProps) => { - const { data: matchingTeamMembersWithResult, isPending } = - trpc.viewer.attributes.findTeamMembersMatchingAttributeLogic.useQuery( - { - teamId: teamId || 0, - attributesQueryValue: queryValue as AttributesQueryValue, - _enablePerf: true, - }, - { - enabled: assignRRMembersUsingSegment && !!queryValue && !!teamId, - } - ); - - const teamMembers = useMemo(() => { - if (assignRRMembersUsingSegment && matchingTeamMembersWithResult?.result) { - return matchingTeamMembersWithResult.result.map((member) => ({ - value: member.id.toString(), - label: member.name || member.email, - email: member.email, - avatar: "", // Add avatar with fallback to empty string - })); - } - return initialTeamMembers; - }, [assignRRMembersUsingSegment, matchingTeamMembersWithResult, initialTeamMembers]); - - const localWeightsInitialValues = useMemo( - () => - teamMembers.reduce>((acc, member) => { - const memberInValue = value.find((host) => host.userId === parseInt(member.value, 10)); - acc[member.value] = memberInValue?.weight ?? 100; - return acc; - }, {}), - [teamMembers, value] - ); - - return { - teamMembers, - localWeightsInitialValues, - isPending, - }; -}; - interface Props { teamMembers: TeamMember[]; value: Host[]; @@ -172,7 +121,11 @@ export const EditWeightsForAllTeamMembers = ({ const { t } = useLocale(); const [searchQuery, setSearchQuery] = useState(""); - const { teamMembers, localWeightsInitialValues } = useTeamMembersWithSegment({ + const isPlatform = useIsPlatform(); + + const useTeamMembersHook = isPlatform ? useTeamMembersWithSegmentPlatform : useTeamMembersWithSegment; + + const { teamMembers, localWeightsInitialValues } = useTeamMembersHook({ initialTeamMembers, assignRRMembersUsingSegment, teamId, diff --git a/packages/features/eventtypes/components/EventTypeDescription.tsx b/packages/features/eventtypes/components/EventTypeDescription.tsx index 22b285a90b..8fbef8f0ba 100644 --- a/packages/features/eventtypes/components/EventTypeDescription.tsx +++ b/packages/features/eventtypes/components/EventTypeDescription.tsx @@ -12,8 +12,8 @@ import type { baseEventTypeSelect } from "@calcom/prisma"; import { SchedulingType } from "@calcom/prisma/enums"; import type { EventTypeModel } from "@calcom/prisma/zod"; import { eventTypeMetaDataSchemaWithTypedApps } from "@calcom/prisma/zod-utils"; -import { Badge } from "@calcom/ui/components/badge"; import classNames from "@calcom/ui/classNames"; +import { Badge } from "@calcom/ui/components/badge"; export type EventTypeDescriptionProps = { eventType: Pick< diff --git a/packages/platform/atoms/event-types/hooks/useTeamMembersWithSegment.tsx b/packages/platform/atoms/event-types/hooks/useTeamMembersWithSegment.tsx new file mode 100644 index 0000000000..da3a36b122 --- /dev/null +++ b/packages/platform/atoms/event-types/hooks/useTeamMembersWithSegment.tsx @@ -0,0 +1,141 @@ +import { useQuery } from "@tanstack/react-query"; +import { useMemo } from "react"; + +import type { Host, TeamMember } from "@calcom/features/eventtypes/lib/types"; +import type { AttributesQueryValue } from "@calcom/lib/raqb/types"; +import { SUCCESS_STATUS } from "@calcom/platform-constants"; +import type { + ApiResponse, + ApiSuccessResponse, + TeamMemberDto, + FindTeamMembersMatchingAttributeOutputDto, +} from "@calcom/platform-types"; +import { trpc } from "@calcom/trpc/react"; + +import { useAtomsContext } from "../../hooks/useAtomsContext"; +import http from "../../lib/http"; + +interface UseTeamMembersWithSegmentProps { + initialTeamMembers: TeamMember[]; + assignRRMembersUsingSegment: boolean; + teamId?: number; + orgId?: number; + queryValue?: AttributesQueryValue | null; + value: Host[]; +} + +const useProcessTeamMembersData = ({ + initialTeamMembers, + assignRRMembersUsingSegment, + matchingTeamMembersWithResult, + value, +}: { + initialTeamMembers: TeamMember[]; + assignRRMembersUsingSegment: boolean; + matchingTeamMembersWithResult?: { result: TeamMemberDto[] | null }; + value: Host[]; +}) => { + const teamMembers = useMemo(() => { + if (assignRRMembersUsingSegment && matchingTeamMembersWithResult?.result) { + return matchingTeamMembersWithResult.result.map((member) => ({ + value: member.id.toString(), + label: member.name || member.email, + email: member.email, + avatar: "", + })); + } + return initialTeamMembers; + }, [assignRRMembersUsingSegment, matchingTeamMembersWithResult, initialTeamMembers]); + + const localWeightsInitialValues = useMemo( + () => + teamMembers.reduce>((acc, member) => { + const memberInValue = value.find((host) => host.userId === parseInt(member.value, 10)); + acc[member.value] = memberInValue?.weight ?? 100; + return acc; + }, {}), + [teamMembers, value] + ); + + return { + teamMembers, + localWeightsInitialValues, + }; +}; + +export const useTeamMembersWithSegmentPlatform = ({ + initialTeamMembers, + assignRRMembersUsingSegment, + teamId, + orgId, + queryValue, + value, +}: UseTeamMembersWithSegmentProps) => { + const { isInit } = useAtomsContext(); + + const pathname = `/atoms/organizations/${orgId}/teams/${teamId}/members-matching-attribute?${new URLSearchParams( + { + attributesQueryValue: queryValue ? JSON.stringify(queryValue) : "", + enablePerf: "true", + } + )}`; + + const { data: matchingTeamMembersWithResult, isPending } = useQuery({ + queryKey: ["teamMembersMatchingAttribute", teamId, orgId, queryValue], + queryFn: async () => { + return http?.get>(pathname).then((res) => { + if (res.data.status === SUCCESS_STATUS) { + return (res.data as ApiSuccessResponse).data; + } + throw new Error(res.data.error.message); + }); + }, + enabled: isInit && !!teamId && !!orgId, + }); + + const { teamMembers, localWeightsInitialValues } = useProcessTeamMembersData({ + initialTeamMembers, + assignRRMembersUsingSegment, + matchingTeamMembersWithResult, + value, + }); + + return { + teamMembers, + localWeightsInitialValues, + isPending, + }; +}; + +export const useTeamMembersWithSegment = ({ + initialTeamMembers, + assignRRMembersUsingSegment, + teamId, + queryValue, + value, +}: UseTeamMembersWithSegmentProps) => { + const { data: matchingTeamMembersWithResult, isPending } = + trpc.viewer.attributes.findTeamMembersMatchingAttributeLogic.useQuery( + { + teamId: teamId || 0, + attributesQueryValue: queryValue as AttributesQueryValue, + _enablePerf: true, + }, + { + enabled: assignRRMembersUsingSegment && !!queryValue && !!teamId, + } + ); + + const { teamMembers, localWeightsInitialValues } = useProcessTeamMembersData({ + initialTeamMembers, + assignRRMembersUsingSegment, + matchingTeamMembersWithResult, + value, + }); + + return { + teamMembers, + localWeightsInitialValues, + isPending, + }; +}; diff --git a/packages/platform/libraries/index.ts b/packages/platform/libraries/index.ts index e7dfc941a5..0c410329ea 100644 --- a/packages/platform/libraries/index.ts +++ b/packages/platform/libraries/index.ts @@ -113,4 +113,7 @@ export { SelectedCalendarRepository } from "@calcom/lib/server/repository/select export { encryptServiceAccountKey } from "@calcom/lib/server/serviceAccountKey"; export { createHandler as createApiKeyHandler } from "@calcom/trpc/server/routers/viewer/apiKeys/create.handler"; export { getCalendarLinks } from "@calcom/lib/bookings/getCalendarLinks"; + +export { findTeamMembersMatchingAttributeLogic } from "@calcom/lib/raqb/findTeamMembersMatchingAttributeLogic"; +export type { TFindTeamMembersMatchingAttributeLogicInputSchema } from "@calcom/trpc/server/routers/viewer/attributes/findTeamMembersMatchingAttributeLogic.schema"; export { checkAdminOrOwner } from "@calcom/features/auth/lib/checkAdminOrOwner"; diff --git a/packages/platform/types/teams/outputs/index.ts b/packages/platform/types/teams/outputs/index.ts index 919d6058c9..e400cce12a 100644 --- a/packages/platform/types/teams/outputs/index.ts +++ b/packages/platform/types/teams/outputs/index.ts @@ -1 +1,2 @@ export * from "./team.output"; +export * from "./team-members-attributes.output"; diff --git a/packages/platform/types/teams/outputs/team-members-attributes.output.ts b/packages/platform/types/teams/outputs/team-members-attributes.output.ts new file mode 100644 index 0000000000..068a12637c --- /dev/null +++ b/packages/platform/types/teams/outputs/team-members-attributes.output.ts @@ -0,0 +1,26 @@ +import { Expose, Type } from "class-transformer"; +import { IsArray, IsInt, IsOptional, IsString, ValidateNested } from "class-validator"; + +export class TeamMemberDto { + @IsInt() + @Expose() + readonly id!: number; + + @IsOptional() + @IsString() + @Expose() + readonly name!: string | null; + + @IsString() + @Expose() + readonly email!: string; +} + +export class FindTeamMembersMatchingAttributeOutputDto { + @IsOptional() + @IsArray() + @ValidateNested({ each: true }) + @Type(() => TeamMemberDto) + @Expose() + readonly result!: TeamMemberDto[] | null; +} diff --git a/yarn.lock b/yarn.lock index 58ca673f6c..3a299a5591 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2297,7 +2297,7 @@ __metadata: "@axiomhq/winston": ^1.2.0 "@calcom/platform-constants": "*" "@calcom/platform-enums": "*" - "@calcom/platform-libraries": "npm:@calcom/platform-libraries@0.0.171" + "@calcom/platform-libraries": "npm:@calcom/platform-libraries@0.0.172" "@calcom/platform-libraries-0.0.2": "npm:@calcom/platform-libraries@0.0.2" "@calcom/platform-types": "*" "@calcom/platform-utils": "*" @@ -3345,13 +3345,13 @@ __metadata: languageName: node linkType: hard -"@calcom/platform-libraries@npm:@calcom/platform-libraries@0.0.171": - version: 0.0.171 - resolution: "@calcom/platform-libraries@npm:0.0.171" +"@calcom/platform-libraries@npm:@calcom/platform-libraries@0.0.172": + version: 0.0.172 + resolution: "@calcom/platform-libraries@npm:0.0.172" dependencies: "@calcom/features": "*" "@calcom/lib": "*" - checksum: 8941ebb4436883d1472a82e9178410ead2d5d73101ce285c1d3acd2da6ab9829d787d24e92fe95561d404a862b28b098d5875fbe6b5c4a07666d2dabae84f288 + checksum: b7086cff4367194a8495d3ae0081632d8b5afbde43633c2a290296f300f5a898dd13b194665efa2e11946a448d562153674f6922c36b595935c262ea7eb994b7 languageName: node linkType: hard