diff --git a/apps/api/v2/src/ee/bookings/2024-08-13/services/bookings.service.ts b/apps/api/v2/src/ee/bookings/2024-08-13/services/bookings.service.ts index 072ac65ca4..acf2487c30 100644 --- a/apps/api/v2/src/ee/bookings/2024-08-13/services/bookings.service.ts +++ b/apps/api/v2/src/ee/bookings/2024-08-13/services/bookings.service.ts @@ -1,3 +1,45 @@ +import { + confirmBookingHandler, + getAllUserBookings, + getCalendarLinks, + getTranslation, + handleCancelBooking, + handleMarkNoShow, + roundRobinManualReassignment, + roundRobinReassignment, +} from "@calcom/platform-libraries"; +import { makeUserActor, PrismaOrgMembershipRepository } from "@calcom/platform-libraries/bookings"; +import type { RescheduleSeatedBookingInput_2024_08_13 } from "@calcom/platform-types"; +import { + BookingOutput_2024_08_13, + CancelBookingInput, + CreateBookingInput, + CreateBookingInput_2024_08_13, + CreateInstantBookingInput_2024_08_13, + CreateRecurringBookingInput_2024_08_13, + GetBookingsInput_2024_08_13, + GetRecurringSeatedBookingOutput_2024_08_13, + GetSeatedBookingOutput_2024_08_13, + MarkAbsentBookingInput_2024_08_13, + ReassignToUserBookingInput_2024_08_13, + RecurringBookingOutput_2024_08_13, + RescheduleBookingInput, +} from "@calcom/platform-types"; +import type { PrismaClient } from "@calcom/prisma"; +import type { EventType, Team, User } from "@calcom/prisma/client"; +import { + BadRequestException, + ConflictException, + ForbiddenException, + Injectable, + Logger, + NotFoundException, + UnauthorizedException, + UnprocessableEntityException, +} from "@nestjs/common"; +import { Request } from "express"; +import { DateTime } from "luxon"; +import { z } from "zod"; import { CalendarLink } from "@/ee/bookings/2024-08-13/outputs/calendar-links.output"; import { BookingsRepository_2024_08_13 } from "@/ee/bookings/2024-08-13/repositories/bookings.repository"; import { ErrorsBookingsService_2024_08_13 } from "@/ee/bookings/2024-08-13/services/errors.service"; @@ -24,51 +66,8 @@ import { TeamsEventTypesRepository } from "@/modules/teams/event-types/teams-eve import { TeamsRepository } from "@/modules/teams/teams/teams.repository"; import { UsersService } from "@/modules/users/services/users.service"; import { UsersRepository } from "@/modules/users/users.repository"; -import { - ConflictException, - ForbiddenException, - Injectable, - Logger, - NotFoundException, - UnauthorizedException, - UnprocessableEntityException, -} from "@nestjs/common"; -import { BadRequestException } from "@nestjs/common"; -import { Request } from "express"; -import { DateTime } from "luxon"; -import { z } from "zod"; -export const BOOKING_REASSIGN_PERMISSION_ERROR = "You do not have permission to reassign this booking"; -import { - getTranslation, - getAllUserBookings, - handleCancelBooking, - roundRobinReassignment, - roundRobinManualReassignment, - handleMarkNoShow, - confirmBookingHandler, - getCalendarLinks, -} from "@calcom/platform-libraries"; -import { PrismaOrgMembershipRepository } from "@calcom/platform-libraries/bookings"; -import { - CreateBookingInput_2024_08_13, - CreateBookingInput, - CreateRecurringBookingInput_2024_08_13, - GetBookingsInput_2024_08_13, - CreateInstantBookingInput_2024_08_13, - MarkAbsentBookingInput_2024_08_13, - ReassignToUserBookingInput_2024_08_13, - BookingOutput_2024_08_13, - RecurringBookingOutput_2024_08_13, - GetSeatedBookingOutput_2024_08_13, - GetRecurringSeatedBookingOutput_2024_08_13, - RescheduleBookingInput, - CancelBookingInput, -} from "@calcom/platform-types"; -import type { RescheduleSeatedBookingInput_2024_08_13 } from "@calcom/platform-types"; -import type { PrismaClient } from "@calcom/prisma"; -import type { EventType, User, Team } from "@calcom/prisma/client"; -import { makeUserActor } from "@calcom/platform-libraries/bookings"; +export const BOOKING_REASSIGN_PERMISSION_ERROR = "You do not have permission to reassign this booking"; type CreatedBooking = { hosts: { id: number }[]; @@ -115,7 +114,7 @@ export class BookingsService_2024_08_13 { private readonly recurringBookingService: RecurringBookingService, private readonly instantBookingCreateService: InstantBookingCreateService, private readonly eventTypeAccessService: EventTypeAccessService - ) { } + ) {} async createBooking(request: Request, body: CreateBookingInput, authUser: AuthOptionalUser) { let bookingTeamEventType = false; @@ -321,7 +320,8 @@ export class BookingsService_2024_08_13 { const allowedOptionValues = eventTypeBookingField.options.map((opt) => opt.value); if (!this.isValidSingleOptionValue(submittedValue, allowedOptionValues)) { throw new BadRequestException( - `Invalid option '${submittedValue}' for booking field '${eventTypeBookingField.name + `Invalid option '${submittedValue}' for booking field '${ + eventTypeBookingField.name }'. Allowed options are: ${allowedOptionValues.join(", ")}.` ); } @@ -335,7 +335,8 @@ export class BookingsService_2024_08_13 { const allowedOptionValues = eventTypeBookingField.options.map((opt) => opt.value); if (!this.areValidMultipleOptionValues(submittedValues, allowedOptionValues)) { throw new BadRequestException( - `One or more invalid options for booking field '${eventTypeBookingField.name + `One or more invalid options for booking field '${ + eventTypeBookingField.name }'. Allowed options are: ${allowedOptionValues.join(", ")}.` ); } @@ -349,7 +350,8 @@ export class BookingsService_2024_08_13 { const allowedOptionValues = eventTypeBookingField.options.map((opt) => opt.value); if (!this.areValidMultipleOptionValues(submittedValues, allowedOptionValues)) { throw new BadRequestException( - `One or more invalid options for booking field '${eventTypeBookingField.name + `One or more invalid options for booking field '${ + eventTypeBookingField.name }'. Allowed options are: ${allowedOptionValues.join(", ")}.` ); } @@ -364,7 +366,8 @@ export class BookingsService_2024_08_13 { const allowedOptionValues = eventTypeBookingField.options.map((opt) => opt.value); if (!this.isValidSingleOptionValue(submittedValue, allowedOptionValues)) { throw new BadRequestException( - `Invalid option '${submittedValue}' for booking field '${eventTypeBookingField.name + `Invalid option '${submittedValue}' for booking field '${ + eventTypeBookingField.name }'. Allowed options are: ${allowedOptionValues.join(", ")}.` ); } @@ -1036,6 +1039,8 @@ export class BookingsService_2024_08_13 { emailsEnabled, platformClientParams, reassignedById: reassignedByUser.id, + actionSource: "API_V2", + reassignedByUuid: reassignedByUser.uuid, }); } catch (error) { if (error instanceof Error) { @@ -1103,6 +1108,8 @@ export class BookingsService_2024_08_13 { reassignedById: reassignedByUser.id, emailsEnabled, platformClientParams, + actionSource: "API_V2", + reassignedByUuid: reassignedByUser.uuid, }); return this.outputService.getOutputReassignedBooking(reassigned); @@ -1216,4 +1223,4 @@ export class BookingsService_2024_08_13 { t: await getTranslation("en", "common"), }); } -} \ No newline at end of file +} diff --git a/apps/web/public/static/locales/en/common.json b/apps/web/public/static/locales/en/common.json index 511447e311..17ebb8f3ee 100644 --- a/apps/web/public/static/locales/en/common.json +++ b/apps/web/public/static/locales/en/common.json @@ -4389,6 +4389,7 @@ "seat_booked": "Seat booked", "seat_rescheduled": "Seat rescheduled {{oldDate}} -> <0>{{newDate}}", "assignment_type": "Assignment", + "previous_assignee": "Previous assignee", "assignment_type_manual": "Manual", "assignment_type_round_robin": "Round robin", "actor_impersonated_by": "Impersonator", diff --git a/packages/features/booking-audit/client/components/BookingHistory.tsx b/packages/features/booking-audit/client/components/BookingHistory.tsx index 1ba2a0677e..bc87c0c695 100644 --- a/packages/features/booking-audit/client/components/BookingHistory.tsx +++ b/packages/features/booking-audit/client/components/BookingHistory.tsx @@ -1,17 +1,17 @@ "use client"; -import Link from "next/link"; -import { useState } from "react"; -import { useLocale } from "@calcom/lib/hooks/useLocale"; import dayjs from "@calcom/dayjs"; +import type { AuditActorType } from "@calcom/features/booking-audit/lib/repository/IAuditActorRepository"; +import ServerTrans from "@calcom/lib/components/ServerTrans"; +import { useLocale } from "@calcom/lib/hooks/useLocale"; import { trpc } from "@calcom/trpc/react"; +import { Avatar } from "@calcom/ui/components/avatar"; import { Button } from "@calcom/ui/components/button"; +import { FilterSearchField, Select } from "@calcom/ui/components/form"; import { Icon, type IconName } from "@calcom/ui/components/icon"; import { SkeletonText } from "@calcom/ui/components/skeleton"; -import { FilterSearchField, Select } from "@calcom/ui/components/form"; -import { Avatar } from "@calcom/ui/components/avatar"; -import ServerTrans from "@calcom/lib/components/ServerTrans"; -import type { AuditActorType } from "@calcom/features/booking-audit/lib/repository/IAuditActorRepository"; +import Link from "next/link"; +import { useState } from "react"; interface BookingHistoryProps { bookingUid: string; @@ -108,7 +108,11 @@ function BookingLogsFilters({