diff --git a/apps/web/app/(use-page-wrapper)/auth/platform/authorize/page.tsx b/apps/web/app/(use-page-wrapper)/auth/platform/authorize/page.tsx deleted file mode 100644 index 695b10f569f579..00000000000000 --- a/apps/web/app/(use-page-wrapper)/auth/platform/authorize/page.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import { _generateMetadata } from "app/_utils"; - -import Page from "~/auth/platform/authorize-view"; - -export const generateMetadata = async () => { - return await _generateMetadata( - (t) => t("authorize"), - () => "", - undefined, - undefined, - "/auth/platform/authorize" - ); -}; - -const ServerPage = async () => { - return ; -}; - -export default ServerPage; diff --git a/apps/web/app/notFoundClient.tsx b/apps/web/app/notFoundClient.tsx index 2b9b2702c38df0..1229f541705a76 100644 --- a/apps/web/app/notFoundClient.tsx +++ b/apps/web/app/notFoundClient.tsx @@ -27,7 +27,6 @@ export function NotFound({ host }: { host: string }) { const { username, pageType, url } = getPageInfo(pathname); const isBookingSuccessPage = pathname?.startsWith("/booking"); const isSubpage = pathname?.includes("/", 2) || isBookingSuccessPage; - const isInsights = pathname?.startsWith("/insights"); useLayoutEffect(() => { if (typeof window !== "undefined") { @@ -50,33 +49,6 @@ export function NotFound({ host }: { host: string }) { }, ]; - /** - * If we're on 404 and the route is insights it means it is disabled - * TODO: Abstract this for all disabled features - **/ - if (isInsights) { - return ( -
-
-
-

{t("error_404")}

-

- {t("feature_currently_disabled") ?? "Feature is currently disabled"} -

-
-
-
- - {t("or_go_back_home")} - - -
-
-
-
- ); - } - return (
diff --git a/apps/web/modules/auth/platform/authorize-view.tsx b/apps/web/modules/auth/platform/authorize-view.tsx deleted file mode 100644 index 9e6ca0b1fdff56..00000000000000 --- a/apps/web/modules/auth/platform/authorize-view.tsx +++ /dev/null @@ -1,126 +0,0 @@ -"use client"; - -import { useRouter } from "next/navigation"; - -import { APP_NAME } from "@calcom/lib/constants"; -import { useCompatSearchParams } from "@calcom/lib/hooks/useCompatSearchParams"; -import { useLocale } from "@calcom/lib/hooks/useLocale"; -import { PERMISSIONS_GROUPED_MAP } from "@calcom/platform-constants/permissions"; -import { Avatar } from "@calcom/ui/components/avatar"; -import { Button } from "@calcom/ui/components/button"; -import { InfoIcon, PlusIcon } from "@coss/ui/icons"; - -import { hasPermission } from "../../../../../packages/platform/utils/permissions"; - -export default function Authorize() { - const { t } = useLocale(); - const router = useRouter(); - - const searchParams = useCompatSearchParams(); - const queryString = searchParams?.toString(); - - // const { isLoading, error, data: client } = useOAuthClient(queryString); - - const client: { - name: string; - logo?: string; - redirect_uris: string[]; - permissions: number; - } = { - name: "Acme.com", - redirect_uris: ["", ""], - permissions: 7, - }; - - const permissions = Object.values(PERMISSIONS_GROUPED_MAP).map((value) => { - let permissionsMessage = ""; - const hasReadPermission = hasPermission(client.permissions, value.read); - const hasWritePermission = hasPermission(client.permissions, value.write); - - if (hasReadPermission || hasWritePermission) { - permissionsMessage = hasReadPermission ? "Read" : "Write"; - } - - if (hasReadPermission && hasWritePermission) { - permissionsMessage = "Read, write"; - } - - return ( - !!permissionsMessage && ( -
  • - - {permissionsMessage} your {`${value.label}s`.toLocaleLowerCase()} -
  • - ) - ); - }); - - return ( -
    -
    -
    - {/* - below is where the client logo will be displayed - first we check if the client has a logo property and display logo if present - else we take logo from user profile pic - */} - {client.logo ? ( - } - className="items-center" - imageSrc={client.logo} - size="lg" - /> - ) : ( - } - className="items-center" - imageSrc="/cal-com-icon.svg" - size="lg" - /> - )} -
    -
    -
    - Logo -
    -
    -
    -
    -

    - {t("access_cal_account", { clientName: client.name, appName: APP_NAME })} -

    -
    - {t("allow_client_to", { clientName: client.name })} -
    -
      {permissions}
    -
    -
    - -
    -
    -
    - {t("allow_client_to_do", { clientName: client.name })} -
    -
    {t("oauth_access_information", { appName: APP_NAME })}
    {" "} -
    -
    -
    -
    - - -
    -
    -
    - ); -} diff --git a/apps/web/modules/shell/Shell.tsx b/apps/web/modules/shell/Shell.tsx index 9b8ed482b0361f..5aab0461dfa585 100644 --- a/apps/web/modules/shell/Shell.tsx +++ b/apps/web/modules/shell/Shell.tsx @@ -42,13 +42,13 @@ const Layout = (props: LayoutProps) => {
    - {banners && !props.isPlatformUser && } + {banners && }
    {props.SidebarContainer ? ( cloneElement(props.SidebarContainer, { bannersHeight }) ) : ( - + )}
    @@ -86,7 +86,6 @@ export type LayoutProps = { beforeCTAactions?: JSX.Element; afterHeading?: ReactNode; smallHeading?: boolean; - isPlatformUser?: boolean; disableSticky?: boolean; }; @@ -198,7 +197,6 @@ export function ShellMain(props: LayoutProps) { } function MainContainer({ - isPlatformUser, MobileNavigationContainer: MobileNavigationContainerProp = , TopNavContainer: TopNavContainerProp = , ...props diff --git a/apps/web/modules/shell/SideBar.tsx b/apps/web/modules/shell/SideBar.tsx index 0805998c3d36a9..9f06e73603b4de 100644 --- a/apps/web/modules/shell/SideBar.tsx +++ b/apps/web/modules/shell/SideBar.tsx @@ -12,7 +12,6 @@ import { SkeletonText } from "@calcom/ui/components/skeleton"; import { Tooltip } from "@calcom/ui/components/tooltip"; import { ArrowLeftIcon, ArrowRightIcon } from "@coss/ui/icons"; import Link from "next/link"; -import { usePathname } from "next/navigation"; import type { User as UserAuth } from "next-auth"; import { useSession } from "next-auth/react"; import { KBarTrigger } from "./Kbar"; @@ -23,16 +22,14 @@ import { UserDropdown } from "./user-dropdown/UserDropdown"; export type SideBarContainerProps = { bannersHeight: number; - isPlatformUser?: boolean; }; export type SideBarProps = { bannersHeight: number; user?: UserAuth | null; - isPlatformUser?: boolean; }; -export function SideBarContainer({ bannersHeight, isPlatformUser = false }: SideBarContainerProps) { +export function SideBarContainer({ bannersHeight }: SideBarContainerProps) { const { status, data } = useSession(); const isStandalone = useIsStandalone(); @@ -41,13 +38,11 @@ export function SideBarContainer({ bannersHeight, isPlatformUser = false }: Side // Though when logged out, app store pages would temporarily show SideBar until session status is confirmed. if (status !== "loading" && status !== "authenticated") return null; if (isStandalone) return null; - return ; + return ; } export function SideBar({ bannersHeight, user }: SideBarProps) { const { t, isLocaleReady } = useLocale(); - const pathname = usePathname(); - const isPlatformPages = pathname?.startsWith("/settings/platform"); const publicPageUrl = `${WEBAPP_URL}/${user?.orgAwareUsername}`; @@ -63,10 +58,10 @@ export function SideBar({ bannersHeight, user }: SideBarProps) { return (
    ); diff --git a/apps/web/modules/shell/user-dropdown/UserDropdown.test.tsx b/apps/web/modules/shell/user-dropdown/UserDropdown.test.tsx index b01c99f98f64dd..d66af69975af8d 100644 --- a/apps/web/modules/shell/user-dropdown/UserDropdown.test.tsx +++ b/apps/web/modules/shell/user-dropdown/UserDropdown.test.tsx @@ -6,10 +6,6 @@ vi.mock("next-auth/react", () => ({ signOut: vi.fn(), })); -vi.mock("next/navigation", () => ({ - usePathname: () => "/settings", -})); - vi.mock("@calcom/lib/hooks/useLocale", () => ({ useLocale: () => ({ t: (key: string) => key, @@ -29,12 +25,6 @@ vi.mock("@calcom/trpc/react/hooks/useMeQuery", () => ({ default: () => mockUseMeQuery(), })); -vi.mock("@calcom/web/components/settings/platform/hooks/useGetUserAttributes", () => ({ - useGetUserAttributes: () => ({ - isPlatformUser: false, - }), -})); - vi.mock("@calcom/web/modules/api-keys/support/lib/freshchat/FreshChatProvider", () => ({ default: ({ children }: { children: React.ReactNode }) =>
    {children}
    , })); diff --git a/apps/web/modules/shell/user-dropdown/UserDropdown.tsx b/apps/web/modules/shell/user-dropdown/UserDropdown.tsx index a29b219e377f4e..8ebfdd6f921cfa 100644 --- a/apps/web/modules/shell/user-dropdown/UserDropdown.tsx +++ b/apps/web/modules/shell/user-dropdown/UserDropdown.tsx @@ -14,7 +14,6 @@ import { MenuTrigger, } from "@coss/ui/components/menu"; import { - BlocksIcon, ChevronDownIcon, ChevronUpIcon, CircleHelpIcon, @@ -25,7 +24,6 @@ import { UserIcon, } from "@coss/ui/icons"; import Link from "next/link"; -import { usePathname } from "next/navigation"; import { signOut } from "next-auth/react"; import type { MouseEvent } from "react"; import { useEffect, useState } from "react"; @@ -51,11 +49,8 @@ interface UserDropdownProps { } export function UserDropdown({ small }: UserDropdownProps) { - const isPlatformUser = false; const { t } = useLocale(); const { data: user, isPending } = useMeQuery(); - const pathname = usePathname(); - const isPlatformPages = pathname?.startsWith("/settings/platform"); useEffect(() => { if (typeof window === "undefined") return; @@ -166,23 +161,21 @@ export function UserDropdown({ small }: UserDropdownProps) { <> - {!isPlatformPages && ( - <> - }> - - {t("my_profile")} - - }> - - {t("my_settings")} - - }> - - {t("out_of_office")} - - - - )} + <> + }> + + {t("my_profile")} + + }> + + {t("my_settings")} + + }> + + {t("out_of_office")} + + + }> @@ -192,12 +185,6 @@ export function UserDropdown({ small }: UserDropdownProps) { {t("help")} - {!isPlatformPages && isPlatformUser && ( - } className="todesktop:hidden hidden lg:flex"> - - {t("platform")} - - )} = async (_data) => { const { cfToken, ...data } = _data; @@ -295,8 +293,6 @@ export default function Signup({ const gettingStartedPath = onboardingV3Enabled ? "onboarding/getting-started" : "getting-started"; const verifyOrGettingStarted = emailVerificationEnabled ? "auth/verify-email" : gettingStartedPath; - const gettingStartedWithPlatform = "settings/platform/new"; - const constructCallBackIfUrlPresent = () => { if (isOrgInviteByLink) { return `${WEBAPP_URL}/${searchParams.get("callbackUrl")}`; @@ -305,9 +301,6 @@ export default function Signup({ }; const constructCallBackIfUrlNotPresent = () => { - if (isPlatformUser) { - return `${WEBAPP_URL}/${gettingStartedWithPlatform}?from=signup`; - } return `${WEBAPP_URL}/${verifyOrGettingStarted}?from=signup`; }; diff --git a/apps/web/modules/webhooks/components/WebhookForm.tsx b/apps/web/modules/webhooks/components/WebhookForm.tsx index 1d740e387d5d2d..8b7b62bbe5d73e 100644 --- a/apps/web/modules/webhooks/components/WebhookForm.tsx +++ b/apps/web/modules/webhooks/components/WebhookForm.tsx @@ -56,7 +56,6 @@ const WEBHOOK_TRIGGER_EVENTS_GROUPED_BY_APP_V2: Record void; onCancel?: () => void; - selectOnlyInstantMeetingOption?: boolean; headerWrapper?: ( formMethods: ReturnType>, children: React.ReactNode ) => React.ReactNode; }) => { - const { apps = [], selectOnlyInstantMeetingOption = false, overrideTriggerOptions } = props; + const { apps = [], overrideTriggerOptions } = props; const { t } = useLocale(); const webhookVariables = getWebhookVariables(t); @@ -273,11 +271,7 @@ const WebhookForm = (props: { const getEventTriggers = () => { if (props.webhook) return props.webhook.eventTriggers; - return ( - selectOnlyInstantMeetingOption - ? translatedTriggerOptions.filter((option) => option.value === WebhookTriggerEvents.INSTANT_MEETING) - : translatedTriggerOptions.filter((option) => option.value !== WebhookTriggerEvents.INSTANT_MEETING) - ).map((option) => option.value); + return translatedTriggerOptions.map((option) => option.value); }; const formMethods = useForm({ diff --git a/apps/web/next.config.ts b/apps/web/next.config.ts index d82e9d99ca1384..133974fe4cbddf 100644 --- a/apps/web/next.config.ts +++ b/apps/web/next.config.ts @@ -249,11 +249,6 @@ const nextConfig = (phase: string): NextConfig => { "@coss/ui", ], modularizeImports: { - "@calcom/web/modules/insights/components": { - transform: "@calcom/web/modules/insights/components/{{member}}", - skipDefaultConversion: true, - preventFullImport: true, - }, lodash: { transform: "lodash/{{member}}", }, @@ -614,11 +609,6 @@ const nextConfig = (phase: string): NextConfig => { destination: "/apps/installed/calendar", permanent: true, }, - { - source: "/settings/organizations/platform/:path*", - destination: "/settings/platform", - permanent: true, - }, { source: "/settings/organizations/members", destination: "/members", diff --git a/apps/web/playwright/app-router-not-found.e2e.ts b/apps/web/playwright/app-router-not-found.e2e.ts index 0857e44cf79ddc..5c5af5f987d256 100644 --- a/apps/web/playwright/app-router-not-found.e2e.ts +++ b/apps/web/playwright/app-router-not-found.e2e.ts @@ -10,7 +10,6 @@ test.describe("App Router - error handling", () => { page, }) => { await expectPageToBeNotFound({ page, url: "/123491234" }); - await expectPageToBeNotFound({ page, url: "/insights/123491234" }); await expectPageToBeNotFound({ page, url: "/login/123491234" }); }); }); diff --git a/apps/web/playwright/booking-pages.e2e.ts b/apps/web/playwright/booking-pages.e2e.ts index 8e4efde9c2b852..407af205fc6201 100644 --- a/apps/web/playwright/booking-pages.e2e.ts +++ b/apps/web/playwright/booking-pages.e2e.ts @@ -650,11 +650,11 @@ test.describe("GTM container", () => { const [user] = users.get(); await user.apiLogin(); - // Go to /insights page and wait for one of the common API call to complete + // Go to a non-booking page and wait for one of the common API calls to complete. const eventsByStatusRespPromise = page.waitForResponse( (response) => response.url().includes("getEventTypesFromGroup") && response.status() === 200 ); - await page.goto(`/insights`); + await page.goto("/event-types"); await page.waitForLoadState("domcontentloaded"); await eventsByStatusRespPromise; diff --git a/packages/emails/src/templates/MonthlyDigestEmail.tsx b/packages/emails/src/templates/MonthlyDigestEmail.tsx index 78978a9e8148be..9420142d583ec7 100644 --- a/packages/emails/src/templates/MonthlyDigestEmail.tsx +++ b/packages/emails/src/templates/MonthlyDigestEmail.tsx @@ -2,7 +2,7 @@ import type { TFunction } from "i18next"; import { APP_NAME, SENDER_NAME, SUPPORT_MAIL_ADDRESS } from "@calcom/lib/constants"; -import { BaseEmailHtml, CallToAction } from "../components"; +import { BaseEmailHtml } from "../components"; export type MonthlyDigestEmailData = { language: TFunction; @@ -177,13 +177,6 @@ export const MonthlyDigestEmail = ( )) : null}
    -
    - -

    diff --git a/packages/features/webhooks/lib/constants.ts b/packages/features/webhooks/lib/constants.ts index 4f18cf51f60b73..c46746c9ef2350 100644 --- a/packages/features/webhooks/lib/constants.ts +++ b/packages/features/webhooks/lib/constants.ts @@ -54,7 +54,6 @@ export const WEBHOOK_TRIGGER_EVENTS_GROUPED_BY_APP = { WebhookTriggerEvents.BOOKING_REQUESTED, WebhookTriggerEvents.BOOKING_REJECTED, WebhookTriggerEvents.RECORDING_READY, - WebhookTriggerEvents.INSTANT_MEETING, WebhookTriggerEvents.RECORDING_TRANSCRIPTION_GENERATED, WebhookTriggerEvents.BOOKING_NO_SHOW_UPDATED, WebhookTriggerEvents.OOO_CREATED, diff --git a/packages/features/webhooks/lib/dto/types.ts b/packages/features/webhooks/lib/dto/types.ts index 09d93fd03532e5..07fe072a017392 100644 --- a/packages/features/webhooks/lib/dto/types.ts +++ b/packages/features/webhooks/lib/dto/types.ts @@ -301,17 +301,6 @@ export interface MeetingEndedDTO extends BaseEventDTO { }; } -export interface InstantMeetingDTO extends BaseEventDTO { - triggerEvent: typeof WebhookTriggerEvents.INSTANT_MEETING; - title: string; - body: string; - icon?: string; - url?: string; - actions?: { action: string; title: string; type: string; image: string | null }[]; - requireInteraction?: boolean; - type: string; -} - export interface AfterHostsNoShowDTO extends BaseEventDTO { triggerEvent: typeof WebhookTriggerEvents.AFTER_HOSTS_CAL_VIDEO_NO_SHOW; bookingId: number; @@ -350,7 +339,6 @@ export type WebhookEventDTO = | TranscriptionGeneratedDTO | MeetingStartedDTO | MeetingEndedDTO - | InstantMeetingDTO | AfterHostsNoShowDTO | AfterGuestsNoShowDTO; diff --git a/packages/features/webhooks/lib/factory/base/BaseInstantMeetingBuilder.test.ts b/packages/features/webhooks/lib/factory/base/BaseInstantMeetingBuilder.test.ts deleted file mode 100644 index e82b94041ac6e3..00000000000000 --- a/packages/features/webhooks/lib/factory/base/BaseInstantMeetingBuilder.test.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { describe, it, expect } from "vitest"; -import { WebhookTriggerEvents } from "@calcom/prisma/enums"; - -import type { InstantMeetingDTO } from "../../dto/types"; -import { InstantMeetingBuilder } from "../versioned/v2021-10-20/InstantMeetingBuilder"; - -describe("InstantMeetingBuilder (v2021-10-20)", () => { - const builder = new InstantMeetingBuilder(); - - describe("INSTANT_MEETING", () => { - it("should build payload with all instant meeting fields", () => { - const dto: InstantMeetingDTO = { - triggerEvent: WebhookTriggerEvents.INSTANT_MEETING, - createdAt: "2024-01-15T10:00:00Z", - title: "Instant Meeting Request", - body: "Someone is requesting an instant meeting", - icon: "https://cal.com/icon.png", - url: "https://cal.com/meeting/instant-123", - actions: [ - { action: "accept", title: "Accept" }, - { action: "decline", title: "Decline" }, - ], - requireInteraction: true, - type: "instant", - }; - - const payload = builder.build(dto); - - expect(payload.triggerEvent).toBe(WebhookTriggerEvents.INSTANT_MEETING); - expect(payload.createdAt).toBe("2024-01-15T10:00:00Z"); - expect(payload.payload.title).toBe("Instant Meeting Request"); - expect(payload.payload.body).toBe("Someone is requesting an instant meeting"); - expect(payload.payload.icon).toBe("https://cal.com/icon.png"); - expect(payload.payload.url).toBe("https://cal.com/meeting/instant-123"); - expect(payload.payload.actions).toHaveLength(2); - expect(payload.payload.requireInteraction).toBe(true); - expect(payload.payload.type).toBe("instant"); - }); - }); -}); diff --git a/packages/features/webhooks/lib/factory/base/BaseInstantMeetingBuilder.ts b/packages/features/webhooks/lib/factory/base/BaseInstantMeetingBuilder.ts deleted file mode 100644 index 339054137c7de7..00000000000000 --- a/packages/features/webhooks/lib/factory/base/BaseInstantMeetingBuilder.ts +++ /dev/null @@ -1,20 +0,0 @@ -import type { InstantMeetingDTO } from "../../dto/types"; -import type { WebhookPayload } from "../types"; -import type { IInstantMeetingBuilder } from "../versioned/PayloadBuilderFactory"; - -/** - * Abstract base class for instant meeting payload builders. - * - * This class defines the interface that all version-specific instant meeting - * payload builders must implement. It does NOT contain any version-specific payload logic. - * - * Each webhook version should have its own concrete implementation in - * versioned/v{VERSION}/InstantMeetingBuilder.ts - */ -export abstract class BaseInstantMeetingBuilder implements IInstantMeetingBuilder { - /** - * Build the instant meeting webhook payload. - * Each version must implement this method with its specific payload structure. - */ - abstract build(dto: InstantMeetingDTO): WebhookPayload; -} diff --git a/packages/features/webhooks/lib/factory/base/index.ts b/packages/features/webhooks/lib/factory/base/index.ts index 6ed8052e90b9c8..498e7e335284ce 100644 --- a/packages/features/webhooks/lib/factory/base/index.ts +++ b/packages/features/webhooks/lib/factory/base/index.ts @@ -15,5 +15,4 @@ export { BaseBookingPayloadBuilder } from "./BaseBookingPayloadBuilder"; export { BaseMeetingPayloadBuilder } from "./BaseMeetingPayloadBuilder"; export { BaseRecordingPayloadBuilder } from "./BaseRecordingPayloadBuilder"; export { BaseOOOPayloadBuilder } from "./BaseOOOPayloadBuilder"; -export { BaseInstantMeetingBuilder } from "./BaseInstantMeetingBuilder"; export type { BookingExtraDataMap, BookingPayloadParams } from "./BaseBookingPayloadBuilder"; diff --git a/packages/features/webhooks/lib/factory/types.ts b/packages/features/webhooks/lib/factory/types.ts index 9e1acdb28d8880..f5f0453a351809 100644 --- a/packages/features/webhooks/lib/factory/types.ts +++ b/packages/features/webhooks/lib/factory/types.ts @@ -63,16 +63,6 @@ export interface MeetingPayload { }[]; } -export interface InstantMeetingPayload { - title: string; - body: string; - icon?: string; - url?: string; - actions?: { action: string; title: string; type: string; image: string | null }[]; - requireInteraction?: boolean; - type: string; -} - export interface NoShowWebhookPayload { bookingId: number; webhook: { @@ -93,6 +83,5 @@ export interface WebhookPayload { | FormSubmittedPayload | RecordingPayload | MeetingPayload - | InstantMeetingPayload | NoShowWebhookPayload; } diff --git a/packages/features/webhooks/lib/factory/versioned/PayloadBuilderFactory.test.ts b/packages/features/webhooks/lib/factory/versioned/PayloadBuilderFactory.test.ts index 458bdc3e3261b3..2d38ec332754d3 100644 --- a/packages/features/webhooks/lib/factory/versioned/PayloadBuilderFactory.test.ts +++ b/packages/features/webhooks/lib/factory/versioned/PayloadBuilderFactory.test.ts @@ -16,7 +16,6 @@ describe("PayloadBuilderFactory", () => { ooo: new V2021_10_20.OOOPayloadBuilder(), recording: new V2021_10_20.RecordingPayloadBuilder(), meeting: new V2021_10_20.MeetingPayloadBuilder(), - instantMeeting: new V2021_10_20.InstantMeetingBuilder(), }; factory = new PayloadBuilderFactory(WebhookVersionEnum.V_2021_10_20, defaultBuilders); @@ -42,7 +41,6 @@ describe("PayloadBuilderFactory", () => { ooo: new V2021_10_20.OOOPayloadBuilder(), recording: new V2021_10_20.RecordingPayloadBuilder(), meeting: new V2021_10_20.MeetingPayloadBuilder(), - instantMeeting: new V2021_10_20.InstantMeetingBuilder(), }; factory.registerVersion("2024-12-01", newVersionBuilders); @@ -57,7 +55,6 @@ describe("PayloadBuilderFactory", () => { ooo: new V2021_10_20.OOOPayloadBuilder(), recording: new V2021_10_20.RecordingPayloadBuilder(), meeting: new V2021_10_20.MeetingPayloadBuilder(), - instantMeeting: new V2021_10_20.InstantMeetingBuilder(), }; factory.registerVersion(WebhookVersionEnum.V_2021_10_20, newBuilders); @@ -111,13 +108,6 @@ describe("PayloadBuilderFactory", () => { }); }); - it("should route instant meeting events to instant meeting builder", () => { - const builder = factory.getBuilder( - WebhookVersionEnum.V_2021_10_20, - WebhookTriggerEvents.INSTANT_MEETING - ); - expect(builder).toBe(defaultBuilders.instantMeeting); - }); }); describe("Fallback Behavior", () => { @@ -166,17 +156,12 @@ describe("PayloadBuilderFactory", () => { WebhookVersionEnum.V_2021_10_20, WebhookTriggerEvents.MEETING_STARTED ); - const instantBuilder = factory.getBuilder( - WebhookVersionEnum.V_2021_10_20, - WebhookTriggerEvents.INSTANT_MEETING - ); // Runtime verification expect(bookingBuilder).toBeDefined(); expect(oooBuilder).toBeDefined(); expect(recordingBuilder).toBeDefined(); expect(meetingBuilder).toBeDefined(); - expect(instantBuilder).toBeDefined(); }); it("should build valid payload with correctly typed DTO", () => { @@ -244,7 +229,6 @@ describe("PayloadBuilderFactory", () => { ooo: new V2021_10_20.OOOPayloadBuilder(), recording: new V2021_10_20.RecordingPayloadBuilder(), meeting: new V2021_10_20.MeetingPayloadBuilder(), - instantMeeting: new V2021_10_20.InstantMeetingBuilder(), }; factory.registerVersion(WebhookVersionEnum.V_2024_12_01, v2Builders); diff --git a/packages/features/webhooks/lib/factory/versioned/PayloadBuilderFactory.ts b/packages/features/webhooks/lib/factory/versioned/PayloadBuilderFactory.ts index 82223e1acfccdb..7f44c299b8233c 100644 --- a/packages/features/webhooks/lib/factory/versioned/PayloadBuilderFactory.ts +++ b/packages/features/webhooks/lib/factory/versioned/PayloadBuilderFactory.ts @@ -4,7 +4,6 @@ import type { AfterGuestsNoShowDTO, AfterHostsNoShowDTO, BookingWebhookEventDTO, - InstantMeetingDTO, MeetingEndedDTO, MeetingStartedDTO, OOOCreatedDTO, @@ -44,16 +43,11 @@ export interface IMeetingPayloadBuilder ): WebhookPayload; } -export interface IInstantMeetingBuilder extends IPayloadBuilder { - build(dto: InstantMeetingDTO): WebhookPayload; -} - export interface PayloadBuilderSet { booking: IBookingPayloadBuilder; ooo: IOOOPayloadBuilder; recording: IRecordingPayloadBuilder; meeting: IMeetingPayloadBuilder; - instantMeeting: IInstantMeetingBuilder; } type BuilderCategory = keyof PayloadBuilderSet; @@ -92,9 +86,6 @@ const TRIGGER_TO_BUILDER_CATEGORY: Record [WebhookTriggerEvents.AFTER_HOSTS_CAL_VIDEO_NO_SHOW]: "meeting", [WebhookTriggerEvents.AFTER_GUESTS_CAL_VIDEO_NO_SHOW]: "meeting", - // Instant meeting events - [WebhookTriggerEvents.INSTANT_MEETING]: "instantMeeting", - // Delegation events (enterprise feature removed, mapped to booking as fallback) [WebhookTriggerEvents.DELEGATION_CREDENTIAL_ERROR]: "booking", @@ -128,8 +119,6 @@ export type MeetingTriggerEvents = | typeof WebhookTriggerEvents.AFTER_HOSTS_CAL_VIDEO_NO_SHOW | typeof WebhookTriggerEvents.AFTER_GUESTS_CAL_VIDEO_NO_SHOW; -export type InstantMeetingTriggerEvents = typeof WebhookTriggerEvents.INSTANT_MEETING; - /** * Factory that routes to version-specific payload builders * @@ -192,7 +181,6 @@ export class PayloadBuilderFactory { getBuilder(version: WebhookVersion, triggerEvent: OOOTriggerEvents): IOOOPayloadBuilder; getBuilder(version: WebhookVersion, triggerEvent: RecordingTriggerEvents): IRecordingPayloadBuilder; getBuilder(version: WebhookVersion, triggerEvent: MeetingTriggerEvents): IMeetingPayloadBuilder; - getBuilder(version: WebhookVersion, triggerEvent: InstantMeetingTriggerEvents): IInstantMeetingBuilder; getBuilder(version: WebhookVersion, triggerEvent: WebhookTriggerEvents): IPayloadBuilder; getBuilder(version: WebhookVersion, triggerEvent: WebhookTriggerEvents): IPayloadBuilder { const builderSet = this.getBuilderSet(version); diff --git a/packages/features/webhooks/lib/factory/versioned/registry.test.ts b/packages/features/webhooks/lib/factory/versioned/registry.test.ts index 6be2c2d8c38e52..23367936827a10 100644 --- a/packages/features/webhooks/lib/factory/versioned/registry.test.ts +++ b/packages/features/webhooks/lib/factory/versioned/registry.test.ts @@ -31,16 +31,11 @@ describe("Payload Builder Registry", () => { DEFAULT_WEBHOOK_VERSION, WebhookTriggerEvents.MEETING_STARTED ); - const instantBuilder = factory.getBuilder( - DEFAULT_WEBHOOK_VERSION, - WebhookTriggerEvents.INSTANT_MEETING - ); expect(bookingBuilder).toBeDefined(); expect(oooBuilder).toBeDefined(); expect(recordingBuilder).toBeDefined(); expect(meetingBuilder).toBeDefined(); - expect(instantBuilder).toBeDefined(); }); it("should register v2021-10-20 builders", () => { @@ -92,7 +87,6 @@ describe("Payload Builder Registry", () => { ooo: new V2021_10_20.OOOPayloadBuilder(), recording: new V2021_10_20.RecordingPayloadBuilder(), meeting: new V2021_10_20.MeetingPayloadBuilder(), - instantMeeting: new V2021_10_20.InstantMeetingBuilder(), }; factory.registerVersion(NEW_VERSION, newVersionBuilders); @@ -111,7 +105,6 @@ describe("Payload Builder Registry", () => { ooo: new V2021_10_20.OOOPayloadBuilder(), recording: new V2021_10_20.RecordingPayloadBuilder(), meeting: new V2021_10_20.MeetingPayloadBuilder(), - instantMeeting: new V2021_10_20.InstantMeetingBuilder(), }; factory.registerVersion(NEW_VERSION, v2Builders); @@ -140,7 +133,6 @@ describe("Payload Builder Registry", () => { ooo: new V2021_10_20.OOOPayloadBuilder(), recording: new V2021_10_20.RecordingPayloadBuilder(), meeting: new V2021_10_20.MeetingPayloadBuilder(), - instantMeeting: new V2021_10_20.InstantMeetingBuilder(), }); expect(factory1.getRegisteredVersions()).not.toEqual(factory2.getRegisteredVersions()); diff --git a/packages/features/webhooks/lib/factory/versioned/registry.ts b/packages/features/webhooks/lib/factory/versioned/registry.ts index 92832b2e102efa..5b2ac227e2c73b 100644 --- a/packages/features/webhooks/lib/factory/versioned/registry.ts +++ b/packages/features/webhooks/lib/factory/versioned/registry.ts @@ -26,7 +26,6 @@ export { DEFAULT_WEBHOOK_VERSION } from "../../interface/IWebhookRepository"; * ooo: new V2024_12_01.OOOPayloadBuilder(), * recording: new V2024_12_01.RecordingPayloadBuilder(), * meeting: new V2024_12_01.MeetingPayloadBuilder(), - * instantMeeting: new V2024_12_01.InstantMeetingBuilder(), * }); * ``` */ @@ -36,7 +35,6 @@ export function createPayloadBuilderFactory(): PayloadBuilderFactory { ooo: new V2021_10_20.OOOPayloadBuilder(), recording: new V2021_10_20.RecordingPayloadBuilder(), meeting: new V2021_10_20.MeetingPayloadBuilder(), - instantMeeting: new V2021_10_20.InstantMeetingBuilder(), }; const factory = new PayloadBuilderFactory(DEFAULT_WEBHOOK_VERSION, defaultBuilders); diff --git a/packages/features/webhooks/lib/factory/versioned/v2021-10-20/InstantMeetingBuilder.ts b/packages/features/webhooks/lib/factory/versioned/v2021-10-20/InstantMeetingBuilder.ts deleted file mode 100644 index a3d7889c7a14cf..00000000000000 --- a/packages/features/webhooks/lib/factory/versioned/v2021-10-20/InstantMeetingBuilder.ts +++ /dev/null @@ -1,30 +0,0 @@ -import type { InstantMeetingDTO } from "../../../dto/types"; -import type { WebhookPayload } from "../../types"; -import { BaseInstantMeetingBuilder } from "../../base/BaseInstantMeetingBuilder"; - -/** - * Instant meeting payload builder for webhook version v2021-10-20. - * - * This is the initial instant meeting webhook payload format. - * It includes notification-style data (title, body, icon, url, actions). - */ -export class InstantMeetingBuilder extends BaseInstantMeetingBuilder { - /** - * Build the instant meeting webhook payload for v2021-10-20. - */ - build(dto: InstantMeetingDTO): WebhookPayload { - return { - triggerEvent: dto.triggerEvent, - createdAt: dto.createdAt, - payload: { - title: dto.title, - body: dto.body, - icon: dto.icon, - url: dto.url, - actions: dto.actions, - requireInteraction: dto.requireInteraction, - type: dto.type, - }, - }; - } -} diff --git a/packages/features/webhooks/lib/factory/versioned/v2021-10-20/index.ts b/packages/features/webhooks/lib/factory/versioned/v2021-10-20/index.ts index 5caed485a9b91e..4d816fb65f54c8 100644 --- a/packages/features/webhooks/lib/factory/versioned/v2021-10-20/index.ts +++ b/packages/features/webhooks/lib/factory/versioned/v2021-10-20/index.ts @@ -10,4 +10,3 @@ export { BookingPayloadBuilder } from "./BookingPayloadBuilder"; export { MeetingPayloadBuilder } from "./MeetingPayloadBuilder"; export { RecordingPayloadBuilder } from "./RecordingPayloadBuilder"; export { OOOPayloadBuilder } from "./OOOPayloadBuilder"; -export { InstantMeetingBuilder } from "./InstantMeetingBuilder"; diff --git a/packages/prisma/migrations/20260430000000_drop_instant_meeting_webhook_trigger/migration.sql b/packages/prisma/migrations/20260430000000_drop_instant_meeting_webhook_trigger/migration.sql new file mode 100644 index 00000000000000..6897fe0ed31614 --- /dev/null +++ b/packages/prisma/migrations/20260430000000_drop_instant_meeting_webhook_trigger/migration.sql @@ -0,0 +1,33 @@ +BEGIN; +UPDATE "public"."Webhook" +SET "eventTriggers" = array_remove("eventTriggers", 'INSTANT_MEETING'::"public"."WebhookTriggerEvents") +WHERE "eventTriggers" @> ARRAY['INSTANT_MEETING']::"public"."WebhookTriggerEvents"[]; + +CREATE TYPE "public"."WebhookTriggerEvents_new" AS ENUM ( + 'BOOKING_CREATED', + 'BOOKING_PAYMENT_INITIATED', + 'BOOKING_PAID', + 'BOOKING_RESCHEDULED', + 'BOOKING_REQUESTED', + 'BOOKING_CANCELLED', + 'BOOKING_REJECTED', + 'BOOKING_NO_SHOW_UPDATED', + 'FORM_SUBMITTED', + 'MEETING_ENDED', + 'MEETING_STARTED', + 'RECORDING_READY', + 'RECORDING_TRANSCRIPTION_GENERATED', + 'OOO_CREATED', + 'AFTER_HOSTS_CAL_VIDEO_NO_SHOW', + 'AFTER_GUESTS_CAL_VIDEO_NO_SHOW', + 'FORM_SUBMITTED_NO_EVENT', + 'DELEGATION_CREDENTIAL_ERROR', + 'WRONG_ASSIGNMENT_REPORT' +); +ALTER TABLE "public"."Webhook" +ALTER COLUMN "eventTriggers" TYPE "public"."WebhookTriggerEvents_new"[] +USING ("eventTriggers"::text::"public"."WebhookTriggerEvents_new"[]); +ALTER TYPE "public"."WebhookTriggerEvents" RENAME TO "WebhookTriggerEvents_old"; +ALTER TYPE "public"."WebhookTriggerEvents_new" RENAME TO "WebhookTriggerEvents"; +DROP TYPE "public"."WebhookTriggerEvents_old"; +COMMIT; diff --git a/packages/prisma/package.json b/packages/prisma/package.json index 7a612efef70c06..2876b4e3c446a8 100644 --- a/packages/prisma/package.json +++ b/packages/prisma/package.json @@ -22,7 +22,6 @@ "seed-app-store": "ts-node --transpile-only ../../scripts/seed-app-store.ts", "delete-app": "ts-node --transpile-only ./delete-app.ts", "seed-basic": "ts-node --transpile-only ../../scripts/seed.ts", - "seed-insights": "ts-node --transpile-only ../../scripts/seed-insights.ts", "seed-pbac": "ts-node --transpile-only ../../scripts/seed-pbac-organization.ts" }, "dependencies": { diff --git a/packages/prisma/schema.prisma b/packages/prisma/schema.prisma index cef62a052f4c2d..743ca560407faf 100644 --- a/packages/prisma/schema.prisma +++ b/packages/prisma/schema.prisma @@ -1130,7 +1130,6 @@ enum WebhookTriggerEvents { MEETING_ENDED MEETING_STARTED RECORDING_READY - INSTANT_MEETING RECORDING_TRANSCRIPTION_GENERATED OOO_CREATED AFTER_HOSTS_CAL_VIDEO_NO_SHOW