From e86ad03cde5c0e251f5743c3036cf7201b6beea9 Mon Sep 17 00:00:00 2001 From: Keith Williams Date: Fri, 4 Apr 2025 16:33:14 -0300 Subject: [PATCH] perf: Slim down logged in round 2 (#20535) * perf: Slim down loggedInViewer some more * Move locationOptions to apps router * Moved calVideo related handlers to separate router * Moved calendar related handlers to separate router * Rename * Moved deleteCredential to new router * Moved updateProfile to me router * fix unit test * fix e2e test * tweak * missing --------- Co-authored-by: Anik Dhabal Babu <81948346+anikdhabal@users.noreply.github.com> Co-authored-by: unknown --- .../components/apps/CalendarListContainer.tsx | 8 +- .../apps/MultiDisconnectIntegration.tsx | 6 +- .../EventTypeConferencingAppSettings.tsx | 2 +- .../components/dialog/EditLocationDialog.tsx | 2 +- .../__tests__/EditLocationDialog.test.tsx | 6 +- .../CreateEventsOnCalendarSelect.tsx | 6 +- .../steps-views/ConnectCalendars.tsx | 2 +- .../steps-views/UserProfile.tsx | 4 +- .../steps-views/UserSettings.tsx | 2 +- .../security/DisableUserImpersonation.tsx | 2 +- .../UsernameAvailability/PremiumTextfield.tsx | 2 +- .../UsernameTextfield.tsx | 2 +- .../[category]/installed-category-view.tsx | 4 +- .../settings/my-account/appearance-view.tsx | 2 +- .../settings/my-account/general-view.tsx | 2 +- .../settings/my-account/profile-view.tsx | 2 +- .../settings/security/impersonation-view.tsx | 2 +- .../settings/security/password-view.tsx | 15 +- apps/web/pages/api/trpc/calVideo/[trpc].ts | 4 + apps/web/pages/api/trpc/calendars/[trpc].ts | 4 + apps/web/pages/api/trpc/credentials/[trpc].ts | 4 + apps/web/playwright/change-username.e2e.ts | 2 +- apps/web/playwright/locale.e2e.ts | 4 +- apps/web/playwright/profile.e2e.ts | 2 +- .../app-store/hitpay/pages/setup/index.tsx | 2 +- .../apps/components/DisconnectIntegration.tsx | 4 +- .../Booker/components/hooks/useCalendars.ts | 2 +- .../features/calendars/CalendarSwitch.tsx | 2 +- .../calendars/DestinationCalendarSelector.tsx | 2 +- .../ee/video/ViewRecordingsDialog.tsx | 4 +- .../workflows/components/WorkflowListPage.tsx | 2 +- .../tabs/advanced/EventAdvancedTab.tsx | 2 +- .../settings/TimezoneChangeDialog.tsx | 2 +- .../components/CalendarToggleContainer.tsx | 2 +- .../ConferencingAppsViewWebWrapper.tsx | 4 +- .../DestinationCalendarSettingsWebWrapper.tsx | 6 +- .../wrappers/EventAdvancedWebWrapper.tsx | 2 +- .../SelectedCalendarsSettingsWebWrapper.tsx | 4 +- packages/trpc/react/shared.ts | 3 + .../server/routers/loggedInViewer/_router.tsx | 138 ------------------ .../trpc/server/routers/viewer/_router.tsx | 6 + .../server/routers/viewer/apps/_router.tsx | 18 +++ .../apps}/locationOptions.handler.ts | 0 .../apps}/locationOptions.schema.ts | 0 .../routers/viewer/calVideo/_router.tsx | 47 ++++++ .../getCalVideoRecordings.handler.ts | 0 .../calVideo}/getCalVideoRecordings.schema.ts | 0 ...ownloadLinkOfCalVideoRecordings.handler.ts | 2 +- ...DownloadLinkOfCalVideoRecordings.schema.ts | 0 .../routers/viewer/calendars/_router.tsx | 45 ++++++ .../calendars}/connectedCalendars.handler.ts | 0 .../calendars}/connectedCalendars.schema.ts | 0 .../setDestinationCalendar.handler.test.ts | 4 +- .../setDestinationCalendar.handler.ts | 0 .../setDestinationCalendar.schema.ts | 0 .../routers/viewer/credentials/_router.tsx | 26 ++++ .../credentials}/deleteCredential.handler.ts | 0 .../credentials}/deleteCredential.schema.ts | 0 .../viewer/eventTypes/duplicate.handler.ts | 2 +- .../viewer/eventTypes/update.handler.ts | 2 +- .../trpc/server/routers/viewer/me/_router.tsx | 5 + .../me}/updateProfile.handler.ts | 2 +- .../me}/updateProfile.schema.ts | 0 .../routers/viewer/workflows/_router.tsx | 14 ++ .../workflows}/workflowOrder.handler.ts | 0 .../workflows}/workflowOrder.schema.ts | 0 66 files changed, 240 insertions(+), 205 deletions(-) create mode 100644 apps/web/pages/api/trpc/calVideo/[trpc].ts create mode 100644 apps/web/pages/api/trpc/calendars/[trpc].ts create mode 100644 apps/web/pages/api/trpc/credentials/[trpc].ts rename packages/trpc/server/routers/{loggedInViewer => viewer/apps}/locationOptions.handler.ts (100%) rename packages/trpc/server/routers/{loggedInViewer => viewer/apps}/locationOptions.schema.ts (100%) create mode 100644 packages/trpc/server/routers/viewer/calVideo/_router.tsx rename packages/trpc/server/routers/{loggedInViewer => viewer/calVideo}/getCalVideoRecordings.handler.ts (100%) rename packages/trpc/server/routers/{loggedInViewer => viewer/calVideo}/getCalVideoRecordings.schema.ts (100%) rename packages/trpc/server/routers/{loggedInViewer => viewer/calVideo}/getDownloadLinkOfCalVideoRecordings.handler.ts (94%) rename packages/trpc/server/routers/{loggedInViewer => viewer/calVideo}/getDownloadLinkOfCalVideoRecordings.schema.ts (100%) create mode 100644 packages/trpc/server/routers/viewer/calendars/_router.tsx rename packages/trpc/server/routers/{loggedInViewer => viewer/calendars}/connectedCalendars.handler.ts (100%) rename packages/trpc/server/routers/{loggedInViewer => viewer/calendars}/connectedCalendars.schema.ts (100%) rename packages/trpc/server/routers/{loggedInViewer => viewer/calendars}/setDestinationCalendar.handler.test.ts (97%) rename packages/trpc/server/routers/{loggedInViewer => viewer/calendars}/setDestinationCalendar.handler.ts (100%) rename packages/trpc/server/routers/{loggedInViewer => viewer/calendars}/setDestinationCalendar.schema.ts (100%) create mode 100644 packages/trpc/server/routers/viewer/credentials/_router.tsx rename packages/trpc/server/routers/{loggedInViewer => viewer/credentials}/deleteCredential.handler.ts (100%) rename packages/trpc/server/routers/{loggedInViewer => viewer/credentials}/deleteCredential.schema.ts (100%) rename packages/trpc/server/routers/{loggedInViewer => viewer/me}/updateProfile.handler.ts (99%) rename packages/trpc/server/routers/{loggedInViewer => viewer/me}/updateProfile.schema.ts (100%) rename packages/trpc/server/routers/{loggedInViewer => viewer/workflows}/workflowOrder.handler.ts (100%) rename packages/trpc/server/routers/{loggedInViewer => viewer/workflows}/workflowOrder.schema.ts (100%) diff --git a/apps/web/components/apps/CalendarListContainer.tsx b/apps/web/components/apps/CalendarListContainer.tsx index f1a95c7d24..04c500a696 100644 --- a/apps/web/components/apps/CalendarListContainer.tsx +++ b/apps/web/components/apps/CalendarListContainer.tsx @@ -84,16 +84,16 @@ export function CalendarListContainer(props: { heading?: boolean; fromOnboarding exact: true, } ), - utils.viewer.connectedCalendars.invalidate(), + utils.viewer.calendars.connectedCalendars.invalidate(), ]); - const query = trpc.viewer.connectedCalendars.useQuery(); + const query = trpc.viewer.calendars.connectedCalendars.useQuery(); const installedCalendars = trpc.viewer.apps.integrations.useQuery({ variant: "calendar", onlyInstalled: true, }); - const mutation = trpc.viewer.setDestinationCalendar.useMutation({ + const mutation = trpc.viewer.calendars.setDestinationCalendar.useMutation({ onSuccess: () => { - utils.viewer.connectedCalendars.invalidate(); + utils.viewer.calendars.connectedCalendars.invalidate(); }, }); return ( diff --git a/apps/web/components/apps/MultiDisconnectIntegration.tsx b/apps/web/components/apps/MultiDisconnectIntegration.tsx index af3afbfd0b..52f102368f 100644 --- a/apps/web/components/apps/MultiDisconnectIntegration.tsx +++ b/apps/web/components/apps/MultiDisconnectIntegration.tsx @@ -3,7 +3,7 @@ import { useState } from "react"; import { Dialog } from "@calcom/features/components/controlled-dialog"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import { trpc } from "@calcom/trpc/react"; -import type { AppRouter } from "@calcom/trpc/types/server/routers/_app"; +import type { AppRouter } from "@calcom/trpc/server/routers/_app"; import { Button } from "@calcom/ui/components/button"; import { ConfirmationDialogContent } from "@calcom/ui/components/dialog"; import { @@ -36,7 +36,7 @@ export function MultiDisconnectIntegration({ credentials, onSuccess }: Props) { } | null>(null); const [confirmationDialogOpen, setConfirmationDialogOpen] = useState(false); - const mutation = trpc.viewer.deleteCredential.useMutation({ + const mutation = trpc.viewer.credentials.delete.useMutation({ onSuccess: () => { showToast(t("app_removed_successfully"), "success"); onSuccess && onSuccess(); @@ -47,7 +47,7 @@ export function MultiDisconnectIntegration({ credentials, onSuccess }: Props) { setConfirmationDialogOpen(false); }, async onSettled() { - await utils.viewer.connectedCalendars.invalidate(); + await utils.viewer.calendars.connectedCalendars.invalidate(); await utils.viewer.apps.integrations.invalidate(); }, }); diff --git a/apps/web/components/apps/installation/EventTypeConferencingAppSettings.tsx b/apps/web/components/apps/installation/EventTypeConferencingAppSettings.tsx index e023380cae..17d3a617fd 100644 --- a/apps/web/components/apps/installation/EventTypeConferencingAppSettings.tsx +++ b/apps/web/components/apps/installation/EventTypeConferencingAppSettings.tsx @@ -70,7 +70,7 @@ const LocationsWrapper = ({ }; const EventTypeConferencingAppSettings = ({ eventType, slug }: { eventType: TEventType; slug: string }) => { - const locationsQuery = trpc.viewer.locationOptions.useQuery({}); + const locationsQuery = trpc.viewer.apps.locationOptions.useQuery({}); const { t } = useLocale(); const SkeletonLoader = () => { diff --git a/apps/web/components/dialog/EditLocationDialog.tsx b/apps/web/components/dialog/EditLocationDialog.tsx index d4410d3957..bc94b6a625 100644 --- a/apps/web/components/dialog/EditLocationDialog.tsx +++ b/apps/web/components/dialog/EditLocationDialog.tsx @@ -92,7 +92,7 @@ export const EditLocationDialog = (props: ISetLocationDialog) => { teamId, } = props; const { t } = useLocale(); - const locationsQuery = trpc.viewer.locationOptions.useQuery({ teamId }); + const locationsQuery = trpc.viewer.apps.locationOptions.useQuery({ teamId }); useEffect(() => { if (selection) { diff --git a/apps/web/components/dialog/__tests__/EditLocationDialog.test.tsx b/apps/web/components/dialog/__tests__/EditLocationDialog.test.tsx index 63a0fc2a53..1d5243ae30 100644 --- a/apps/web/components/dialog/__tests__/EditLocationDialog.test.tsx +++ b/apps/web/components/dialog/__tests__/EditLocationDialog.test.tsx @@ -11,8 +11,10 @@ import { EditLocationDialog } from "../EditLocationDialog"; vi.mock("@calcom/trpc/react", () => ({ trpc: { viewer: { - locationOptions: { - useQuery: vi.fn(), + apps: { + locationOptions: { + useQuery: vi.fn(), + }, }, }, }, diff --git a/apps/web/components/getting-started/components/CreateEventsOnCalendarSelect.tsx b/apps/web/components/getting-started/components/CreateEventsOnCalendarSelect.tsx index 4a7d79b5b5..6b0fb73697 100644 --- a/apps/web/components/getting-started/components/CreateEventsOnCalendarSelect.tsx +++ b/apps/web/components/getting-started/components/CreateEventsOnCalendarSelect.tsx @@ -4,14 +4,14 @@ import type { RouterInputs } from "@calcom/trpc/react"; import { trpc } from "@calcom/trpc/react"; interface ICreateEventsOnCalendarSelectProps { - calendar?: RouterInputs["viewer"]["setDestinationCalendar"] | null; + calendar?: RouterInputs["viewer"]["calendars"]["setDestinationCalendar"] | null; } const CreateEventsOnCalendarSelect = (props: ICreateEventsOnCalendarSelectProps) => { const { calendar } = props; const { t } = useLocale(); - const mutation = trpc.viewer.setDestinationCalendar.useMutation(); - const connectedCalendarsQuery = trpc.viewer.connectedCalendars.useQuery(); + const mutation = trpc.viewer.calendars.setDestinationCalendar.useMutation(); + const connectedCalendarsQuery = trpc.viewer.calendars.connectedCalendars.useQuery(); return ( <> diff --git a/apps/web/components/getting-started/steps-views/ConnectCalendars.tsx b/apps/web/components/getting-started/steps-views/ConnectCalendars.tsx index 462e8f7c42..46d4d3254c 100644 --- a/apps/web/components/getting-started/steps-views/ConnectCalendars.tsx +++ b/apps/web/components/getting-started/steps-views/ConnectCalendars.tsx @@ -16,7 +16,7 @@ interface IConnectCalendarsProps { const ConnectedCalendars = (props: IConnectCalendarsProps) => { const { nextStep, isPageLoading } = props; - const queryConnectedCalendars = trpc.viewer.connectedCalendars.useQuery({ + const queryConnectedCalendars = trpc.viewer.calendars.connectedCalendars.useQuery({ onboarding: true, eventTypeId: null, }); diff --git a/apps/web/components/getting-started/steps-views/UserProfile.tsx b/apps/web/components/getting-started/steps-views/UserProfile.tsx index 49033b8ae0..5723ddcb7c 100644 --- a/apps/web/components/getting-started/steps-views/UserProfile.tsx +++ b/apps/web/components/getting-started/steps-views/UserProfile.tsx @@ -38,7 +38,7 @@ const UserProfile = () => { const [firstRender, setFirstRender] = useState(true); // Create a separate mutation for avatar updates - const avatarMutation = trpc.viewer.updateProfile.useMutation({ + const avatarMutation = trpc.viewer.me.updateProfile.useMutation({ onSuccess: async (data) => { showToast(t("your_user_profile_updated_successfully"), "success"); setImageSrc(data.avatarUrl ?? ""); @@ -49,7 +49,7 @@ const UserProfile = () => { }); // Original mutation remains for onboarding completion - const mutation = trpc.viewer.updateProfile.useMutation({ + const mutation = trpc.viewer.me.updateProfile.useMutation({ onSuccess: async () => { try { if (eventTypes?.length === 0) { diff --git a/apps/web/components/getting-started/steps-views/UserSettings.tsx b/apps/web/components/getting-started/steps-views/UserSettings.tsx index 182f1425e3..fec228c495 100644 --- a/apps/web/components/getting-started/steps-views/UserSettings.tsx +++ b/apps/web/components/getting-started/steps-views/UserSettings.tsx @@ -58,7 +58,7 @@ const UserSettings = (props: IUserSettingsProps) => { await utils.viewer.me.invalidate(); nextStep(); }; - const mutation = trpc.viewer.updateProfile.useMutation({ + const mutation = trpc.viewer.me.updateProfile.useMutation({ onSuccess: onSuccess, }); diff --git a/apps/web/components/security/DisableUserImpersonation.tsx b/apps/web/components/security/DisableUserImpersonation.tsx index 2dd2cb917c..b20c0573d8 100644 --- a/apps/web/components/security/DisableUserImpersonation.tsx +++ b/apps/web/components/security/DisableUserImpersonation.tsx @@ -9,7 +9,7 @@ const DisableUserImpersonation = ({ disableImpersonation }: { disableImpersonati const { t } = useLocale(); - const mutation = trpc.viewer.updateProfile.useMutation({ + const mutation = trpc.viewer.me.updateProfile.useMutation({ onSuccess: async () => { showToast(t("your_user_profile_updated_successfully"), "success"); await utils.viewer.me.invalidate(); diff --git a/apps/web/components/ui/UsernameAvailability/PremiumTextfield.tsx b/apps/web/components/ui/UsernameAvailability/PremiumTextfield.tsx index b2d19c0977..1a8c82b562 100644 --- a/apps/web/components/ui/UsernameAvailability/PremiumTextfield.tsx +++ b/apps/web/components/ui/UsernameAvailability/PremiumTextfield.tsx @@ -102,7 +102,7 @@ const PremiumTextfield = (props: ICustomUsernameProps) => { checkUsername(debouncedUsername); }, [debouncedUsername, currentUsername]); - const updateUsername = trpc.viewer.updateProfile.useMutation({ + const updateUsername = trpc.viewer.me.updateProfile.useMutation({ onSuccess: async () => { onSuccessMutation && (await onSuccessMutation()); await update({ username: inputUsernameValue }); diff --git a/apps/web/components/ui/UsernameAvailability/UsernameTextfield.tsx b/apps/web/components/ui/UsernameAvailability/UsernameTextfield.tsx index 9e66d3d673..921c1c0114 100644 --- a/apps/web/components/ui/UsernameAvailability/UsernameTextfield.tsx +++ b/apps/web/components/ui/UsernameAvailability/UsernameTextfield.tsx @@ -70,7 +70,7 @@ const UsernameTextfield = (props: ICustomUsernameProps & Partial { onSuccessMutation && (await onSuccessMutation()); setOpenDialogSaveUsername(false); diff --git a/apps/web/modules/apps/installed/[category]/installed-category-view.tsx b/apps/web/modules/apps/installed/[category]/installed-category-view.tsx index a2a83b6879..8ed7ccdf1b 100644 --- a/apps/web/modules/apps/installed/[category]/installed-category-view.tsx +++ b/apps/web/modules/apps/installed/[category]/installed-category-view.tsx @@ -207,7 +207,7 @@ export default function InstalledApps({ category }: PageProps) { updateData({ isOpen: true, credentialId, teamId }); }; - const deleteCredentialMutation = trpc.viewer.deleteCredential.useMutation(); + const deleteCredentialMutation = trpc.viewer.credentials.delete.useMutation(); const handleRemoveApp = ({ credentialId, teamId, callback }: RemoveAppParams) => { deleteCredentialMutation.mutate( @@ -217,7 +217,7 @@ export default function InstalledApps({ category }: PageProps) { showToast(t("app_removed_successfully"), "success"); callback(); utils.viewer.apps.integrations.invalidate(); - utils.viewer.connectedCalendars.invalidate(); + utils.viewer.calendars.connectedCalendars.invalidate(); }, onError: () => { showToast(t("error_removing_app"), "error"); diff --git a/apps/web/modules/settings/my-account/appearance-view.tsx b/apps/web/modules/settings/my-account/appearance-view.tsx index 66ec05a179..98e78b93cc 100644 --- a/apps/web/modules/settings/my-account/appearance-view.tsx +++ b/apps/web/modules/settings/my-account/appearance-view.tsx @@ -155,7 +155,7 @@ const AppearanceView = ({ typeof document !== "undefined" && document.documentElement.classList.contains("dark")); - const mutation = trpc.viewer.updateProfile.useMutation({ + const mutation = trpc.viewer.me.updateProfile.useMutation({ onSuccess: async (data) => { await utils.viewer.me.invalidate(); showToast(t("settings_updated_successfully"), "success"); diff --git a/apps/web/modules/settings/my-account/general-view.tsx b/apps/web/modules/settings/my-account/general-view.tsx index d78efca1d3..a3063cd2b8 100644 --- a/apps/web/modules/settings/my-account/general-view.tsx +++ b/apps/web/modules/settings/my-account/general-view.tsx @@ -103,7 +103,7 @@ const GeneralView = ({ localeProp, user, travelSchedules, revalidatePage }: Gene const [isUpdateBtnLoading, setIsUpdateBtnLoading] = useState(false); const [isTZScheduleOpen, setIsTZScheduleOpen] = useState(false); - const mutation = trpc.viewer.updateProfile.useMutation({ + const mutation = trpc.viewer.me.updateProfile.useMutation({ onSuccess: async (res) => { await utils.viewer.me.invalidate(); reset(getValues()); diff --git a/apps/web/modules/settings/my-account/profile-view.tsx b/apps/web/modules/settings/my-account/profile-view.tsx index 671e50cfa6..04b8153545 100644 --- a/apps/web/modules/settings/my-account/profile-view.tsx +++ b/apps/web/modules/settings/my-account/profile-view.tsx @@ -94,7 +94,7 @@ const ProfileView = () => { const { update } = useSession(); const { data: user, isPending } = trpc.viewer.me.get.useQuery({ includePasswordAdded: true }); - const updateProfileMutation = trpc.viewer.updateProfile.useMutation({ + const updateProfileMutation = trpc.viewer.me.updateProfile.useMutation({ onSuccess: async (res) => { await update(res); utils.viewer.me.invalidate(); diff --git a/apps/web/modules/settings/security/impersonation-view.tsx b/apps/web/modules/settings/security/impersonation-view.tsx index c852975777..d8035aac5e 100644 --- a/apps/web/modules/settings/security/impersonation-view.tsx +++ b/apps/web/modules/settings/security/impersonation-view.tsx @@ -26,7 +26,7 @@ const ProfileImpersonationView = ({ user }: { user: RouterOutputs["viewer"]["me" user?.disableImpersonation ); - const mutation = trpc.viewer.updateProfile.useMutation({ + const mutation = trpc.viewer.me.updateProfile.useMutation({ onSuccess: () => { showToast(t("profile_updated_successfully"), "success"); }, diff --git a/apps/web/modules/settings/security/password-view.tsx b/apps/web/modules/settings/security/password-view.tsx index eadeb9abea..f9ef34f0a8 100644 --- a/apps/web/modules/settings/security/password-view.tsx +++ b/apps/web/modules/settings/security/password-view.tsx @@ -11,19 +11,14 @@ import { IdentityProvider } from "@calcom/prisma/enums"; import { userMetadata as userMetadataSchema } from "@calcom/prisma/zod-utils"; import type { RouterOutputs } from "@calcom/trpc/react"; import { trpc } from "@calcom/trpc/react"; +import classNames from "@calcom/ui/classNames"; +import { Alert } from "@calcom/ui/components/alert"; +import { Button } from "@calcom/ui/components/button"; import { Form } from "@calcom/ui/components/form"; import { PasswordField } from "@calcom/ui/components/form"; import { Select } from "@calcom/ui/components/form"; import { SettingsToggle } from "@calcom/ui/components/form"; -import { Alert } from "@calcom/ui/components/alert"; -import { Button } from "@calcom/ui/components/button"; -import classNames from "@calcom/ui/classNames"; -import { - SkeletonButton, - SkeletonContainer, - SkeletonText, - SkeletonAvatar, -} from "@calcom/ui/components/skeleton"; +import { SkeletonButton, SkeletonContainer, SkeletonText } from "@calcom/ui/components/skeleton"; import { showToast } from "@calcom/ui/components/toast"; type ChangePasswordSessionFormValues = { @@ -63,7 +58,7 @@ const PasswordView = ({ user }: PasswordViewProps) => { const [sessionTimeout, setSessionTimeout] = useState(initialSessionTimeout); - const sessionMutation = trpc.viewer.updateProfile.useMutation({ + const sessionMutation = trpc.viewer.me.updateProfile.useMutation({ onSuccess: (data) => { showToast(t("session_timeout_changed"), "success"); formMethods.reset(formMethods.getValues()); diff --git a/apps/web/pages/api/trpc/calVideo/[trpc].ts b/apps/web/pages/api/trpc/calVideo/[trpc].ts new file mode 100644 index 0000000000..d649be8576 --- /dev/null +++ b/apps/web/pages/api/trpc/calVideo/[trpc].ts @@ -0,0 +1,4 @@ +import { createNextApiHandler } from "@calcom/trpc/server/createNextApiHandler"; +import { calVideoRouter } from "@calcom/trpc/server/routers/viewer/calVideo/_router"; + +export default createNextApiHandler(calVideoRouter); diff --git a/apps/web/pages/api/trpc/calendars/[trpc].ts b/apps/web/pages/api/trpc/calendars/[trpc].ts new file mode 100644 index 0000000000..503ee7299a --- /dev/null +++ b/apps/web/pages/api/trpc/calendars/[trpc].ts @@ -0,0 +1,4 @@ +import { createNextApiHandler } from "@calcom/trpc/server/createNextApiHandler"; +import { calendarsRouter } from "@calcom/trpc/server/routers/viewer/calendars/_router"; + +export default createNextApiHandler(calendarsRouter); diff --git a/apps/web/pages/api/trpc/credentials/[trpc].ts b/apps/web/pages/api/trpc/credentials/[trpc].ts new file mode 100644 index 0000000000..f52f8004e4 --- /dev/null +++ b/apps/web/pages/api/trpc/credentials/[trpc].ts @@ -0,0 +1,4 @@ +import { createNextApiHandler } from "@calcom/trpc/server/createNextApiHandler"; +import { credentialsRouter } from "@calcom/trpc/server/routers/viewer/credentials/_router"; + +export default createNextApiHandler(credentialsRouter); diff --git a/apps/web/playwright/change-username.e2e.ts b/apps/web/playwright/change-username.e2e.ts index 2225746195..0a77bab307 100644 --- a/apps/web/playwright/change-username.e2e.ts +++ b/apps/web/playwright/change-username.e2e.ts @@ -41,7 +41,7 @@ test.describe("Change username on settings", () => { await usernameInput.fill(item.username); await page.click("[data-testid=update-username-btn]"); - await submitAndWaitForResponse(page, "/api/trpc/viewer/updateProfile?batch=1", { + await submitAndWaitForResponse(page, "/api/trpc/me/updateProfile?batch=1", { action: () => page.click("[data-testid=save-username]"), }); diff --git a/apps/web/playwright/locale.e2e.ts b/apps/web/playwright/locale.e2e.ts index 552e7b380e..96429b18b9 100644 --- a/apps/web/playwright/locale.e2e.ts +++ b/apps/web/playwright/locale.e2e.ts @@ -448,7 +448,7 @@ test.describe("authorized user sees changed translations (de->ar)", async () => await page.locator(".bg-default > div > div:nth-child(2)").first().click(); await page.getByTestId("select-option-ar").click(); - await submitAndWaitForResponse(page, "/api/trpc/viewer/updateProfile?batch=1", { + await submitAndWaitForResponse(page, "/api/trpc/me/updateProfile?batch=1", { action: () => page.click("[data-testid=general-submit-button]"), }); @@ -508,7 +508,7 @@ test.describe("authorized user sees changed translations (de->pt-BR) [locale1]", await page.locator(".bg-default > div > div:nth-child(2)").first().click(); await page.locator("text=Português (Brasil)").click(); - await submitAndWaitForResponse(page, "/api/trpc/viewer/updateProfile?batch=1", { + await submitAndWaitForResponse(page, "/api/trpc/me/updateProfile?batch=1", { action: () => page.click("[data-testid=general-submit-button]"), }); diff --git a/apps/web/playwright/profile.e2e.ts b/apps/web/playwright/profile.e2e.ts index deefbe58eb..d231ff6726 100644 --- a/apps/web/playwright/profile.e2e.ts +++ b/apps/web/playwright/profile.e2e.ts @@ -62,7 +62,7 @@ test.describe("Update Profile", () => { await page.getByTestId("password").fill(user?.username ?? "Nameless User"); - await submitAndWaitForResponse(page, "/api/trpc/viewer/updateProfile?batch=1", { + await submitAndWaitForResponse(page, "/api/trpc/me/updateProfile?batch=1", { action: () => page.getByTestId("profile-update-email-submit-button").click(), }); diff --git a/packages/app-store/hitpay/pages/setup/index.tsx b/packages/app-store/hitpay/pages/setup/index.tsx index 04bb7d08e6..35f5a57b2d 100644 --- a/packages/app-store/hitpay/pages/setup/index.tsx +++ b/packages/app-store/hitpay/pages/setup/index.tsx @@ -117,7 +117,7 @@ function HitPaySetupPage(props: IHitPaySetupProps) { }, }); - const deleteMutation = trpc.viewer.deleteCredential.useMutation({ + const deleteMutation = trpc.viewer.credentials.delete.useMutation({ onSuccess: () => { router.push("/apps/hitpay"); }, diff --git a/packages/features/apps/components/DisconnectIntegration.tsx b/packages/features/apps/components/DisconnectIntegration.tsx index e4d7611c35..090f42a817 100644 --- a/packages/features/apps/components/DisconnectIntegration.tsx +++ b/packages/features/apps/components/DisconnectIntegration.tsx @@ -23,7 +23,7 @@ export default function DisconnectIntegration(props: { const [modalOpen, setModalOpen] = useState(false); const utils = trpc.useUtils(); - const mutation = trpc.viewer.deleteCredential.useMutation({ + const mutation = trpc.viewer.credentials.delete.useMutation({ onSuccess: () => { showToast(t("app_removed_successfully"), "success"); setModalOpen(false); @@ -34,7 +34,7 @@ export default function DisconnectIntegration(props: { setModalOpen(false); }, async onSettled() { - await utils.viewer.connectedCalendars.invalidate(); + await utils.viewer.calendars.connectedCalendars.invalidate(); await utils.viewer.apps.integrations.invalidate(); }, }); diff --git a/packages/features/bookings/Booker/components/hooks/useCalendars.ts b/packages/features/bookings/Booker/components/hooks/useCalendars.ts index ea11e498fc..d17a79c81e 100644 --- a/packages/features/bookings/Booker/components/hooks/useCalendars.ts +++ b/packages/features/bookings/Booker/components/hooks/useCalendars.ts @@ -60,7 +60,7 @@ export const useCalendars = ({ hasSession }: UseCalendarsProps) => { [isError] ); - const { data, isPending } = trpc.viewer.connectedCalendars.useQuery(undefined, { + const { data, isPending } = trpc.viewer.calendars.connectedCalendars.useQuery(undefined, { enabled: !!calendarSettingsOverlay || Boolean(searchParams?.get("overlayCalendar")), }); diff --git a/packages/features/calendars/CalendarSwitch.tsx b/packages/features/calendars/CalendarSwitch.tsx index 8871f77f0d..462feda8cc 100644 --- a/packages/features/calendars/CalendarSwitch.tsx +++ b/packages/features/calendars/CalendarSwitch.tsx @@ -83,7 +83,7 @@ const CalendarSwitch = (props: ICalendarSwitchProps) => { }, async onSettled() { await utils.viewer.apps.integrations.invalidate(); - await utils.viewer.connectedCalendars.invalidate(); + await utils.viewer.calendars.connectedCalendars.invalidate(); }, onError() { setCheckedInternal(false); diff --git a/packages/features/calendars/DestinationCalendarSelector.tsx b/packages/features/calendars/DestinationCalendarSelector.tsx index 31829004f7..2e860ba85d 100644 --- a/packages/features/calendars/DestinationCalendarSelector.tsx +++ b/packages/features/calendars/DestinationCalendarSelector.tsx @@ -18,7 +18,7 @@ interface Props { value: string | undefined; maxWidth?: number; hideAdvancedText?: boolean; - calendarsQueryData?: RouterOutputs["viewer"]["connectedCalendars"]; + calendarsQueryData?: RouterOutputs["viewer"]["calendars"]["connectedCalendars"]; customClassNames?: SelectClassNames; } diff --git a/packages/features/ee/video/ViewRecordingsDialog.tsx b/packages/features/ee/video/ViewRecordingsDialog.tsx index 27a7c9f55e..1aaae63eb1 100644 --- a/packages/features/ee/video/ViewRecordingsDialog.tsx +++ b/packages/features/ee/video/ViewRecordingsDialog.tsx @@ -58,7 +58,7 @@ const getTimeSpan = ({ startTime, endTime, locale, hour12 }: GetTimeSpanProps) = const useRecordingDownload = () => { const [recordingId, setRecordingId] = useState(""); - const { isFetching, data } = trpc.viewer.getDownloadLinkOfCalVideoRecordings.useQuery( + const { isFetching, data } = trpc.viewer.calVideo.getDownloadLinkOfCalVideoRecordings.useQuery( { recordingId, }, @@ -100,7 +100,7 @@ const ViewRecordingsList = ({ roomName, hasTeamPlan }: { roomName: string; hasTe const { setRecordingId, isFetching, recordingId } = useRecordingDownload(); const router = useRouter(); - const { data: recordings } = trpc.viewer.getCalVideoRecordings.useQuery( + const { data: recordings } = trpc.viewer.calVideo.getCalVideoRecordings.useQuery( { roomName }, { suspense: true, diff --git a/packages/features/ee/workflows/components/WorkflowListPage.tsx b/packages/features/ee/workflows/components/WorkflowListPage.tsx index fda7ed7765..942dde245c 100644 --- a/packages/features/ee/workflows/components/WorkflowListPage.tsx +++ b/packages/features/ee/workflows/components/WorkflowListPage.tsx @@ -66,7 +66,7 @@ export default function WorkflowListPage({ workflows }: Props) { const [parent] = useAutoAnimate(); const router = useRouter(); - const mutation = trpc.viewer.workflowOrder.useMutation({ + const mutation = trpc.viewer.workflows.workflowOrder.useMutation({ onError: async (err) => { console.error(err.message); await utils.viewer.workflows.filteredList.cancel(); diff --git a/packages/features/eventtypes/components/tabs/advanced/EventAdvancedTab.tsx b/packages/features/eventtypes/components/tabs/advanced/EventAdvancedTab.tsx index 92a7c055bf..2259a9f72c 100644 --- a/packages/features/eventtypes/components/tabs/advanced/EventAdvancedTab.tsx +++ b/packages/features/eventtypes/components/tabs/advanced/EventAdvancedTab.tsx @@ -115,7 +115,7 @@ export type EventAdvancedBaseProps = Pick { }; // update timezone in db - const mutation = trpc.viewer.updateProfile.useMutation({ + const mutation = trpc.viewer.me.updateProfile.useMutation({ onSuccess: onMutationSuccess, onError: onMutationError, }); diff --git a/packages/features/troubleshooter/components/CalendarToggleContainer.tsx b/packages/features/troubleshooter/components/CalendarToggleContainer.tsx index 76855d320f..0c7230363c 100644 --- a/packages/features/troubleshooter/components/CalendarToggleContainer.tsx +++ b/packages/features/troubleshooter/components/CalendarToggleContainer.tsx @@ -81,7 +81,7 @@ function EmptyCalendarToggleItem() { export function CalendarToggleContainer() { const { t } = useLocale(); - const { data, isLoading } = trpc.viewer.connectedCalendars.useQuery(); + const { data, isLoading } = trpc.viewer.calendars.connectedCalendars.useQuery(); const hasConnectedCalendars = data && data?.connectedCalendars.length > 0; diff --git a/packages/platform/atoms/connect/conferencing-apps/ConferencingAppsViewWebWrapper.tsx b/packages/platform/atoms/connect/conferencing-apps/ConferencingAppsViewWebWrapper.tsx index fae56cb19d..f3016d9aab 100644 --- a/packages/platform/atoms/connect/conferencing-apps/ConferencingAppsViewWebWrapper.tsx +++ b/packages/platform/atoms/connect/conferencing-apps/ConferencingAppsViewWebWrapper.tsx @@ -183,7 +183,7 @@ export const ConferencingAppsViewWebWrapper = ({ const { t } = useLocale(); const utils = trpc.useUtils(); - const deleteCredentialMutation = trpc.viewer.deleteCredential.useMutation(); + const deleteCredentialMutation = trpc.viewer.credentials.delete.useMutation(); const handleRemoveApp = ({ credentialId, teamId, callback }: RemoveAppParams) => { deleteCredentialMutation.mutate( @@ -193,7 +193,7 @@ export const ConferencingAppsViewWebWrapper = ({ showToast(t("app_removed_successfully"), "success"); callback(); utils.viewer.apps.integrations.invalidate(); - utils.viewer.connectedCalendars.invalidate(); + utils.viewer.calendars.connectedCalendars.invalidate(); }, onError: () => { showToast(t("error_removing_app"), "error"); diff --git a/packages/platform/atoms/destination-calendar/wrappers/DestinationCalendarSettingsWebWrapper.tsx b/packages/platform/atoms/destination-calendar/wrappers/DestinationCalendarSettingsWebWrapper.tsx index 42e2adc15f..94b9be7897 100644 --- a/packages/platform/atoms/destination-calendar/wrappers/DestinationCalendarSettingsWebWrapper.tsx +++ b/packages/platform/atoms/destination-calendar/wrappers/DestinationCalendarSettingsWebWrapper.tsx @@ -4,11 +4,11 @@ import { AtomsWrapper } from "../../src/components/atoms-wrapper"; import { DestinationCalendarSettings } from "../DestinationCalendar"; export const DestinationCalendarSettingsWebWrapper = () => { - const calendars = trpc.viewer.connectedCalendars.useQuery(); + const calendars = trpc.viewer.calendars.connectedCalendars.useQuery(); const utils = trpc.useUtils(); - const mutation = trpc.viewer.setDestinationCalendar.useMutation({ + const mutation = trpc.viewer.calendars.setDestinationCalendar.useMutation({ onSuccess: () => { - utils.viewer.connectedCalendars.invalidate(); + utils.viewer.calendars.connectedCalendars.invalidate(); }, }); diff --git a/packages/platform/atoms/event-types/wrappers/EventAdvancedWebWrapper.tsx b/packages/platform/atoms/event-types/wrappers/EventAdvancedWebWrapper.tsx index e5d0fe4ee1..699d3c7e18 100644 --- a/packages/platform/atoms/event-types/wrappers/EventAdvancedWebWrapper.tsx +++ b/packages/platform/atoms/event-types/wrappers/EventAdvancedWebWrapper.tsx @@ -3,7 +3,7 @@ import { EventAdvancedTab } from "@calcom/features/eventtypes/components/tabs/ad import { trpc } from "@calcom/trpc/react"; const EventAdvancedWebWrapper = ({ ...props }: EventAdvancedBaseProps) => { - const connectedCalendarsQuery = trpc.viewer.connectedCalendars.useQuery(); + const connectedCalendarsQuery = trpc.viewer.calendars.connectedCalendars.useQuery(); return ( unknown | Promise; @@ -152,7 +152,7 @@ export const SelectedCalendarsSettingsWebWrapper = (props: SelectedCalendarsSett eventTypeId = null, } = props; - const query = trpc.viewer.connectedCalendars.useQuery( + const query = trpc.viewer.calendars.connectedCalendars.useQuery( { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion eventTypeId: scope === SelectedCalendarSettingsScope.EventType ? eventTypeId! : null, diff --git a/packages/trpc/react/shared.ts b/packages/trpc/react/shared.ts index 68f60bc33d..a5b974423c 100644 --- a/packages/trpc/react/shared.ts +++ b/packages/trpc/react/shared.ts @@ -9,6 +9,9 @@ export const ENDPOINTS = [ "availability", "appBasecamp3", "bookings", + "calendars", + "calVideo", + "credentials", "deploymentSetup", "dsync", "eventTypes", diff --git a/packages/trpc/server/routers/loggedInViewer/_router.tsx b/packages/trpc/server/routers/loggedInViewer/_router.tsx index 0d8b6ec1c7..76a497723d 100644 --- a/packages/trpc/server/routers/loggedInViewer/_router.tsx +++ b/packages/trpc/server/routers/loggedInViewer/_router.tsx @@ -3,38 +3,22 @@ import { importHandler, router } from "../../trpc"; import { ZAddNotificationsSubscriptionInputSchema } from "./addNotificationsSubscription.schema"; import { ZAddSecondaryEmailInputSchema } from "./addSecondaryEmail.schema"; import { ZConnectAndJoinInputSchema } from "./connectAndJoin.schema"; -import { ZConnectedCalendarsInputSchema } from "./connectedCalendars.schema"; -import { ZDeleteCredentialInputSchema } from "./deleteCredential.schema"; import { ZEventTypeOrderInputSchema } from "./eventTypeOrder.schema"; -import { ZGetCalVideoRecordingsInputSchema } from "./getCalVideoRecordings.schema"; -import { ZGetDownloadLinkOfCalVideoRecordingsInputSchema } from "./getDownloadLinkOfCalVideoRecordings.schema"; -import { ZLocationOptionsInputSchema } from "./locationOptions.schema"; import { ZNoShowInputSchema } from "./markNoShow.schema"; import { teamsAndUserProfilesQuery } from "./procedures/teamsAndUserProfilesQuery"; import { ZRemoveNotificationsSubscriptionInputSchema } from "./removeNotificationsSubscription.schema"; import { ZRoutingFormOrderInputSchema } from "./routingFormOrder.schema"; -import { ZSetDestinationCalendarInputSchema } from "./setDestinationCalendar.schema"; import { ZSubmitFeedbackInputSchema } from "./submitFeedback.schema"; -import { ZUpdateProfileInputSchema } from "./updateProfile.schema"; -import { ZWorkflowOrderInputSchema } from "./workflowOrder.schema"; const NAMESPACE = "loggedInViewer"; const namespaced = (s: string) => `${NAMESPACE}.${s}`; type AppsRouterHandlerCache = { - connectedCalendars?: typeof import("./connectedCalendars.handler").connectedCalendarsHandler; - setDestinationCalendar?: typeof import("./setDestinationCalendar.handler").setDestinationCalendarHandler; stripeCustomer?: typeof import("./stripeCustomer.handler").stripeCustomerHandler; - updateProfile?: typeof import("./updateProfile.handler").updateProfileHandler; eventTypeOrder?: typeof import("./eventTypeOrder.handler").eventTypeOrderHandler; routingFormOrder?: typeof import("./routingFormOrder.handler").routingFormOrderHandler; - workflowOrder?: typeof import("./workflowOrder.handler").workflowOrderHandler; submitFeedback?: typeof import("./submitFeedback.handler").submitFeedbackHandler; - locationOptions?: typeof import("./locationOptions.handler").locationOptionsHandler; - deleteCredential?: typeof import("./deleteCredential.handler").deleteCredentialHandler; - getCalVideoRecordings?: typeof import("./getCalVideoRecordings.handler").getCalVideoRecordingsHandler; - getDownloadLinkOfCalVideoRecordings?: typeof import("./getDownloadLinkOfCalVideoRecordings.handler").getDownloadLinkOfCalVideoRecordingsHandler; teamsAndUserProfilesQuery?: typeof import("./teamsAndUserProfilesQuery.handler").teamsAndUserProfilesQuery; connectAndJoin?: typeof import("./connectAndJoin.handler").Handler; addSecondaryEmail?: typeof import("./addSecondaryEmail.handler").addSecondaryEmailHandler; @@ -46,38 +30,6 @@ type AppsRouterHandlerCache = { const UNSTABLE_HANDLER_CACHE: AppsRouterHandlerCache = {}; export const loggedInViewerRouter = router({ - connectedCalendars: authedProcedure.input(ZConnectedCalendarsInputSchema).query(async ({ ctx, input }) => { - if (!UNSTABLE_HANDLER_CACHE.connectedCalendars) { - UNSTABLE_HANDLER_CACHE.connectedCalendars = ( - await import("./connectedCalendars.handler") - ).connectedCalendarsHandler; - } - - // Unreachable code but required for type safety - if (!UNSTABLE_HANDLER_CACHE.connectedCalendars) { - throw new Error("Failed to load handler"); - } - - return UNSTABLE_HANDLER_CACHE.connectedCalendars({ ctx, input }); - }), - - setDestinationCalendar: authedProcedure - .input(ZSetDestinationCalendarInputSchema) - .mutation(async ({ ctx, input }) => { - if (!UNSTABLE_HANDLER_CACHE.setDestinationCalendar) { - UNSTABLE_HANDLER_CACHE.setDestinationCalendar = ( - await import("./setDestinationCalendar.handler") - ).setDestinationCalendarHandler; - } - - // Unreachable code but required for type safety - if (!UNSTABLE_HANDLER_CACHE.setDestinationCalendar) { - throw new Error("Failed to load handler"); - } - - return UNSTABLE_HANDLER_CACHE.setDestinationCalendar({ ctx, input }); - }), - stripeCustomer: authedProcedure.query(async ({ ctx }) => { if (!UNSTABLE_HANDLER_CACHE.stripeCustomer) { UNSTABLE_HANDLER_CACHE.stripeCustomer = ( @@ -93,19 +45,6 @@ export const loggedInViewerRouter = router({ return UNSTABLE_HANDLER_CACHE.stripeCustomer({ ctx }); }), - updateProfile: authedProcedure.input(ZUpdateProfileInputSchema).mutation(async ({ ctx, input }) => { - if (!UNSTABLE_HANDLER_CACHE.updateProfile) { - UNSTABLE_HANDLER_CACHE.updateProfile = (await import("./updateProfile.handler")).updateProfileHandler; - } - - // Unreachable code but required for type safety - if (!UNSTABLE_HANDLER_CACHE.updateProfile) { - throw new Error("Failed to load handler"); - } - - return UNSTABLE_HANDLER_CACHE.updateProfile({ ctx, input }); - }), - unlinkConnectedAccount: authedProcedure.mutation(async (opts) => { const handler = await importHandler( namespaced("unlinkConnectedAccount"), @@ -144,19 +83,6 @@ export const loggedInViewerRouter = router({ return UNSTABLE_HANDLER_CACHE.routingFormOrder({ ctx, input }); }), - workflowOrder: authedProcedure.input(ZWorkflowOrderInputSchema).mutation(async ({ ctx, input }) => { - if (!UNSTABLE_HANDLER_CACHE.workflowOrder) { - UNSTABLE_HANDLER_CACHE.workflowOrder = (await import("./workflowOrder.handler")).workflowOrderHandler; - } - - // Unreachable code but required for type safety - if (!UNSTABLE_HANDLER_CACHE.workflowOrder) { - throw new Error("Failed to load handler"); - } - - return UNSTABLE_HANDLER_CACHE.workflowOrder({ ctx, input }); - }), - //Comment for PR: eventTypePosition is not used anywhere submitFeedback: authedProcedure.input(ZSubmitFeedbackInputSchema).mutation(async ({ ctx, input }) => { if (!UNSTABLE_HANDLER_CACHE.submitFeedback) { @@ -172,70 +98,6 @@ export const loggedInViewerRouter = router({ return UNSTABLE_HANDLER_CACHE.submitFeedback({ ctx, input }); }), - - locationOptions: authedProcedure.input(ZLocationOptionsInputSchema).query(async ({ ctx, input }) => { - if (!UNSTABLE_HANDLER_CACHE.locationOptions) { - UNSTABLE_HANDLER_CACHE.locationOptions = ( - await import("./locationOptions.handler") - ).locationOptionsHandler; - } - - // Unreachable code but required for type safety - if (!UNSTABLE_HANDLER_CACHE.locationOptions) { - throw new Error("Failed to load handler"); - } - - return UNSTABLE_HANDLER_CACHE.locationOptions({ ctx, input }); - }), - - deleteCredential: authedProcedure.input(ZDeleteCredentialInputSchema).mutation(async ({ ctx, input }) => { - if (!UNSTABLE_HANDLER_CACHE.deleteCredential) { - UNSTABLE_HANDLER_CACHE.deleteCredential = ( - await import("./deleteCredential.handler") - ).deleteCredentialHandler; - } - - // Unreachable code but required for type safety - if (!UNSTABLE_HANDLER_CACHE.deleteCredential) { - throw new Error("Failed to load handler"); - } - - return UNSTABLE_HANDLER_CACHE.deleteCredential({ ctx, input }); - }), - - getCalVideoRecordings: authedProcedure - .input(ZGetCalVideoRecordingsInputSchema) - .query(async ({ ctx, input }) => { - if (!UNSTABLE_HANDLER_CACHE.getCalVideoRecordings) { - UNSTABLE_HANDLER_CACHE.getCalVideoRecordings = ( - await import("./getCalVideoRecordings.handler") - ).getCalVideoRecordingsHandler; - } - - // Unreachable code but required for type safety - if (!UNSTABLE_HANDLER_CACHE.getCalVideoRecordings) { - throw new Error("Failed to load handler"); - } - - return UNSTABLE_HANDLER_CACHE.getCalVideoRecordings({ ctx, input }); - }), - - getDownloadLinkOfCalVideoRecordings: authedProcedure - .input(ZGetDownloadLinkOfCalVideoRecordingsInputSchema) - .query(async ({ ctx, input }) => { - if (!UNSTABLE_HANDLER_CACHE.getDownloadLinkOfCalVideoRecordings) { - UNSTABLE_HANDLER_CACHE.getDownloadLinkOfCalVideoRecordings = ( - await import("./getDownloadLinkOfCalVideoRecordings.handler") - ).getDownloadLinkOfCalVideoRecordingsHandler; - } - - // Unreachable code but required for type safety - if (!UNSTABLE_HANDLER_CACHE.getDownloadLinkOfCalVideoRecordings) { - throw new Error("Failed to load handler"); - } - - return UNSTABLE_HANDLER_CACHE.getDownloadLinkOfCalVideoRecordings({ ctx, input }); - }), teamsAndUserProfilesQuery, connectAndJoin: authedProcedure.input(ZConnectAndJoinInputSchema).mutation(async ({ ctx, input }) => { if (!UNSTABLE_HANDLER_CACHE.connectAndJoin) { diff --git a/packages/trpc/server/routers/viewer/_router.tsx b/packages/trpc/server/routers/viewer/_router.tsx index d025cb98bf..b9a1b4a7ad 100644 --- a/packages/trpc/server/routers/viewer/_router.tsx +++ b/packages/trpc/server/routers/viewer/_router.tsx @@ -15,6 +15,9 @@ import { attributesRouter } from "./attributes/_router"; import { authRouter } from "./auth/_router"; import { availabilityRouter } from "./availability/_router"; import { bookingsRouter } from "./bookings/_router"; +import { calVideoRouter } from "./calVideo/_router"; +import { calendarsRouter } from "./calendars/_router"; +import { credentialsRouter } from "./credentials/_router"; import { delegationCredentialRouter } from "./delegationCredential/_router"; import { deploymentSetupRouter } from "./deploymentSetup/_router"; import { dsyncRouter } from "./dsync/_router"; @@ -46,6 +49,9 @@ export const viewerRouter = mergeRouters( auth: authRouter, deploymentSetup: deploymentSetupRouter, bookings: bookingsRouter, + calendars: calendarsRouter, + calVideo: calVideoRouter, + credentials: credentialsRouter, eventTypes: eventTypesRouter, availability: availabilityRouter, teams: viewerTeamsRouter, diff --git a/packages/trpc/server/routers/viewer/apps/_router.tsx b/packages/trpc/server/routers/viewer/apps/_router.tsx index 6bf4c86edf..80a3584a56 100644 --- a/packages/trpc/server/routers/viewer/apps/_router.tsx +++ b/packages/trpc/server/routers/viewer/apps/_router.tsx @@ -5,6 +5,7 @@ import { ZAppCredentialsByTypeInputSchema } from "./appCredentialsByType.schema" import { checkGlobalKeysSchema } from "./checkGlobalKeys.schema"; import { ZIntegrationsInputSchema } from "./integrations.schema"; import { ZListLocalInputSchema } from "./listLocal.schema"; +import { ZLocationOptionsInputSchema } from "./locationOptions.schema"; import { ZQueryForDependenciesInputSchema } from "./queryForDependencies.schema"; import { ZSaveKeysInputSchema } from "./saveKeys.schema"; import { ZSetDefaultConferencingAppSchema } from "./setDefaultConferencingApp.schema"; @@ -18,6 +19,7 @@ type AppsRouterHandlerCache = { getUsersDefaultConferencingApp?: typeof import("./getUsersDefaultConferencingApp.handler").getUsersDefaultConferencingAppHandler; integrations?: typeof import("./integrations.handler").integrationsHandler; listLocal?: typeof import("./listLocal.handler").listLocalHandler; + locationOptions?: typeof import("./locationOptions.handler").locationOptionsHandler; toggle?: typeof import("./toggle.handler").toggleHandler; saveKeys?: typeof import("./saveKeys.handler").saveKeysHandler; checkForGCal?: typeof import("./checkForGCal.handler").checkForGCalHandler; @@ -86,6 +88,7 @@ export const appsRouter = router({ return UNSTABLE_HANDLER_CACHE.integrations({ ctx, input }); }), + listLocal: authedAdminProcedure.input(ZListLocalInputSchema).query(async ({ ctx, input }) => { if (!UNSTABLE_HANDLER_CACHE.listLocal) { UNSTABLE_HANDLER_CACHE.listLocal = await import("./listLocal.handler").then( @@ -104,6 +107,21 @@ export const appsRouter = router({ }); }), + locationOptions: authedProcedure.input(ZLocationOptionsInputSchema).query(async ({ ctx, input }) => { + if (!UNSTABLE_HANDLER_CACHE.locationOptions) { + UNSTABLE_HANDLER_CACHE.locationOptions = ( + await import("./locationOptions.handler") + ).locationOptionsHandler; + } + + // Unreachable code but required for type safety + if (!UNSTABLE_HANDLER_CACHE.locationOptions) { + throw new Error("Failed to load handler"); + } + + return UNSTABLE_HANDLER_CACHE.locationOptions({ ctx, input }); + }), + toggle: authedAdminProcedure.input(ZToggleInputSchema).mutation(async ({ ctx, input }) => { if (!UNSTABLE_HANDLER_CACHE.toggle) { UNSTABLE_HANDLER_CACHE.toggle = await import("./toggle.handler").then((mod) => mod.toggleHandler); diff --git a/packages/trpc/server/routers/loggedInViewer/locationOptions.handler.ts b/packages/trpc/server/routers/viewer/apps/locationOptions.handler.ts similarity index 100% rename from packages/trpc/server/routers/loggedInViewer/locationOptions.handler.ts rename to packages/trpc/server/routers/viewer/apps/locationOptions.handler.ts diff --git a/packages/trpc/server/routers/loggedInViewer/locationOptions.schema.ts b/packages/trpc/server/routers/viewer/apps/locationOptions.schema.ts similarity index 100% rename from packages/trpc/server/routers/loggedInViewer/locationOptions.schema.ts rename to packages/trpc/server/routers/viewer/apps/locationOptions.schema.ts diff --git a/packages/trpc/server/routers/viewer/calVideo/_router.tsx b/packages/trpc/server/routers/viewer/calVideo/_router.tsx new file mode 100644 index 0000000000..7c878f72ca --- /dev/null +++ b/packages/trpc/server/routers/viewer/calVideo/_router.tsx @@ -0,0 +1,47 @@ +import authedProcedure from "../../../procedures/authedProcedure"; +import { router } from "../../../trpc"; +import { ZGetCalVideoRecordingsInputSchema } from "./getCalVideoRecordings.schema"; +import { ZGetDownloadLinkOfCalVideoRecordingsInputSchema } from "./getDownloadLinkOfCalVideoRecordings.schema"; + +type CalVideoRouterHandlerCache = { + getCalVideoRecordings?: typeof import("./getCalVideoRecordings.handler").getCalVideoRecordingsHandler; + getDownloadLinkOfCalVideoRecordings?: typeof import("./getDownloadLinkOfCalVideoRecordings.handler").getDownloadLinkOfCalVideoRecordingsHandler; +}; + +const UNSTABLE_HANDLER_CACHE: CalVideoRouterHandlerCache = {}; + +export const calVideoRouter = router({ + getCalVideoRecordings: authedProcedure + .input(ZGetCalVideoRecordingsInputSchema) + .query(async ({ ctx, input }) => { + if (!UNSTABLE_HANDLER_CACHE.getCalVideoRecordings) { + UNSTABLE_HANDLER_CACHE.getCalVideoRecordings = ( + await import("./getCalVideoRecordings.handler") + ).getCalVideoRecordingsHandler; + } + + // Unreachable code but required for type safety + if (!UNSTABLE_HANDLER_CACHE.getCalVideoRecordings) { + throw new Error("Failed to load handler"); + } + + return UNSTABLE_HANDLER_CACHE.getCalVideoRecordings({ ctx, input }); + }), + + getDownloadLinkOfCalVideoRecordings: authedProcedure + .input(ZGetDownloadLinkOfCalVideoRecordingsInputSchema) + .query(async ({ ctx, input }) => { + if (!UNSTABLE_HANDLER_CACHE.getDownloadLinkOfCalVideoRecordings) { + UNSTABLE_HANDLER_CACHE.getDownloadLinkOfCalVideoRecordings = ( + await import("./getDownloadLinkOfCalVideoRecordings.handler") + ).getDownloadLinkOfCalVideoRecordingsHandler; + } + + // Unreachable code but required for type safety + if (!UNSTABLE_HANDLER_CACHE.getDownloadLinkOfCalVideoRecordings) { + throw new Error("Failed to load handler"); + } + + return UNSTABLE_HANDLER_CACHE.getDownloadLinkOfCalVideoRecordings({ ctx, input }); + }), +}); diff --git a/packages/trpc/server/routers/loggedInViewer/getCalVideoRecordings.handler.ts b/packages/trpc/server/routers/viewer/calVideo/getCalVideoRecordings.handler.ts similarity index 100% rename from packages/trpc/server/routers/loggedInViewer/getCalVideoRecordings.handler.ts rename to packages/trpc/server/routers/viewer/calVideo/getCalVideoRecordings.handler.ts diff --git a/packages/trpc/server/routers/loggedInViewer/getCalVideoRecordings.schema.ts b/packages/trpc/server/routers/viewer/calVideo/getCalVideoRecordings.schema.ts similarity index 100% rename from packages/trpc/server/routers/loggedInViewer/getCalVideoRecordings.schema.ts rename to packages/trpc/server/routers/viewer/calVideo/getCalVideoRecordings.schema.ts diff --git a/packages/trpc/server/routers/loggedInViewer/getDownloadLinkOfCalVideoRecordings.handler.ts b/packages/trpc/server/routers/viewer/calVideo/getDownloadLinkOfCalVideoRecordings.handler.ts similarity index 94% rename from packages/trpc/server/routers/loggedInViewer/getDownloadLinkOfCalVideoRecordings.handler.ts rename to packages/trpc/server/routers/viewer/calVideo/getDownloadLinkOfCalVideoRecordings.handler.ts index 99e6e67dd0..b836c9899b 100644 --- a/packages/trpc/server/routers/loggedInViewer/getDownloadLinkOfCalVideoRecordings.handler.ts +++ b/packages/trpc/server/routers/viewer/calVideo/getDownloadLinkOfCalVideoRecordings.handler.ts @@ -4,7 +4,7 @@ import { getDownloadLinkOfCalVideoByRecordingId } from "@calcom/lib/videoClient" import { TRPCError } from "@trpc/server"; -import type { WithSession } from "../../createContext"; +import type { WithSession } from "../../../createContext"; import type { TGetDownloadLinkOfCalVideoRecordingsInputSchema } from "./getDownloadLinkOfCalVideoRecordings.schema"; type GetDownloadLinkOfCalVideoRecordingsHandlerOptions = { diff --git a/packages/trpc/server/routers/loggedInViewer/getDownloadLinkOfCalVideoRecordings.schema.ts b/packages/trpc/server/routers/viewer/calVideo/getDownloadLinkOfCalVideoRecordings.schema.ts similarity index 100% rename from packages/trpc/server/routers/loggedInViewer/getDownloadLinkOfCalVideoRecordings.schema.ts rename to packages/trpc/server/routers/viewer/calVideo/getDownloadLinkOfCalVideoRecordings.schema.ts diff --git a/packages/trpc/server/routers/viewer/calendars/_router.tsx b/packages/trpc/server/routers/viewer/calendars/_router.tsx new file mode 100644 index 0000000000..1bda4d227d --- /dev/null +++ b/packages/trpc/server/routers/viewer/calendars/_router.tsx @@ -0,0 +1,45 @@ +import authedProcedure from "../../../procedures/authedProcedure"; +import { router } from "../../../trpc"; +import { ZConnectedCalendarsInputSchema } from "./connectedCalendars.schema"; +import { ZSetDestinationCalendarInputSchema } from "./setDestinationCalendar.schema"; + +type CalendarsRouterHandlerCache = { + connectedCalendars?: typeof import("./connectedCalendars.handler").connectedCalendarsHandler; + setDestinationCalendar?: typeof import("./setDestinationCalendar.handler").setDestinationCalendarHandler; +}; + +const UNSTABLE_HANDLER_CACHE: CalendarsRouterHandlerCache = {}; + +export const calendarsRouter = router({ + connectedCalendars: authedProcedure.input(ZConnectedCalendarsInputSchema).query(async ({ ctx, input }) => { + if (!UNSTABLE_HANDLER_CACHE.connectedCalendars) { + UNSTABLE_HANDLER_CACHE.connectedCalendars = ( + await import("./connectedCalendars.handler") + ).connectedCalendarsHandler; + } + + // Unreachable code but required for type safety + if (!UNSTABLE_HANDLER_CACHE.connectedCalendars) { + throw new Error("Failed to load handler"); + } + + return UNSTABLE_HANDLER_CACHE.connectedCalendars({ ctx, input }); + }), + + setDestinationCalendar: authedProcedure + .input(ZSetDestinationCalendarInputSchema) + .mutation(async ({ ctx, input }) => { + if (!UNSTABLE_HANDLER_CACHE.setDestinationCalendar) { + UNSTABLE_HANDLER_CACHE.setDestinationCalendar = ( + await import("./setDestinationCalendar.handler") + ).setDestinationCalendarHandler; + } + + // Unreachable code but required for type safety + if (!UNSTABLE_HANDLER_CACHE.setDestinationCalendar) { + throw new Error("Failed to load handler"); + } + + return UNSTABLE_HANDLER_CACHE.setDestinationCalendar({ ctx, input }); + }), +}); diff --git a/packages/trpc/server/routers/loggedInViewer/connectedCalendars.handler.ts b/packages/trpc/server/routers/viewer/calendars/connectedCalendars.handler.ts similarity index 100% rename from packages/trpc/server/routers/loggedInViewer/connectedCalendars.handler.ts rename to packages/trpc/server/routers/viewer/calendars/connectedCalendars.handler.ts diff --git a/packages/trpc/server/routers/loggedInViewer/connectedCalendars.schema.ts b/packages/trpc/server/routers/viewer/calendars/connectedCalendars.schema.ts similarity index 100% rename from packages/trpc/server/routers/loggedInViewer/connectedCalendars.schema.ts rename to packages/trpc/server/routers/viewer/calendars/connectedCalendars.schema.ts diff --git a/packages/trpc/server/routers/loggedInViewer/setDestinationCalendar.handler.test.ts b/packages/trpc/server/routers/viewer/calendars/setDestinationCalendar.handler.test.ts similarity index 97% rename from packages/trpc/server/routers/loggedInViewer/setDestinationCalendar.handler.test.ts rename to packages/trpc/server/routers/viewer/calendars/setDestinationCalendar.handler.test.ts index b208e429a9..3ee56c837d 100644 --- a/packages/trpc/server/routers/loggedInViewer/setDestinationCalendar.handler.test.ts +++ b/packages/trpc/server/routers/viewer/calendars/setDestinationCalendar.handler.test.ts @@ -1,4 +1,4 @@ -import prisma from "../../../../../tests/libs/__mocks__/prisma"; +import prisma from "../../../../../../tests/libs/__mocks__/prisma"; import { createBookingScenario, @@ -17,7 +17,7 @@ import { SchedulingType, MembershipRole } from "@calcom/prisma/enums"; import { TRPCError } from "@trpc/server"; -import type { TrpcSessionUser } from "../../types"; +import type { TrpcSessionUser } from "../../../types"; import { setDestinationCalendarHandler } from "./setDestinationCalendar.handler"; vi.mock("@calcom/lib/CalendarManager", () => ({ diff --git a/packages/trpc/server/routers/loggedInViewer/setDestinationCalendar.handler.ts b/packages/trpc/server/routers/viewer/calendars/setDestinationCalendar.handler.ts similarity index 100% rename from packages/trpc/server/routers/loggedInViewer/setDestinationCalendar.handler.ts rename to packages/trpc/server/routers/viewer/calendars/setDestinationCalendar.handler.ts diff --git a/packages/trpc/server/routers/loggedInViewer/setDestinationCalendar.schema.ts b/packages/trpc/server/routers/viewer/calendars/setDestinationCalendar.schema.ts similarity index 100% rename from packages/trpc/server/routers/loggedInViewer/setDestinationCalendar.schema.ts rename to packages/trpc/server/routers/viewer/calendars/setDestinationCalendar.schema.ts diff --git a/packages/trpc/server/routers/viewer/credentials/_router.tsx b/packages/trpc/server/routers/viewer/credentials/_router.tsx new file mode 100644 index 0000000000..fdec9215b1 --- /dev/null +++ b/packages/trpc/server/routers/viewer/credentials/_router.tsx @@ -0,0 +1,26 @@ +import authedProcedure from "../../../procedures/authedProcedure"; +import { router } from "../../../trpc"; +import { ZDeleteCredentialInputSchema } from "./deleteCredential.schema"; + +type CredentialsRouterHandlerCache = { + deleteCredential?: typeof import("./deleteCredential.handler").deleteCredentialHandler; +}; + +const UNSTABLE_HANDLER_CACHE: CredentialsRouterHandlerCache = {}; + +export const credentialsRouter = router({ + delete: authedProcedure.input(ZDeleteCredentialInputSchema).mutation(async ({ ctx, input }) => { + if (!UNSTABLE_HANDLER_CACHE.deleteCredential) { + UNSTABLE_HANDLER_CACHE.deleteCredential = ( + await import("./deleteCredential.handler") + ).deleteCredentialHandler; + } + + // Unreachable code but required for type safety + if (!UNSTABLE_HANDLER_CACHE.deleteCredential) { + throw new Error("Failed to load handler"); + } + + return UNSTABLE_HANDLER_CACHE.deleteCredential({ ctx, input }); + }), +}); diff --git a/packages/trpc/server/routers/loggedInViewer/deleteCredential.handler.ts b/packages/trpc/server/routers/viewer/credentials/deleteCredential.handler.ts similarity index 100% rename from packages/trpc/server/routers/loggedInViewer/deleteCredential.handler.ts rename to packages/trpc/server/routers/viewer/credentials/deleteCredential.handler.ts diff --git a/packages/trpc/server/routers/loggedInViewer/deleteCredential.schema.ts b/packages/trpc/server/routers/viewer/credentials/deleteCredential.schema.ts similarity index 100% rename from packages/trpc/server/routers/loggedInViewer/deleteCredential.schema.ts rename to packages/trpc/server/routers/viewer/credentials/deleteCredential.schema.ts diff --git a/packages/trpc/server/routers/viewer/eventTypes/duplicate.handler.ts b/packages/trpc/server/routers/viewer/eventTypes/duplicate.handler.ts index 452ef4b145..6645292e8b 100644 --- a/packages/trpc/server/routers/viewer/eventTypes/duplicate.handler.ts +++ b/packages/trpc/server/routers/viewer/eventTypes/duplicate.handler.ts @@ -7,7 +7,7 @@ import { prisma } from "@calcom/prisma"; import { TRPCError } from "@trpc/server"; import type { TrpcSessionUser } from "../../../types"; -import { setDestinationCalendarHandler } from "../../loggedInViewer/setDestinationCalendar.handler"; +import { setDestinationCalendarHandler } from "../../viewer/calendars/setDestinationCalendar.handler"; import type { TDuplicateInputSchema } from "./duplicate.schema"; type DuplicateOptions = { diff --git a/packages/trpc/server/routers/viewer/eventTypes/update.handler.ts b/packages/trpc/server/routers/viewer/eventTypes/update.handler.ts index 5522994d7f..1355a7db4b 100644 --- a/packages/trpc/server/routers/viewer/eventTypes/update.handler.ts +++ b/packages/trpc/server/routers/viewer/eventTypes/update.handler.ts @@ -20,7 +20,7 @@ import { eventTypeAppMetadataOptionalSchema } from "@calcom/prisma/zod-utils"; import { TRPCError } from "@trpc/server"; import type { TrpcSessionUser } from "../../../types"; -import { setDestinationCalendarHandler } from "../../loggedInViewer/setDestinationCalendar.handler"; +import { setDestinationCalendarHandler } from "../../viewer/calendars/setDestinationCalendar.handler"; import type { TUpdateInputSchema } from "./update.schema"; import { ensureUniqueBookingFields, diff --git a/packages/trpc/server/routers/viewer/me/_router.tsx b/packages/trpc/server/routers/viewer/me/_router.tsx index ca1b057a48..15e3cb9678 100644 --- a/packages/trpc/server/routers/viewer/me/_router.tsx +++ b/packages/trpc/server/routers/viewer/me/_router.tsx @@ -2,6 +2,7 @@ import authedProcedure from "../../../procedures/authedProcedure"; import { router } from "../../../trpc"; import { ZDeleteMeInputSchema } from "./deleteMe.schema"; import { get } from "./procedures/get"; +import { ZUpdateProfileInputSchema } from "./updateProfile.schema"; export const meRouter = router({ bookingUnconfirmedCount: authedProcedure.query(async ({ ctx }) => { @@ -33,4 +34,8 @@ export const meRouter = router({ const handler = (await import("./shouldVerifyEmail.handler")).shouldVerifyEmailHandler; return handler({ ctx }); }), + updateProfile: authedProcedure.input(ZUpdateProfileInputSchema).mutation(async ({ ctx, input }) => { + const handler = (await import("./updateProfile.handler")).updateProfileHandler; + return handler({ ctx, input }); + }), }); diff --git a/packages/trpc/server/routers/loggedInViewer/updateProfile.handler.ts b/packages/trpc/server/routers/viewer/me/updateProfile.handler.ts similarity index 99% rename from packages/trpc/server/routers/loggedInViewer/updateProfile.handler.ts rename to packages/trpc/server/routers/viewer/me/updateProfile.handler.ts index f80ebfa9b0..9a3609773b 100644 --- a/packages/trpc/server/routers/loggedInViewer/updateProfile.handler.ts +++ b/packages/trpc/server/routers/viewer/me/updateProfile.handler.ts @@ -23,7 +23,7 @@ import type { TrpcSessionUser } from "@calcom/trpc/server/types"; import { TRPCError } from "@trpc/server"; -import { getDefaultScheduleId } from "../viewer/availability/util"; +import { getDefaultScheduleId } from "../availability/util"; import { updateUserMetadataAllowedKeys, type TUpdateProfileInputSchema } from "./updateProfile.schema"; const log = logger.getSubLogger({ prefix: ["updateProfile"] }); diff --git a/packages/trpc/server/routers/loggedInViewer/updateProfile.schema.ts b/packages/trpc/server/routers/viewer/me/updateProfile.schema.ts similarity index 100% rename from packages/trpc/server/routers/loggedInViewer/updateProfile.schema.ts rename to packages/trpc/server/routers/viewer/me/updateProfile.schema.ts diff --git a/packages/trpc/server/routers/viewer/workflows/_router.tsx b/packages/trpc/server/routers/viewer/workflows/_router.tsx index 962fce28cc..b7fa8c1373 100644 --- a/packages/trpc/server/routers/viewer/workflows/_router.tsx +++ b/packages/trpc/server/routers/viewer/workflows/_router.tsx @@ -13,6 +13,7 @@ import { ZSendVerificationCodeInputSchema } from "./sendVerificationCode.schema" import { ZUpdateInputSchema } from "./update.schema"; import { ZVerifyEmailCodeInputSchema } from "./verifyEmailCode.schema"; import { ZVerifyPhoneNumberInputSchema } from "./verifyPhoneNumber.schema"; +import { ZWorkflowOrderInputSchema } from "./workflowOrder.schema"; type WorkflowsRouterHandlerCache = { list?: typeof import("./list.handler").listHandler; @@ -29,6 +30,7 @@ type WorkflowsRouterHandlerCache = { getVerifiedEmails?: typeof import("./getVerifiedEmails.handler").getVerifiedEmailsHandler; verifyEmailCode?: typeof import("./verifyEmailCode.handler").verifyEmailCodeHandler; getAllActiveWorkflows?: typeof import("./getAllActiveWorkflows.handler").getAllActiveWorkflowsHandler; + workflowOrder?: typeof import("./workflowOrder.handler").workflowOrderHandler; }; const UNSTABLE_HANDLER_CACHE: WorkflowsRouterHandlerCache = {}; @@ -276,4 +278,16 @@ export const workflowsRouter = router({ input, }); }), + workflowOrder: authedProcedure.input(ZWorkflowOrderInputSchema).mutation(async ({ ctx, input }) => { + if (!UNSTABLE_HANDLER_CACHE.workflowOrder) { + UNSTABLE_HANDLER_CACHE.workflowOrder = (await import("./workflowOrder.handler")).workflowOrderHandler; + } + + // Unreachable code but required for type safety + if (!UNSTABLE_HANDLER_CACHE.workflowOrder) { + throw new Error("Failed to load handler"); + } + + return UNSTABLE_HANDLER_CACHE.workflowOrder({ ctx, input }); + }), }); diff --git a/packages/trpc/server/routers/loggedInViewer/workflowOrder.handler.ts b/packages/trpc/server/routers/viewer/workflows/workflowOrder.handler.ts similarity index 100% rename from packages/trpc/server/routers/loggedInViewer/workflowOrder.handler.ts rename to packages/trpc/server/routers/viewer/workflows/workflowOrder.handler.ts diff --git a/packages/trpc/server/routers/loggedInViewer/workflowOrder.schema.ts b/packages/trpc/server/routers/viewer/workflows/workflowOrder.schema.ts similarity index 100% rename from packages/trpc/server/routers/loggedInViewer/workflowOrder.schema.ts rename to packages/trpc/server/routers/viewer/workflows/workflowOrder.schema.ts