fix: platform libraries barrel file extract event-types (#19846)

* fix: event-types

* chore: added "+ group link" tip (#19809)

* added + link tip

* nit

---------

Co-authored-by: amrit <iamamrit27@gmail.com>
Co-authored-by: Anik Dhabal Babu <81948346+anikdhabal@users.noreply.github.com>
Co-authored-by: Tushar Bhatt <95581504+TusharBhatt1@users.noreply.github.com>

* Added fix to solve the id TypeError (#19810)

Co-authored-by: amrit <iamamrit27@gmail.com>
Co-authored-by: Udit Takkar <53316345+Udit-takkar@users.noreply.github.com>
Co-authored-by: Anik Dhabal Babu <81948346+anikdhabal@users.noreply.github.com>
Co-authored-by: Tushar Bhatt <95581504+TusharBhatt1@users.noreply.github.com>

* Revert "fix: prevent background scroll on opening timezone select menu (#19789)" (#19814)

This reverts commit 1a96149ce3.

* fix: Calendar events attached to workflow emails are missing meeting link (#19790)

* fixup! fix: Calendar events attached to workflow emails are missing meeting link (#19790)

* chore: fix type errors

* fix: wrong import in e2e file

* fix: tsconfig api v2 for /event-types

* fix: import and refactor

* fixed remaning type issues

* undo extra changes

* bump platform libs

* Update event-types.controller.e2e-spec.ts

* fix: test with seats enabled

---------

Co-authored-by: Peer Richelsen <peeroke@gmail.com>
Co-authored-by: amrit <iamamrit27@gmail.com>
Co-authored-by: Anik Dhabal Babu <81948346+anikdhabal@users.noreply.github.com>
Co-authored-by: Tushar Bhatt <95581504+TusharBhatt1@users.noreply.github.com>
Co-authored-by: Harshit Singh <73997189+harshit078@users.noreply.github.com>
Co-authored-by: Udit Takkar <53316345+Udit-takkar@users.noreply.github.com>
Co-authored-by: Morgan Vernay <morgan@cal.com>
Co-authored-by: Morgan <33722304+ThyMinimalDev@users.noreply.github.com>
This commit is contained in:
Somay Chauhan
2025-03-10 12:34:53 +00:00
committed by GitHub
co-authored by amrit Anik Dhabal Babu Tushar Bhatt Udit Takkar Peer Richelsen Harshit Singh Morgan Vernay Morgan
parent d47a5be659
commit cb437231ad
27 changed files with 281 additions and 150 deletions
+1 -1
View File
@@ -32,7 +32,7 @@
"@axiomhq/winston": "^1.2.0",
"@calcom/platform-constants": "*",
"@calcom/platform-enums": "*",
"@calcom/platform-libraries": "npm:@calcom/platform-libraries@0.0.140",
"@calcom/platform-libraries": "npm:@calcom/platform-libraries@0.0.141",
"@calcom/platform-libraries-0.0.2": "npm:@calcom/platform-libraries@0.0.2",
"@calcom/platform-types": "*",
"@calcom/platform-utils": "*",
@@ -19,7 +19,7 @@ import { NextApiRequest } from "next/types";
import { v4 as uuidv4 } from "uuid";
import { z } from "zod";
import { EventTypeMetaDataSchema } from "@calcom/platform-libraries";
import { EventTypeMetaDataSchema } from "@calcom/platform-libraries/event-types";
import {
CancelBookingInput,
CancelBookingInput_2024_08_13,
@@ -208,7 +208,7 @@ export class ConnectedCalendar {
class DestinationCalendar {
@IsInt()
@ApiProperty()
id!: number;
id!: number | string;
@IsString()
@ApiProperty()
@@ -33,10 +33,10 @@ import {
} from "@calcom/platform-constants";
import {
EventTypesByViewer,
EventTypesPublic,
eventTypeBookingFields,
eventTypeLocations,
} from "@calcom/platform-libraries";
EventTypesPublic,
} from "@calcom/platform-libraries/event-types";
import { ApiSuccessResponse } from "@calcom/platform-types";
describe("Event types Endpoints", () => {
@@ -5,7 +5,7 @@ import { UsersService } from "@/modules/users/services/users.service";
import { UserWithProfile } from "@/modules/users/users.repository";
import { Injectable } from "@nestjs/common";
import { getEventTypeById } from "@calcom/platform-libraries";
import { getEventTypeById } from "@calcom/platform-libraries/event-types";
import type { PrismaClient } from "@calcom/prisma";
@Injectable()
@@ -1,6 +1,8 @@
import { DEFAULT_EVENT_TYPES } from "@/ee/event-types/event-types_2024_04_15/constants/constants";
import { EventTypesRepository_2024_04_15 } from "@/ee/event-types/event-types_2024_04_15/event-types.repository";
import { CreateEventTypeInput_2024_04_15 } from "@/ee/event-types/event-types_2024_04_15/inputs/create-event-type.input";
import { Editable } from "@/ee/event-types/event-types_2024_04_15/inputs/enums/editable";
import { BaseField } from "@/ee/event-types/event-types_2024_04_15/inputs/enums/field-type";
import { UpdateEventTypeInput_2024_04_15 } from "@/ee/event-types/event-types_2024_04_15/inputs/update-event-type.input";
import { EventTypeOutput } from "@/ee/event-types/event-types_2024_04_15/outputs/event-type.output";
import { MembershipsRepository } from "@/modules/memberships/memberships.repository";
@@ -16,7 +18,7 @@ import {
EventTypesPublic,
getEventTypesPublic,
systemBeforeFieldEmail,
} from "@calcom/platform-libraries";
} from "@calcom/platform-libraries/event-types";
import { EventType } from "@calcom/prisma/client";
@Injectable()
@@ -68,6 +70,7 @@ export class EventTypesService_2024_04_15 {
organization: { isOrgAdmin },
profile: { id: profileId },
metadata: user.metadata,
email: user.email,
};
}
@@ -134,7 +137,7 @@ export class EventTypesService_2024_04_15 {
!bookingFields.find((field) => field.type === "email") &&
!bookingFields.find((field) => field.type === "phone")
) {
bookingFields.push(systemBeforeFieldEmail);
bookingFields.push({ ...systemBeforeFieldEmail, type: BaseField.email, editable: Editable.system });
}
await updateEventType({
@@ -167,7 +170,15 @@ export class EventTypesService_2024_04_15 {
async getUserToUpdateEvent(user: UserWithProfile) {
const profileId = this.usersService.getUserMainProfile(user)?.id || null;
const selectedCalendars = await this.selectedCalendarsRepository.getUserSelectedCalendars(user.id);
return { ...user, profile: { id: profileId }, selectedCalendars };
const eventTypeSelectedCalendars =
await this.selectedCalendarsRepository.getUserEventTypeSelectedCalendar(user.id);
return {
...user,
locale: user.locale ?? "en",
profile: { id: profileId },
userLevelSelectedCalendars: selectedCalendars,
allSelectedCalendars: [...eventTypeSelectedCalendars, ...selectedCalendars],
};
}
async deleteEventType(eventTypeId: number, userId: number) {
@@ -8,9 +8,13 @@ import { UsersService } from "@/modules/users/services/users.service";
import { UserWithProfile, UsersRepository } from "@/modules/users/users.repository";
import { BadRequestException, ForbiddenException, Injectable, NotFoundException } from "@nestjs/common";
import { createEventType, updateEventType } from "@calcom/platform-libraries";
import { getEventTypesPublic, EventTypesPublic } from "@calcom/platform-libraries";
import { dynamicEvent } from "@calcom/platform-libraries";
import {
createEventType,
updateEventType,
getEventTypesPublic,
EventTypesPublic,
} from "@calcom/platform-libraries/event-types";
import { GetEventTypesQuery_2024_06_14, InputEventTransformed_2024_06_14 } from "@calcom/platform-types";
import { EventType } from "@calcom/prisma/client";
@@ -112,8 +116,11 @@ export class EventTypesService_2024_06_14 {
: false;
const profileId = this.usersService.getUserMainProfile(user)?.id || null;
const selectedCalendars = await this.selectedCalendarsRepository.getUserSelectedCalendars(user.id);
const eventTypeSelectedCalendars =
await this.selectedCalendarsRepository.getUserEventTypeSelectedCalendar(user.id);
return {
id: user.id,
locale: user.locale ?? "en",
role: user.role,
username: user.username,
organizationId: user.organizationId,
@@ -122,6 +129,8 @@ export class EventTypesService_2024_06_14 {
metadata: user.metadata,
selectedCalendars,
email: user.email,
userLevelSelectedCalendars: selectedCalendars,
allSelectedCalendars: [...eventTypeSelectedCalendars, ...selectedCalendars],
};
}
@@ -205,7 +214,11 @@ export class EventTypesService_2024_06_14 {
return defaultEventTypes;
}
async updateEventType(eventTypeId: number, body: InputEventTransformed_2024_06_14, user: UserWithProfile) {
async updateEventType(
eventTypeId: number,
body: Partial<InputEventTransformed_2024_06_14>,
user: UserWithProfile
) {
await this.checkCanUpdateEventType(user.id, eventTypeId, body.scheduleId);
const eventTypeUser = await this.getUserToUpdateEvent(user);
@@ -231,7 +244,7 @@ export class EventTypesService_2024_06_14 {
};
}
async checkCanUpdateEventType(userId: number, eventTypeId: number, scheduleId: number | undefined) {
async checkCanUpdateEventType(userId: number, eventTypeId: number, scheduleId: number | undefined | null) {
const existingEventType = await this.getUserEventType(userId, eventTypeId);
if (!existingEventType) {
throw new NotFoundException(`Event type with id ${eventTypeId} not found`);
@@ -243,7 +256,15 @@ export class EventTypesService_2024_06_14 {
async getUserToUpdateEvent(user: UserWithProfile) {
const profileId = this.usersService.getUserMainProfile(user)?.id || null;
const selectedCalendars = await this.selectedCalendarsRepository.getUserSelectedCalendars(user.id);
return { ...user, profile: { id: profileId }, selectedCalendars };
const eventTypeSelectedCalendars =
await this.selectedCalendarsRepository.getUserEventTypeSelectedCalendar(user.id);
return {
...user,
locale: user.locale ?? "en",
profile: { id: profileId },
userLevelSelectedCalendars: selectedCalendars,
allSelectedCalendars: [...eventTypeSelectedCalendars, ...selectedCalendars],
};
}
async deleteEventType(eventTypeId: number, userId: number) {
@@ -25,13 +25,17 @@ import {
transformSeatsApiToInternal,
SystemField,
CustomField,
} from "@calcom/platform-libraries";
InternalLocation,
InternalLocationSchema,
} from "@calcom/platform-libraries/event-types";
import {
CreateEventTypeInput_2024_06_14,
DestinationCalendar_2024_06_14,
InputEventTransformed_2024_06_14,
OutputUnknownLocation_2024_06_14,
UpdateEventTypeInput_2024_06_14,
} from "@calcom/platform-types";
import { BookerLayouts } from "@calcom/prisma/zod-utils";
import { OutputEventTypesService_2024_06_14 } from "./output-event-types.service";
@@ -58,7 +62,7 @@ export class InputEventTypesService_2024_06_14 {
const transformedBody = this.transformInputCreateEventType(inputEventType);
await this.validateEventTypeInputs({
seatsPerTimeSlot: transformedBody.seatsPerTimeSlot,
seatsPerTimeSlot: transformedBody?.seatsPerTimeSlot || null,
locations: transformedBody.locations,
requiresConfirmation: transformedBody.requiresConfirmation,
eventName: transformedBody.eventName,
@@ -272,7 +276,12 @@ export class InputEventTypesService_2024_06_14 {
}
transformInputBookerLayouts(inputBookerLayouts: CreateEventTypeInput_2024_06_14["bookerLayouts"]) {
return transformBookerLayoutsApiToInternal(inputBookerLayouts);
const layouts = transformBookerLayoutsApiToInternal(inputBookerLayouts);
if (!layouts) return undefined;
return {
defaultLayout: layouts.defaultLayout as unknown as BookerLayouts,
enabledLayouts: layouts.enabledLayouts as unknown as BookerLayouts[],
};
}
transformInputConfirmationPolicy(
@@ -303,23 +312,22 @@ export class InputEventTypesService_2024_06_14 {
eventName,
}: ValidationContext) {
let seatsPerTimeSlotDb: number | null = null;
let locationsDb: ReturnType<typeof this.transformInputLocations> = [];
let locationsDb: ReturnType<typeof this.transformLocations> = [];
let requiresConfirmationDb = false;
if (eventTypeId != null) {
const eventTypeDb = await this.eventTypesRepository.getEventTypeWithSeats(eventTypeId);
seatsPerTimeSlotDb = eventTypeDb?.seatsPerTimeSlot ?? null;
locationsDb = this.outputEventTypesService.transformLocations(eventTypeDb?.locations) ?? [];
locationsDb = this.transformLocations(eventTypeDb?.locations) ?? [];
requiresConfirmationDb = eventTypeDb?.requiresConfirmation ?? false;
}
const seatsPerTimeSlotFinal = seatsPerTimeSlot !== undefined ? seatsPerTimeSlot : seatsPerTimeSlotDb;
const seatsEnabledFinal = seatsPerTimeSlotFinal != null && seatsPerTimeSlotFinal > 0;
const seatsPerTimeSlotFinal = !!seatsPerTimeSlot ? seatsPerTimeSlot : seatsPerTimeSlotDb;
const seatsEnabledFinal = !!seatsPerTimeSlotFinal && seatsPerTimeSlotFinal > 0;
const locationsFinal = locations !== undefined ? locations : locationsDb;
const requiresConfirmationFinal =
requiresConfirmation !== undefined ? requiresConfirmation : requiresConfirmationDb;
this.validateSeatsSingleLocationRule(seatsEnabledFinal, locationsFinal);
this.validateSeatsRequiresConfirmationFalseRule(seatsEnabledFinal, requiresConfirmationFinal);
this.validateMultipleLocationsSeatsDisabledRule(locationsFinal, seatsEnabledFinal);
@@ -331,7 +339,7 @@ export class InputEventTypesService_2024_06_14 {
}
validateSeatsSingleLocationRule(
seatsEnabled: boolean,
locations: ReturnType<typeof this.transformInputLocations>
locations: ReturnType<typeof this.transformLocations>
) {
if (seatsEnabled && locations.length > 1) {
throw new BadRequestException(
@@ -339,6 +347,22 @@ export class InputEventTypesService_2024_06_14 {
);
}
}
transformLocations(locations: any) {
if (!locations) return [];
const knownLocations: InternalLocation[] = [];
const unknownLocations: OutputUnknownLocation_2024_06_14[] = [];
for (const location of locations) {
const result = InternalLocationSchema.safeParse(location);
if (result.success) {
knownLocations.push(result.data);
} else {
unknownLocations.push({ type: "unknown", location: JSON.stringify(location) });
}
}
return [...knownLocations];
}
validateSeatsRequiresConfirmationFalseRule(seatsEnabled: boolean, requiresConfirmation: boolean) {
if (seatsEnabled && requiresConfirmation) {
@@ -349,7 +373,7 @@ export class InputEventTypesService_2024_06_14 {
}
validateMultipleLocationsSeatsDisabledRule(
locations: ReturnType<typeof this.transformInputLocations>,
locations: ReturnType<typeof this.transformLocations>,
seatsEnabled: boolean
) {
if (locations.length > 1 && seatsEnabled) {
@@ -2,15 +2,18 @@ import { Injectable } from "@nestjs/common";
import type { EventType, User, Schedule, DestinationCalendar } from "@prisma/client";
import {
EventTypeMetaDataSchema,
userMetadata,
parseBookingLimit,
parseRecurringEvent,
getBookingFieldsWithSystemFields,
} from "@calcom/platform-libraries";
import {
EventTypeMetaDataSchema,
transformLocationsInternalToApi,
transformBookingFieldsInternalToApi,
parseRecurringEvent,
InternalLocationSchema,
SystemField,
CustomField,
parseBookingLimit,
transformIntervalLimitsInternalToApi,
transformFutureBookingLimitsInternalToApi,
transformRecurrenceInternalToApi,
@@ -21,8 +24,7 @@ import {
transformSeatsInternalToApi,
InternalLocation,
BookingFieldSchema,
getBookingFieldsWithSystemFields,
} from "@calcom/platform-libraries";
} from "@calcom/platform-libraries/event-types";
import {
TransformFutureBookingsLimitSchema_2024_06_14,
BookerLayoutsTransformedSchema,
@@ -198,13 +200,13 @@ export class OutputEventTypesService_2024_06_14 {
};
}
transformLocations(locations: any) {
if (!locations) return [];
transformLocations(locationDb: any) {
if (!locationDb) return [];
const knownLocations: InternalLocation[] = [];
const unknownLocations: OutputUnknownLocation_2024_06_14[] = [];
for (const location of locations) {
for (const location of locationDb) {
const result = InternalLocationSchema.safeParse(location);
if (result.success) {
knownLocations.push(result.data);
@@ -315,6 +317,7 @@ export class OutputEventTypesService_2024_06_14 {
transformEventTypeColor(eventTypeColor: any) {
if (!eventTypeColor) return undefined;
const parsedeventTypeColor = parseEventTypeColor(eventTypeColor);
if (!parsedeventTypeColor) return undefined;
return transformEventTypeColorsInternalToApi(parsedeventTypeColor);
}
@@ -23,8 +23,8 @@ import {
import { ApiTags as DocsTags, ApiExcludeController as DocsExcludeController } from "@nestjs/swagger";
import { ERROR_STATUS, SUCCESS_STATUS } from "@calcom/platform-constants";
import type { UpdateEventTypeReturn } from "@calcom/platform-libraries";
import { ConnectedApps } from "@calcom/platform-libraries";
import type { UpdateEventTypeReturn } from "@calcom/platform-libraries/event-types";
import { ApiResponse } from "@calcom/platform-types";
/*
@@ -81,7 +81,7 @@ export class AtomsController {
): Promise<ApiResponse<unknown>> {
const { teamId } = queryParams;
const app = await this.eventTypesService.getEventTypesAppIntegration(appSlug, user.id, user.name, teamId);
const app = await this.eventTypesService.getEventTypesAppIntegration(appSlug, user, teamId);
return {
status: SUCCESS_STATUS,
@@ -124,7 +124,11 @@ export class AtomsController {
@Param("eventTypeId", ParseIntPipe) eventTypeId: number,
@Body() body: UpdateEventTypeReturn
): Promise<ApiResponse<UpdateEventTypeReturn>> {
const eventType = await this.eventTypesService.updateEventType(eventTypeId, body, user);
const eventType = await this.eventTypesService.updateEventType(
eventTypeId,
{ ...body, id: eventTypeId },
user
);
return {
status: SUCCESS_STATUS,
data: eventType,
@@ -140,7 +144,12 @@ export class AtomsController {
@Param("teamId", ParseIntPipe) teamId: number,
@Body() body: UpdateEventTypeReturn
): Promise<ApiResponse<UpdateEventTypeReturn>> {
const eventType = await this.eventTypesService.updateTeamEventType(eventTypeId, body, user, teamId);
const eventType = await this.eventTypesService.updateTeamEventType(
eventTypeId,
{ ...body, id: eventTypeId },
user,
teamId
);
return {
status: SUCCESS_STATUS,
data: eventType,
@@ -10,17 +10,11 @@ import { UserWithProfile } from "@/modules/users/users.repository";
import { Injectable, NotFoundException, ForbiddenException } from "@nestjs/common";
import {
updateEventType,
TUpdateEventTypeInputSchema,
systemBeforeFieldEmail,
getEventTypeById,
getEnabledAppsFromCredentials,
getAppFromSlug,
MembershipRole,
EventTypeMetaDataSchema,
getClientSecretFromPayment,
getBulkEventTypes,
bulkUpdateEventsToDefaultLocation,
enrichUserWithDelegationConferencingCredentialsWithoutOrgId,
} from "@calcom/platform-libraries";
import type {
App,
@@ -31,6 +25,17 @@ import type {
TDependencyData,
CredentialPayload,
} from "@calcom/platform-libraries";
import {
getBulkEventTypes,
getEventTypeById,
bulkUpdateEventsToDefaultLocation,
} from "@calcom/platform-libraries/event-types";
import {
updateEventType,
TUpdateEventTypeInputSchema,
systemBeforeFieldEmail,
EventTypeMetaDataSchema,
} from "@calcom/platform-libraries/event-types";
import { PrismaClient } from "@calcom/prisma";
type EnabledAppType = App & {
@@ -104,7 +109,7 @@ export class EventTypesAtomService {
}
const eventType = await updateEventType({
input: { id: eventTypeId, ...body, bookingFields },
input: { ...body, id: eventTypeId, bookingFields },
ctx: {
user: eventTypeUser,
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
@@ -117,7 +122,7 @@ export class EventTypesAtomService {
throw new NotFoundException(`Event type with id ${eventTypeId} not found`);
}
return eventType.eventType;
return eventType;
}
async updateEventType(eventTypeId: number, body: TUpdateEventTypeInputSchema, user: UserWithProfile) {
@@ -134,7 +139,7 @@ export class EventTypesAtomService {
}
const eventType = await updateEventType({
input: { id: eventTypeId, ...body, bookingFields },
input: { ...body, id: eventTypeId, bookingFields },
ctx: {
user: eventTypeUser,
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
@@ -147,10 +152,15 @@ export class EventTypesAtomService {
throw new NotFoundException(`Event type with id ${eventTypeId} not found`);
}
return eventType.eventType;
return eventType;
}
async checkCanUpdateTeamEventType(userId: number, eventTypeId: number, teamId: number, scheduleId: number) {
async checkCanUpdateTeamEventType(
userId: number,
eventTypeId: number,
teamId: number,
scheduleId: number | null | undefined
) {
await this.checkTeamOwnsEventType(userId, eventTypeId, teamId);
await this.teamEventTypeService.validateEventTypeExists(teamId, eventTypeId);
await this.eventTypeService.checkUserOwnsSchedule(userId, scheduleId);
@@ -179,11 +189,11 @@ export class EventTypesAtomService {
}
}
async getEventTypesAppIntegration(slug: string, userId: number, userName: string | null, teamId?: number) {
let credentials = await this.credentialsRepository.getAllUserCredentialsById(userId);
async getEventTypesAppIntegration(slug: string, user: UserWithProfile, teamId?: number) {
let credentials = await this.credentialsRepository.getAllUserCredentialsById(user.id);
let userTeams: TeamQuery[] = [];
if (teamId) {
const teamsQuery = await this.atomsRepository.getUserTeams(userId);
const teamsQuery = await this.atomsRepository.getUserTeams(user.id);
// If a team is a part of an org then include those apps
// Don't want to iterate over these parent teams
const filteredTeams: TeamQuery[] = [];
@@ -211,8 +221,17 @@ export class EventTypesAtomService {
credentials = credentials.concat(teamAppCredentials);
}
}
//TODO: enrich credentials for DelegationCredential
const enabledApps = await getEnabledAppsFromCredentials(credentials, {
// We only add delegationCredentials if the request for location options is for a user because DelegationCredential Credential is applicable to Users only.
const { credentials: allCredentials } = await enrichUserWithDelegationConferencingCredentialsWithoutOrgId(
{
user: {
...user,
credentials,
},
}
);
credentials = allCredentials;
const enabledApps = await getEnabledAppsFromCredentials(allCredentials, {
where: { slug },
});
const apps = await Promise.all(
@@ -265,7 +284,7 @@ export class EventTypesAtomService {
});
}
const credentialOwner: CredentialOwner = {
name: userName,
name: user.name,
teamId,
};
return {
@@ -4,7 +4,7 @@ import { TeamsRepository } from "@/modules/teams/teams/teams.repository";
import { UsersRepository } from "@/modules/users/users.repository";
import { BadRequestException, Injectable, NotFoundException } from "@nestjs/common";
import { transformTeamLocationsApiToInternal } from "@calcom/platform-libraries";
import { transformTeamLocationsApiToInternal } from "@calcom/platform-libraries/event-types";
import {
CreateTeamEventTypeInput_2024_06_14,
UpdateTeamEventTypeInput_2024_06_14,
@@ -12,6 +12,13 @@ import {
} from "@calcom/platform-types";
import { SchedulingType } from "@calcom/prisma/client";
export type TransformedCreateTeamEventTypeInput = Awaited<
ReturnType<InstanceType<typeof InputOrganizationsEventTypesService>["transformInputCreateTeamEventType"]>
>;
export type TransformedUpdateTeamEventTypeInput = Awaited<
ReturnType<InstanceType<typeof InputOrganizationsEventTypesService>["transformInputUpdateTeamEventType"]>
>;
@Injectable()
export class InputOrganizationsEventTypesService {
constructor(
@@ -1,5 +1,9 @@
import { MembershipsRepository } from "@/modules/memberships/memberships.repository";
import { OrganizationsEventTypesRepository } from "@/modules/organizations/event-types/organizations-event-types.repository";
import {
TransformedCreateTeamEventTypeInput,
TransformedUpdateTeamEventTypeInput,
} from "@/modules/organizations/event-types/services/input.service";
import { DatabaseTeamEventType } from "@/modules/organizations/event-types/services/output.service";
import { PrismaWriteService } from "@/modules/prisma/prisma-write.service";
import { TeamsEventTypesService } from "@/modules/teams/event-types/services/teams-event-types.service";
@@ -7,8 +11,8 @@ import { UsersService } from "@/modules/users/services/users.service";
import { UserWithProfile } from "@/modules/users/users.repository";
import { Injectable, Logger } from "@nestjs/common";
import { createEventType } from "@calcom/platform-libraries";
import { InputTeamEventTransformed_2024_06_14 } from "@calcom/platform-types";
// eslint-disable-next-line @typescript-eslint/no-var-requires
import { createEventType } from "@calcom/platform-libraries/event-types";
@Injectable()
export class OrganizationsEventTypesService {
@@ -26,14 +30,16 @@ export class OrganizationsEventTypesService {
user: UserWithProfile,
teamId: number,
orgId: number,
body: InputTeamEventTransformed_2024_06_14
body: TransformedCreateTeamEventTypeInput
): Promise<DatabaseTeamEventType | DatabaseTeamEventType[]> {
const eventTypeUser = await this.getUserToCreateTeamEvent(user, orgId);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const { hosts, children, destinationCalendar, ...rest } = body;
const { eventType: eventTypeCreated } = await createEventType({
input: { teamId: teamId, ...rest },
input: {
teamId: teamId,
...rest,
},
ctx: {
user: eventTypeUser,
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
@@ -57,6 +63,7 @@ export class OrganizationsEventTypesService {
organization: { isOrgAdmin },
profile: { id: profileId || null },
metadata: user.metadata,
email: user.email,
};
}
@@ -87,7 +94,7 @@ export class OrganizationsEventTypesService {
async updateTeamEventType(
eventTypeId: number,
teamId: number,
body: InputTeamEventTransformed_2024_06_14,
body: TransformedUpdateTeamEventTypeInput,
user: UserWithProfile
): Promise<DatabaseTeamEventType | DatabaseTeamEventType[]> {
return this.teamsEventTypesService.updateTeamEventType(eventTypeId, teamId, body, user);
@@ -37,7 +37,7 @@ import { ApiOperation, ApiTags as DocsTags } from "@nestjs/swagger";
import { plainToClass } from "class-transformer";
import { SUCCESS_STATUS } from "@calcom/platform-constants";
import { updateNewTeamMemberEventTypes } from "@calcom/platform-libraries";
import { updateNewTeamMemberEventTypes } from "@calcom/platform-libraries/event-types";
import { SkipTakePagination } from "@calcom/platform-types";
@Controller({
@@ -62,6 +62,15 @@ export class SelectedCalendarsRepository {
});
}
getUserEventTypeSelectedCalendar(userId: number) {
return this.dbRead.prisma.selectedCalendar.findMany({
where: {
userId,
eventTypeId: { not: null },
},
});
}
async addUserSelectedCalendar(
userId: number,
integration: string,
@@ -1,5 +1,9 @@
import { EventTypesRepository_2024_06_14 } from "@/ee/event-types/event-types_2024_06_14/event-types.repository";
import { EventTypesService_2024_06_14 } from "@/ee/event-types/event-types_2024_06_14/services/event-types.service";
import {
TransformedCreateTeamEventTypeInput,
TransformedUpdateTeamEventTypeInput,
} from "@/modules/organizations/event-types/services/input.service";
import { DatabaseTeamEventType } from "@/modules/organizations/event-types/services/output.service";
import { PrismaWriteService } from "@/modules/prisma/prisma-write.service";
import { TeamsEventTypesRepository } from "@/modules/teams/event-types/teams-event-types.repository";
@@ -7,8 +11,7 @@ import { UsersService } from "@/modules/users/services/users.service";
import { UserWithProfile } from "@/modules/users/users.repository";
import { Injectable, NotFoundException, Logger } from "@nestjs/common";
import { createEventType, updateEventType } from "@calcom/platform-libraries";
import { InputTeamEventTransformed_2024_06_14 } from "@calcom/platform-types";
import { createEventType, updateEventType } from "@calcom/platform-libraries/event-types";
@Injectable()
export class TeamsEventTypesService {
@@ -25,7 +28,7 @@ export class TeamsEventTypesService {
async createTeamEventType(
user: UserWithProfile,
teamId: number,
body: InputTeamEventTransformed_2024_06_14
body: TransformedCreateTeamEventTypeInput
): Promise<DatabaseTeamEventType | DatabaseTeamEventType[]> {
const eventTypeUser = await this.getUserToCreateTeamEvent(user);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
@@ -62,6 +65,7 @@ export class TeamsEventTypesService {
organization: { id: null, isOrgAdmin: false, metadata: {}, requestedSlug: null },
profile: { id: profileId || null },
metadata: user.metadata,
email: user.email,
};
}
@@ -100,14 +104,16 @@ export class TeamsEventTypesService {
async updateTeamEventType(
eventTypeId: number,
teamId: number,
body: InputTeamEventTransformed_2024_06_14,
body: TransformedUpdateTeamEventTypeInput,
user: UserWithProfile
): Promise<DatabaseTeamEventType | DatabaseTeamEventType[]> {
await this.validateEventTypeExists(teamId, eventTypeId);
const eventTypeUser = await this.eventTypesService.getUserToUpdateEvent(user);
await updateEventType({
input: { id: eventTypeId, ...body },
input: {
id: eventTypeId,
...body,
},
ctx: {
user: eventTypeUser,
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
@@ -31,7 +31,7 @@ import { ApiOperation, ApiTags as DocsTags } from "@nestjs/swagger";
import { plainToClass } from "class-transformer";
import { SUCCESS_STATUS } from "@calcom/platform-constants";
import { updateNewTeamMemberEventTypes } from "@calcom/platform-libraries";
import { updateNewTeamMemberEventTypes } from "@calcom/platform-libraries/event-types";
import { SkipTakePagination } from "@calcom/platform-types";
@Controller({
+1 -1
View File
@@ -15999,7 +15999,7 @@
"type": "object",
"properties": {
"id": {
"type": "number"
"type": "object"
},
"integration": {
"type": "string"
+1
View File
@@ -19,6 +19,7 @@
"@calcom/platform-types": ["../../../packages/platform/types/index.ts"],
"@calcom/platform-utils": ["../../../packages/platform/utils/index.ts"],
"@calcom/platform-enums": ["../../../packages/platform/enums/index.ts"],
"@calcom/platform-libraries/event-types": ["../../../packages/platform/libraries/event-types.ts"],
"@calcom/platform-libraries/slots": ["../../../packages/platform/libraries/slots.ts"]
},
"incremental": true,
+2 -2
View File
@@ -14408,7 +14408,7 @@
"type": "object",
"properties": {
"id": {
"type": "number"
"type": "object"
},
"integration": {
"type": "string"
@@ -16511,7 +16511,7 @@
"externalId": {
"type": "string",
"example": "https://caldav.icloud.com/26962146906/calendars/1644422A-1945-4438-BBC0-4F0Q23A57R7S/",
"description": "Unique identifier used to represent the specfic calendar, as returned by the /calendars endpoint"
"description": "Unique identifier used to represent the specific calendar, as returned by the /calendars endpoint"
},
"delegationCredentialId": {
"type": "string"
@@ -6,10 +6,8 @@ import type {
export function transformSeatsApiToInternal(
inputSeats: CreateEventTypeInput_2024_06_14["seats"]
): SeatOptionsTransformedSchema | SeatOptionsDisabledSchema | undefined {
if (!inputSeats) return undefined;
if (inputSeats.disabled)
): SeatOptionsTransformedSchema | SeatOptionsDisabledSchema {
if (!inputSeats || inputSeats.disabled)
return {
seatsPerTimeSlot: null,
};
@@ -1,20 +1,21 @@
import type {
SeatOptionsTransformedSchema,
SeatOptionsDisabledSchema,
CreateEventTypeInput_2024_06_14,
Seats_2024_06_14,
Disabled_2024_06_14,
} from "@calcom/platform-types";
export function transformSeatsInternalToApi(
transformedSeats: SeatOptionsTransformedSchema | SeatOptionsDisabledSchema
): CreateEventTypeInput_2024_06_14["seats"] {
): Seats_2024_06_14 | Disabled_2024_06_14 {
if (transformedSeats.seatsPerTimeSlot == null) {
return {
disabled: true,
};
} satisfies Disabled_2024_06_14;
}
return {
seatsPerTimeSlot: transformedSeats.seatsPerTimeSlot,
showAttendeeInfo: transformedSeats.seatsShowAttendees,
showAvailabilityCount: transformedSeats.seatsShowAvailabilityCount,
};
} satisfies Seats_2024_06_14;
}
@@ -0,0 +1,72 @@
import { getPublicEvent } from "@calcom/features/eventtypes/lib/getPublicEvent";
import getBulkEventTypes from "@calcom/lib/event-types/getBulkEventTypes";
export { createHandler as createEventType } from "@calcom/trpc/server/routers/viewer/eventTypes/create.handler";
export { updateHandler as updateEventType } from "@calcom/trpc/server/routers/viewer/eventTypes/update.handler";
export type { TUpdateInputSchema as TUpdateEventTypeInputSchema } from "@calcom/trpc/server/routers/viewer/eventTypes/update.schema";
export type { EventTypesPublic } from "@calcom/lib/event-types/getEventTypesPublic";
export { getEventTypesPublic } from "@calcom/lib/event-types/getEventTypesPublic";
export { parseEventTypeColor } from "@calcom/lib/isEventTypeColor";
export {
// note(Lauris): Api to internal
transformBookingFieldsApiToInternal,
transformLocationsApiToInternal,
transformTeamLocationsApiToInternal,
transformIntervalLimitsApiToInternal,
transformFutureBookingLimitsApiToInternal,
transformRecurrenceApiToInternal,
transformBookerLayoutsApiToInternal,
transformConfirmationPolicyApiToInternal,
transformEventColorsApiToInternal,
transformSeatsApiToInternal,
// note(Lauris): Internal to api
transformBookingFieldsInternalToApi,
transformLocationsInternalToApi,
transformIntervalLimitsInternalToApi,
transformFutureBookingLimitsInternalToApi,
transformRecurrenceInternalToApi,
transformBookerLayoutsInternalToApi,
transformRequiresConfirmationInternalToApi,
transformEventTypeColorsInternalToApi,
transformSeatsInternalToApi,
// note(Lauris): schemas
InternalLocationsSchema,
InternalLocationSchema,
BookingFieldsSchema,
BookingFieldSchema,
// note(Lauris): constants
systemBeforeFieldName,
systemBeforeFieldEmail,
systemBeforeFieldLocation,
systemAfterFieldRescheduleReason,
systemAfterFieldTitle,
systemAfterFieldNotes,
systemAfterFieldGuests,
} from "@calcom/lib/event-types/transformers";
export type {
SystemField,
CustomField,
NameSystemField,
EmailSystemField,
InternalLocation,
} from "@calcom/lib/event-types/transformers";
export { EventTypeMetaDataSchema } from "@calcom/prisma/zod-utils";
export { validateCustomEventName } from "@calcom/lib/event";
export { getEventTypeById } from "@calcom/lib/event-types/getEventTypeById";
export { getEventTypesByViewer } from "@calcom/lib/event-types/getEventTypesByViewer";
export type { EventType } from "@calcom/lib/event-types/getEventTypeById";
export type { EventTypesByViewer } from "@calcom/lib/event-types/getEventTypesByViewer";
export type { UpdateEventTypeReturn } from "@calcom/trpc/server/routers/viewer/eventTypes/update.handler";
export { eventTypeBookingFields, eventTypeLocations } from "@calcom/prisma/zod-utils";
export { updateNewTeamMemberEventTypes } from "@calcom/lib/server/queries";
export { getBulkEventTypes };
export type PublicEventType = Awaited<ReturnType<typeof getPublicEvent>>;
export { bulkUpdateEventsToDefaultLocation } from "@calcom/lib/bulkUpdateEventsToDefaultLocation";
export { getPublicEvent };
+2 -69
View File
@@ -24,7 +24,6 @@ import handleCancelBooking from "@calcom/features/bookings/lib/handleCancelBooki
import * as newBookingMethods from "@calcom/features/bookings/lib/handleNewBooking";
import handleDeleteCredential from "@calcom/features/credentials/handleDeleteCredential";
import { getClientSecretFromPayment } from "@calcom/features/ee/payments/pages/getClientSecretFromPayment";
import { getPublicEvent } from "@calcom/features/eventtypes/lib/getPublicEvent";
import { handleCreatePhoneCall } from "@calcom/features/handleCreatePhoneCall";
import handleMarkNoShow from "@calcom/features/handleMarkNoShow";
import * as instantMeetingMethods from "@calcom/features/instant-meeting/handleInstantMeeting";
@@ -45,7 +44,6 @@ import {
getAllDelegationCredentialsForUserByAppType,
checkIfSuccessfullyConfiguredInWorkspace,
} from "@calcom/lib/delegationCredential/server";
import getBulkEventTypes from "@calcom/lib/event-types/getBulkEventTypes";
import { getRoutedUrl } from "@calcom/lib/server/getRoutedUrl";
import { getTeamMemberEmailForResponseOrContactUsingUrlQuery } from "@calcom/lib/server/getTeamMemberEmailFromCrm";
import { getTranslation } from "@calcom/lib/server/i18n";
@@ -90,21 +88,8 @@ export type UpdateScheduleOutputType = Awaited<
>
>;
export { getEventTypeById } from "@calcom/lib/event-types/getEventTypeById";
export { getEventTypesByViewer } from "@calcom/lib/event-types/getEventTypesByViewer";
export { getEventTypesPublic } from "@calcom/lib/event-types/getEventTypesPublic";
export { createHandler as createEventType } from "@calcom/trpc/server/routers/viewer/eventTypes/create.handler";
export { updateHandler as updateEventType } from "@calcom/trpc/server/routers/viewer/eventTypes/update.handler";
export { SchedulingType, PeriodType } from "@calcom/prisma/enums";
export type { EventType } from "@calcom/lib/event-types/getEventTypeById";
export type { EventTypesByViewer } from "@calcom/lib/event-types/getEventTypesByViewer";
export type { EventTypesPublic } from "@calcom/lib/event-types/getEventTypesPublic";
export type { UpdateEventTypeReturn } from "@calcom/trpc/server/routers/viewer/eventTypes/update.handler";
export type PublicEventType = Awaited<ReturnType<typeof getPublicEvent>>;
export { getPublicEvent };
export { getUsernameList } from "@calcom/lib/defaultEvents";
const handleNewBooking = newBookingMethods.default;
@@ -121,7 +106,7 @@ export { getConnectedDestinationCalendarsAndEnsureDefaultsInDb } from "@calcom/l
export type { ConnectedDestinationCalendars } from "@calcom/lib/getConnectedDestinationCalendars";
export { getConnectedApps } from "@calcom/lib/getConnectedApps";
export { bulkUpdateEventsToDefaultLocation } from "@calcom/lib/bulkUpdateEventsToDefaultLocation";
export type { ConnectedApps } from "@calcom/lib/getConnectedApps";
export { getBusyCalendarTimes } from "@calcom/lib/CalendarManager";
@@ -148,63 +133,14 @@ export type { CityTimezones } from "@calcom/features/cityTimezones/cityTimezones
export { TRPCError } from "@trpc/server";
export type { TUpdateInputSchema } from "@calcom/trpc/server/routers/viewer/availability/schedule/update.schema";
export type { TUpdateInputSchema as TUpdateEventTypeInputSchema } from "@calcom/trpc/server/routers/viewer/eventTypes/update.schema";
export { createNewUsersConnectToOrgIfExists, sendSignupToOrganizationEmail };
export { getAllUserBookings };
export { getBookingInfo };
export { handleCancelBooking };
export { eventTypeBookingFields, eventTypeLocations } from "@calcom/prisma/zod-utils";
export { userMetadata, bookingMetadataSchema } from "@calcom/prisma/zod-utils";
export { EventTypeMetaDataSchema, userMetadata, bookingMetadataSchema } from "@calcom/prisma/zod-utils";
export {
// note(Lauris): Api to internal
transformBookingFieldsApiToInternal,
transformLocationsApiToInternal,
transformTeamLocationsApiToInternal,
transformIntervalLimitsApiToInternal,
transformFutureBookingLimitsApiToInternal,
transformRecurrenceApiToInternal,
transformBookerLayoutsApiToInternal,
transformConfirmationPolicyApiToInternal,
transformEventColorsApiToInternal,
transformSeatsApiToInternal,
// note(Lauris): Internal to api
transformBookingFieldsInternalToApi,
transformLocationsInternalToApi,
transformIntervalLimitsInternalToApi,
transformFutureBookingLimitsInternalToApi,
transformRecurrenceInternalToApi,
transformBookerLayoutsInternalToApi,
transformRequiresConfirmationInternalToApi,
transformEventTypeColorsInternalToApi,
transformSeatsInternalToApi,
// note(Lauris): schemas
InternalLocationsSchema,
InternalLocationSchema,
BookingFieldsSchema,
BookingFieldSchema,
// note(Lauris): constants
systemBeforeFieldName,
systemBeforeFieldEmail,
systemBeforeFieldLocation,
systemAfterFieldRescheduleReason,
systemAfterFieldTitle,
systemAfterFieldNotes,
systemAfterFieldGuests,
} from "@calcom/lib/event-types/transformers";
export type {
SystemField,
CustomField,
NameSystemField,
EmailSystemField,
InternalLocation,
} from "@calcom/lib/event-types/transformers";
export { parseEventTypeColor } from "@calcom/lib";
export { parseBookingLimit } from "@calcom/lib/intervalLimits/isBookingLimits";
export { parseRecurringEvent } from "@calcom/lib/isRecurringEvent";
@@ -217,8 +153,6 @@ export { getCalendar };
export { getTranslation };
export { updateNewTeamMemberEventTypes } from "@calcom/lib/server/queries";
export { roundRobinReassignment } from "@calcom/features/ee/round-robin/roundRobinReassignment";
export { roundRobinManualReassignment } from "@calcom/features/ee/round-robin/roundRobinManualReassignment";
@@ -266,7 +200,6 @@ export { OrganizerRequestEmail };
export { AttendeeRequestEmail };
export { handleDeleteCredential };
export { getBulkEventTypes };
export { getBookingFieldsWithSystemFields };
+8
View File
@@ -29,6 +29,11 @@
"vite-plugin-environment": "^1.1.3"
},
"exports": {
"./event-types": {
"import": "./dist/event-types.js",
"require": "./dist/event-types.cjs",
"types": "./dist/event-types.d.ts"
},
".": {
"import": "./dist/index.js",
"require": "./dist/index.cjs",
@@ -42,6 +47,9 @@
},
"typesVersions": {
"*": {
"event-types": [
"dist/event-types.d.ts"
],
"slots": [
"dist/slots.d.ts"
]
@@ -18,6 +18,7 @@ export default defineConfig({
lib: {
entry: {
index: resolve(__dirname, "./index.ts"),
"event-types": resolve(__dirname, "./event-types.ts"),
slots: resolve(__dirname, "./slots.ts"),
},
name: "calcom-lib",
@@ -33,6 +33,7 @@ import { BookerLayouts_2024_06_14 } from "../inputs/booker-layouts.input";
import type { BookingLimitsCount_2024_06_14 } from "../inputs/booking-limits-count.input";
import type { ConfirmationPolicy_2024_06_14 } from "../inputs/confirmation-policy.input";
import { DestinationCalendar_2024_06_14 } from "../inputs/destination-calendar.input";
import type { Disabled_2024_06_14 } from "../inputs/disabled.input";
import {
EmailDefaultFieldOutput_2024_06_14,
NameDefaultFieldOutput_2024_06_14,
@@ -401,7 +402,7 @@ class BaseEventTypeOutput_2024_06_14 {
@IsOptional()
@Type(() => Seats_2024_06_14)
@ApiPropertyOptional({ type: Seats_2024_06_14 })
seats?: Seats_2024_06_14;
seats?: Seats_2024_06_14 | Disabled_2024_06_14;
@IsOptional()
@IsInt()