diff --git a/apps/web/pages/api/trpc/features/[trpc].ts b/apps/web/pages/api/trpc/features/[trpc].ts index 7ef7a09c1e..865145feb0 100644 --- a/apps/web/pages/api/trpc/features/[trpc].ts +++ b/apps/web/pages/api/trpc/features/[trpc].ts @@ -1,4 +1,4 @@ -import { featureFlagRouter } from "@calcom/features/flags/server/router"; import { createNextApiHandler } from "@calcom/trpc/server/createNextApiHandler"; +import { featureFlagRouter } from "@calcom/trpc/server/routers/features/_router"; export default createNextApiHandler(featureFlagRouter, true, "features"); diff --git a/packages/features/bookings/Booker/hooks/useAvailableTimeSlots.ts b/packages/features/bookings/Booker/hooks/useAvailableTimeSlots.ts index 4df8f84562..37c2a9544a 100644 --- a/packages/features/bookings/Booker/hooks/useAvailableTimeSlots.ts +++ b/packages/features/bookings/Booker/hooks/useAvailableTimeSlots.ts @@ -2,7 +2,26 @@ import { useMemo } from "react"; import dayjs from "@calcom/dayjs"; import type { CalendarAvailableTimeslots } from "@calcom/features/calendars/weeklyview/types/state"; -import type { IGetAvailableSlots } from "@calcom/trpc/server/routers/viewer/slots/util"; +import type { IFromUser, IToUser } from "@calcom/features/availability/lib/getUserAvailability"; + +export interface IGetAvailableSlots { + slots: Record< + string, + { + time: string; + attendees?: number | undefined; + bookingUid?: string | undefined; + away?: boolean | undefined; + fromUser?: IFromUser | undefined; + toUser?: IToUser | undefined; + reason?: string | undefined; + emoji?: string | undefined; + showNotePublicly?: boolean | undefined; + }[] + >; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + troubleshooter?: any; +} interface UseAvailableTimeSlotsProps { eventDuration: number; @@ -27,4 +46,4 @@ export const useAvailableTimeSlots = ({ schedule, eventDuration }: UseAvailableT return availableTimeslots; }, [schedule, eventDuration]); -}; \ No newline at end of file +}; diff --git a/packages/features/di/modules/OrgMembershipLookup.ts b/packages/features/di/modules/OrgMembershipLookup.ts index 2396c110df..8792bfb4ea 100644 --- a/packages/features/di/modules/OrgMembershipLookup.ts +++ b/packages/features/di/modules/OrgMembershipLookup.ts @@ -1,9 +1,16 @@ import { ProfileRepository } from "@calcom/features/profile/repositories/ProfileRepository"; -import type { OrgMembershipLookup } from "@calcom/trpc/server/routers/viewer/slots/util"; import { createModule, type Module } from "../di"; import { DI_TOKENS } from "../tokens"; +/** + * Minimal capability interface for looking up a user's organization membership. + * Used as a fallback when org context can't be determined from request or eventType. + */ +export interface OrgMembershipLookup { + findFirstOrganizationIdForUser(args: { userId: number }): Promise; +} + /** * Adapter that wraps ProfileRepository's static method to satisfy the OrgMembershipLookup interface. * This lives in the composition root where implementation details are wired together. diff --git a/packages/features/ee/integration-attribute-sync/schemas/zod.ts b/packages/features/ee/integration-attribute-sync/schemas/zod.ts index 609692cb47..2741d5eb55 100644 --- a/packages/features/ee/integration-attribute-sync/schemas/zod.ts +++ b/packages/features/ee/integration-attribute-sync/schemas/zod.ts @@ -4,6 +4,7 @@ import { ConditionIdentifierEnum, ConditionOperatorEnum, type IAttributeSyncRule, + type ICreateAttributeSyncInput, type IFieldMapping, type IFieldMappingFormState, type IFieldMappingWithOptionalId, @@ -80,3 +81,13 @@ export const syncFormDataSchema: z.ZodType = z.object({ rule: attributeSyncRuleSchema, syncFieldMappings: z.array(z.union([fieldMappingSchema, newFieldMappingSchema])), }); + +export const createAttributeSyncSchema: z.ZodType = z.object({ + name: z.string().min(1, "Name is required"), + credentialId: z.number(), + rule: attributeSyncRuleSchema, + syncFieldMappings: z.array(newFieldMappingSchema), + enabled: z.boolean(), +}); + +export type ZCreateAttributeSyncSchema = ICreateAttributeSyncInput; diff --git a/packages/features/ee/integration-attribute-sync/services/IntegrationAttributeSyncService.ts b/packages/features/ee/integration-attribute-sync/services/IntegrationAttributeSyncService.ts index 9643d3fac9..3b111c9c68 100644 --- a/packages/features/ee/integration-attribute-sync/services/IntegrationAttributeSyncService.ts +++ b/packages/features/ee/integration-attribute-sync/services/IntegrationAttributeSyncService.ts @@ -1,6 +1,5 @@ import type { CredentialRepository } from "@calcom/features/credentials/repositories/CredentialRepository"; import type { TeamRepository } from "@calcom/features/ee/teams/repositories/TeamRepository"; -import type { ZCreateAttributeSyncSchema } from "@calcom/trpc/server/routers/viewer/attribute-sync/createAttributeSync.schema"; import { enabledAppSlugs } from "../constants"; import { @@ -11,7 +10,7 @@ import { AttributeSyncIntegrations, ConditionIdentifierEnum, } from "../repositories/IIntegrationAttributeSyncRepository"; -import { attributeSyncRuleSchema } from "../schemas/zod"; +import { attributeSyncRuleSchema, type ZCreateAttributeSyncSchema } from "../schemas/zod"; export class DuplicateAttributeWithinSyncError extends Error { constructor(public attributeId: string) { diff --git a/packages/features/ee/organizations/lib/service/AdminOrganizationUpdateService.ts b/packages/features/ee/organizations/lib/service/AdminOrganizationUpdateService.ts index 90dcd0084f..6161f99012 100644 --- a/packages/features/ee/organizations/lib/service/AdminOrganizationUpdateService.ts +++ b/packages/features/ee/organizations/lib/service/AdminOrganizationUpdateService.ts @@ -5,8 +5,17 @@ import { renameDomain } from "@calcom/lib/domainManager/organization"; import { getMetadataHelpers } from "@calcom/lib/getMetadataHelpers"; import { HttpError } from "@calcom/lib/http-error"; import type { Prisma, PrismaClient } from "@calcom/prisma/client"; -import { teamMetadataStrictSchema } from "@calcom/prisma/zod-utils"; -import type { TAdminUpdate } from "@calcom/trpc/server/routers/viewer/organizations/adminUpdate.schema"; +import { orgSettingsSchema, teamMetadataStrictSchema } from "@calcom/prisma/zod-utils"; +import { z } from "zod"; + +export const ZAdminUpdate = z.object({ + id: z.number(), + name: z.string().optional(), + slug: z.string().nullish(), + organizationSettings: orgSettingsSchema.unwrap().optional(), +}); + +export type TAdminUpdate = z.infer; type AdminOrganizationUpdateServiceDeps = { prismaClient: PrismaClient; diff --git a/packages/features/ee/workflows/lib/types.ts b/packages/features/ee/workflows/lib/types.ts index 3f11b3e3b8..dcf375c07e 100644 --- a/packages/features/ee/workflows/lib/types.ts +++ b/packages/features/ee/workflows/lib/types.ts @@ -13,6 +13,8 @@ import type { TimeUnit, WorkflowTemplates, WorkflowTriggerEvents } from "@calcom import { WorkflowActions } from "@calcom/prisma/enums"; import type { CalEventResponses, RecurringEvent } from "@calcom/types/Calendar"; import type { MultiSelectCheckboxesOptionType as Option } from "@calcom/ui/components/form"; +import { z } from "zod"; +import { TIME_UNIT, WORKFLOW_ACTIONS, WORKFLOW_TEMPLATES, WORKFLOW_TRIGGER_EVENTS } from "./constants"; export type Workflow = { id: number; @@ -39,6 +41,31 @@ export type WorkflowStep = { verifiedAt?: Date | null; }; +export const ZWorkflow: z.ZodType = z.object({ + id: z.number(), + name: z.string(), + trigger: z.enum(WORKFLOW_TRIGGER_EVENTS), + time: z.number().nullable(), + timeUnit: z.enum(TIME_UNIT).nullable(), + userId: z.number().nullable(), + teamId: z.number().nullable(), + steps: z + .object({ + id: z.number(), + action: z.enum(WORKFLOW_ACTIONS), + sendTo: z.string().nullable(), + template: z.enum(WORKFLOW_TEMPLATES), + reminderBody: z.string().nullable(), + emailSubject: z.string().nullable(), + numberRequired: z.boolean().nullable(), + sender: z.string().nullable(), + includeCalendarEvent: z.boolean(), + numberVerificationPending: z.boolean(), + verifiedAt: z.coerce.date().nullable().optional(), + }) + .array(), +}); + export type FormSubmissionData = { responses: FORM_SUBMITTED_WEBHOOK_RESPONSES; routedEventTypeId: number | null; diff --git a/packages/features/ee/workflows/repositories/WorkflowRepository.ts b/packages/features/ee/workflows/repositories/WorkflowRepository.ts index 2f2e36ec4a..5f01ae12c2 100644 --- a/packages/features/ee/workflows/repositories/WorkflowRepository.ts +++ b/packages/features/ee/workflows/repositories/WorkflowRepository.ts @@ -3,6 +3,7 @@ import { deleteScheduledAIPhoneCall } from "@calcom/ee/workflows/lib/reminders/a import { deleteScheduledEmailReminder } from "@calcom/ee/workflows/lib/reminders/emailReminderManager"; import { deleteScheduledSMSReminder } from "@calcom/ee/workflows/lib/reminders/smsReminderManager"; import type { WorkflowStep, WorkflowListType as WorkflowType } from "@calcom/ee/workflows/lib/types"; +import type { filterQuerySchemaStrict } from "@calcom/features/filters/lib/getTeamsFiltersFromQuery"; import { hasFilter } from "@calcom/features/filters/lib/hasFilter"; import { PermissionCheckService } from "@calcom/features/pbac/services/permission-check.service"; import { HttpError } from "@calcom/lib/http-error"; @@ -16,15 +17,29 @@ import { WorkflowMethods, type WorkflowTriggerEvents, } from "@calcom/prisma/enums"; -import type { TFilteredListInputSchema } from "@calcom/trpc/server/routers/viewer/workflows/filteredList.schema"; -import type { TGetVerifiedEmailsInputSchema } from "@calcom/trpc/server/routers/viewer/workflows/getVerifiedEmails.schema"; -import type { TGetVerifiedNumbersInputSchema } from "@calcom/trpc/server/routers/viewer/workflows/getVerifiedNumbers.schema"; import { z } from "zod"; export const ZGetInputSchema = z.object({ id: z.number(), }); +export type TGetInputSchema = z.infer; + +export type TFilteredListInputSchema = + | { + filters?: z.infer; + } + | null + | undefined; + +export type TGetVerifiedEmailsInputSchema = { + teamId?: number; +}; + +export type TGetVerifiedNumbersInputSchema = { + teamId?: number; +}; + const excludeFormTriggersWhereClause = { trigger: { not: { @@ -40,8 +55,6 @@ const getWorkflowType = (trigger: WorkflowTriggerEvents): PrismaWorkflowType => return PrismaWorkflowType.EVENT_TYPE; }; -export type TGetInputSchema = z.infer; - const deleteScheduledWhatsappReminder = deleteScheduledSMSReminder; const includedFields = { diff --git a/packages/features/eventtypes/repositories/EventRepository.ts b/packages/features/eventtypes/repositories/EventRepository.ts index e1d2fa2223..8e6183f147 100644 --- a/packages/features/eventtypes/repositories/EventRepository.ts +++ b/packages/features/eventtypes/repositories/EventRepository.ts @@ -1,9 +1,16 @@ import { getPublicEvent } from "@calcom/features/eventtypes/lib/getPublicEvent"; import prisma from "@calcom/prisma"; -import type { TEventInputSchema } from "@calcom/trpc/server/routers/publicViewer/event.schema"; + +export type GetPublicEventInput = { + username: string; + eventSlug: string; + isTeamEvent?: boolean; + org: string | null; + fromRedirectOfNonOrgLink: boolean; +}; export class EventRepository { - static async getPublicEvent(input: TEventInputSchema, userId?: number) { + static async getPublicEvent(input: GetPublicEventInput, userId?: number) { const event = await getPublicEvent( input.username, input.eventSlug, diff --git a/packages/features/handleMarkNoShow.ts b/packages/features/handleMarkNoShow.ts index 8d480f1bb4..e4d39846bc 100644 --- a/packages/features/handleMarkNoShow.ts +++ b/packages/features/handleMarkNoShow.ts @@ -26,8 +26,34 @@ import { getTimeFormatStringFromUserTimeFormat } from "@calcom/lib/timeFormat"; import { prisma } from "@calcom/prisma"; import { WebhookTriggerEvents, WorkflowTriggerEvents } from "@calcom/prisma/enums"; import { bookingMetadataSchema, type PlatformClientParams } from "@calcom/prisma/zod-utils"; -import type { TNoShowInputSchema } from "@calcom/trpc/server/routers/loggedInViewer/markNoShow.schema"; import type { TFunction } from "i18next"; +import { z } from "zod"; + +export const ZNoShowInputSchema = z + .object({ + bookingUid: z.string(), + attendees: z + .array( + z.object({ + email: z.string(), + noShow: z.boolean(), + }) + ) + .optional(), + noShowHost: z.boolean().optional(), + }) + .refine( + (data) => { + return (data.attendees && data.attendees.length > 0) || data.noShowHost !== undefined; + }, + { + message: "At least one of 'attendees' or 'noShowHost' must be provided", + path: ["attendees", "noShowHost"], + } + ); + +export type TNoShowInputSchema = z.infer; + import handleSendingAttendeeNoShowDataToApps from "./noShow/handleSendingAttendeeNoShowDataToApps"; export type NoShowAttendees = { email: string; noShow: boolean }[]; diff --git a/packages/features/schedules/services/ScheduleService.ts b/packages/features/schedules/services/ScheduleService.ts index 3fdff326cb..328a9c5dac 100644 --- a/packages/features/schedules/services/ScheduleService.ts +++ b/packages/features/schedules/services/ScheduleService.ts @@ -1,13 +1,40 @@ import { getAvailabilityFromSchedule } from "@calcom/lib/availability"; +import { timeZoneSchema } from "@calcom/lib/dayjs/timeZone.schema"; import { hasEditPermissionForUserID } from "@calcom/lib/hasEditPermissionForUser"; import { HttpError } from "@calcom/lib/http-error"; import { transformScheduleToAvailabilityForAtom } from "@calcom/lib/schedules/transformers/for-atom"; import type { PrismaClient } from "@calcom/prisma"; -import type { TUpdateInputSchema } from "@calcom/trpc/server/routers/viewer/availability/schedule/update.schema"; import type { TrpcSessionUser } from "@calcom/trpc/server/types"; - +import { z } from "zod"; import { ScheduleRepository } from "../repositories/ScheduleRepository"; +export const ZUpdateInputSchema = z.object({ + scheduleId: z.number(), + timeZone: timeZoneSchema.optional(), + name: z.string().trim().min(1, "Schedule name cannot be empty").optional(), + isDefault: z.boolean().optional(), + schedule: z + .array( + z.array( + z.object({ + start: z.date(), + end: z.date(), + }) + ) + ) + .optional(), + dateOverrides: z + .array( + z.object({ + start: z.date(), + end: z.date(), + }) + ) + .optional(), +}); + +export type TUpdateInputSchema = z.infer; + interface IUpdateScheduleOptions { input: TUpdateInputSchema; user: Pick, "id" | "defaultScheduleId" | "timeZone">; diff --git a/packages/features/tasker/tasks/triggerFormSubmittedNoEvent/triggerFormSubmittedNoEventWorkflow.ts b/packages/features/tasker/tasks/triggerFormSubmittedNoEvent/triggerFormSubmittedNoEventWorkflow.ts index 01b79d9f3c..50ff86e28a 100644 --- a/packages/features/tasker/tasks/triggerFormSubmittedNoEvent/triggerFormSubmittedNoEventWorkflow.ts +++ b/packages/features/tasker/tasks/triggerFormSubmittedNoEvent/triggerFormSubmittedNoEventWorkflow.ts @@ -3,9 +3,9 @@ import { z } from "zod"; import type { FORM_SUBMITTED_WEBHOOK_RESPONSES } from "@calcom/app-store/routing-forms/lib/formSubmissionUtils"; import { scheduleWorkflowReminders } from "@calcom/ee/workflows/lib/reminders/reminderScheduler"; import type { Workflow } from "@calcom/ee/workflows/lib/types"; +import { ZWorkflow } from "@calcom/ee/workflows/lib/types"; import { CreditService } from "@calcom/features/ee/billing/credit-service"; import logger from "@calcom/lib/logger"; -import { ZWorkflow } from "@calcom/trpc/server/routers/viewer/workflows/getAllActiveWorkflows.schema"; import { shouldTriggerFormSubmittedNoEvent } from "./formSubmissionValidation"; diff --git a/packages/platform/libraries/index.ts b/packages/platform/libraries/index.ts index 9f9497b78c..19737aeea2 100644 --- a/packages/platform/libraries/index.ts +++ b/packages/platform/libraries/index.ts @@ -130,4 +130,4 @@ export { verifyCodeChallenge } from "@calcom/lib/pkce"; export { validateUrlForSSRFSync } from "@calcom/lib/ssrfProtection"; export { checkEmailVerificationRequired } from "@calcom/trpc/server/routers/publicViewer/checkIfUserEmailVerificationRequired.handler"; export { verifyCode as verifyCodeAuthenticated } from "@calcom/trpc/server/routers/viewer/organizations/verifyCode.handler"; -export type { OrgMembershipLookup } from "@calcom/trpc/server/routers/viewer/slots/util"; +export type { OrgMembershipLookup } from "@calcom/features/di/modules/OrgMembershipLookup"; diff --git a/packages/features/flags/server/router.ts b/packages/trpc/server/routers/features/_router.ts similarity index 95% rename from packages/features/flags/server/router.ts rename to packages/trpc/server/routers/features/_router.ts index 0922806285..86027a654d 100644 --- a/packages/features/flags/server/router.ts +++ b/packages/trpc/server/routers/features/_router.ts @@ -3,7 +3,7 @@ import type { AppFlags } from "@calcom/features/flags/config"; import publicProcedure from "@calcom/trpc/server/procedures/publicProcedure"; import { router } from "@calcom/trpc/server/trpc"; import { z } from "zod"; -import { map } from "./procedures/map"; +import { map } from "./map"; export const featureFlagRouter = router({ list: publicProcedure.query(async () => { diff --git a/packages/features/flags/server/procedures/map.ts b/packages/trpc/server/routers/features/map.ts similarity index 100% rename from packages/features/flags/server/procedures/map.ts rename to packages/trpc/server/routers/features/map.ts diff --git a/packages/trpc/server/routers/loggedInViewer/markNoShow.schema.ts b/packages/trpc/server/routers/loggedInViewer/markNoShow.schema.ts index 72f98cc559..ca4169e835 100644 --- a/packages/trpc/server/routers/loggedInViewer/markNoShow.schema.ts +++ b/packages/trpc/server/routers/loggedInViewer/markNoShow.schema.ts @@ -1,26 +1 @@ -import { z } from "zod"; - -export const ZNoShowInputSchema = z - .object({ - bookingUid: z.string(), - attendees: z - .array( - z.object({ - email: z.string(), - noShow: z.boolean(), - }) - ) - .optional(), - noShowHost: z.boolean().optional(), - }) - .refine( - (data) => { - return (data.attendees && data.attendees.length > 0) || data.noShowHost !== undefined; - }, - { - message: "At least one of 'attendees' or 'noShowHost' must be provided", - path: ["attendees", "noShowHost"], - } - ); - -export type TNoShowInputSchema = z.infer; +export { type TNoShowInputSchema, ZNoShowInputSchema } from "@calcom/features/handleMarkNoShow"; diff --git a/packages/trpc/server/routers/publicViewer/event.schema.ts b/packages/trpc/server/routers/publicViewer/event.schema.ts index 90c23debf4..c97cd28be8 100644 --- a/packages/trpc/server/routers/publicViewer/event.schema.ts +++ b/packages/trpc/server/routers/publicViewer/event.schema.ts @@ -1,4 +1,5 @@ import z from "zod"; +import type { GetPublicEventInput } from "@calcom/features/eventtypes/repositories/EventRepository"; // Note: fromRedirectOfNonOrgLink has .default(false), so input has it optional but output has it required @@ -10,13 +11,7 @@ export type TEventInputSchemaInput = { fromRedirectOfNonOrgLink?: boolean; }; -export type TEventInputSchema = { - username: string; - eventSlug: string; - isTeamEvent?: boolean; - org: string | null; - fromRedirectOfNonOrgLink: boolean; -}; +export type TEventInputSchema = GetPublicEventInput; export const ZEventInputSchema: z.ZodType = z.object({ username: z.string(), diff --git a/packages/trpc/server/routers/viewer/_router.tsx b/packages/trpc/server/routers/viewer/_router.tsx index bae47c4ac7..9a86fdecfc 100644 --- a/packages/trpc/server/routers/viewer/_router.tsx +++ b/packages/trpc/server/routers/viewer/_router.tsx @@ -1,6 +1,6 @@ -import { featureFlagRouter } from "@calcom/features/flags/server/router"; import { router } from "../../trpc"; import app_RoutingForms from "../apps/routing-forms/_router"; +import { featureFlagRouter } from "../features/_router"; import { loggedInViewerRouter } from "../loggedInViewer/_router"; import { publicViewerRouter } from "../publicViewer/_router"; import { timezonesRouter } from "../publicViewer/timezones/_router"; diff --git a/packages/trpc/server/routers/viewer/attribute-sync/createAttributeSync.schema.ts b/packages/trpc/server/routers/viewer/attribute-sync/createAttributeSync.schema.ts index aba607967a..aa9baf8a76 100644 --- a/packages/trpc/server/routers/viewer/attribute-sync/createAttributeSync.schema.ts +++ b/packages/trpc/server/routers/viewer/attribute-sync/createAttributeSync.schema.ts @@ -1,17 +1,4 @@ -import { z } from "zod"; - -import type { ICreateAttributeSyncInput } from "@calcom/features/ee/integration-attribute-sync/repositories/IIntegrationAttributeSyncRepository"; -import { - attributeSyncRuleSchema, - newFieldMappingSchema, +export { + createAttributeSyncSchema, + type ZCreateAttributeSyncSchema, } from "@calcom/features/ee/integration-attribute-sync/schemas/zod"; - -export const createAttributeSyncSchema: z.ZodType = z.object({ - name: z.string().min(1, "Name is required"), - credentialId: z.number(), - rule: attributeSyncRuleSchema, - syncFieldMappings: z.array(newFieldMappingSchema), - enabled: z.boolean(), -}); - -export type ZCreateAttributeSyncSchema = ICreateAttributeSyncInput; diff --git a/packages/trpc/server/routers/viewer/availability/schedule/update.schema.ts b/packages/trpc/server/routers/viewer/availability/schedule/update.schema.ts index c7fdb20603..f821ce0c7c 100644 --- a/packages/trpc/server/routers/viewer/availability/schedule/update.schema.ts +++ b/packages/trpc/server/routers/viewer/availability/schedule/update.schema.ts @@ -1,30 +1,4 @@ -import { z } from "zod"; - -import { timeZoneSchema } from "@calcom/lib/dayjs/timeZone.schema"; - -export const ZUpdateInputSchema = z.object({ - scheduleId: z.number(), - timeZone: timeZoneSchema.optional(), - name: z.string().trim().min(1, "Schedule name cannot be empty").optional(), - isDefault: z.boolean().optional(), - schedule: z - .array( - z.array( - z.object({ - start: z.date(), - end: z.date(), - }) - ) - ) - .optional(), - dateOverrides: z - .array( - z.object({ - start: z.date(), - end: z.date(), - }) - ) - .optional(), -}); - -export type TUpdateInputSchema = z.infer; +export { + type TUpdateInputSchema, + ZUpdateInputSchema, +} from "@calcom/features/schedules/services/ScheduleService"; diff --git a/packages/trpc/server/routers/viewer/organizations/adminUpdate.schema.ts b/packages/trpc/server/routers/viewer/organizations/adminUpdate.schema.ts index d8b2704f02..96676a8d8f 100644 --- a/packages/trpc/server/routers/viewer/organizations/adminUpdate.schema.ts +++ b/packages/trpc/server/routers/viewer/organizations/adminUpdate.schema.ts @@ -1,12 +1,4 @@ -import { z } from "zod"; - -import { orgSettingsSchema } from "@calcom/prisma/zod-utils"; - -export const ZAdminUpdate = z.object({ - id: z.number(), - name: z.string().optional(), - slug: z.string().nullish(), - organizationSettings: orgSettingsSchema.unwrap().optional(), -}); - -export type TAdminUpdate = z.infer; +export { + type TAdminUpdate, + ZAdminUpdate, +} from "@calcom/features/ee/organizations/lib/service/AdminOrganizationUpdateService"; diff --git a/packages/trpc/server/routers/viewer/slots/util.ts b/packages/trpc/server/routers/viewer/slots/util.ts index d212bfd898..925d7c7669 100644 --- a/packages/trpc/server/routers/viewer/slots/util.ts +++ b/packages/trpc/server/routers/viewer/slots/util.ts @@ -7,8 +7,6 @@ import type { CurrentSeats, EventType, GetAvailabilityUser, - IFromUser, - IToUser, UserAvailabilityService, } from "@calcom/features/availability/lib/getUserAvailability"; import type { CheckBookingLimitsService } from "@calcom/features/bookings/lib/checkBookingLimits"; @@ -59,6 +57,8 @@ import type { Logger } from "tslog"; import { v4 as uuid } from "uuid"; import type { TGetScheduleInputSchema } from "./getSchedule.schema"; import type { GetScheduleOptions } from "./types"; +import type { OrgMembershipLookup } from "@calcom/features/di/modules/OrgMembershipLookup"; +import type { IGetAvailableSlots } from "@calcom/features/bookings/Booker/hooks/useAvailableTimeSlots"; const log = logger.getSubLogger({ prefix: ["[slots/util]"] }); const DEFAULT_SLOTS_CACHE_TTL = 2000; @@ -67,37 +67,10 @@ type GetAvailabilityUserWithDelegationCredentials = Omit; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - troubleshooter?: any; -} - export type GetAvailableSlotsResponse = Awaited< ReturnType<(typeof AvailableSlotsService)["prototype"]["_getAvailableSlots"]> >; -/** - * Minimal capability interface for looking up a user's organization membership. - * Used as a fallback when org context can't be determined from request or eventType. - */ -export interface OrgMembershipLookup { - findFirstOrganizationIdForUser(args: { userId: number }): Promise; -} - export interface IAvailableSlotsService { oooRepo: PrismaOOORepository; scheduleRepo: ScheduleRepository; diff --git a/packages/trpc/server/routers/viewer/workflows/filteredList.schema.tsx b/packages/trpc/server/routers/viewer/workflows/filteredList.schema.tsx index 0f28959ada..e6a722c5a3 100644 --- a/packages/trpc/server/routers/viewer/workflows/filteredList.schema.tsx +++ b/packages/trpc/server/routers/viewer/workflows/filteredList.schema.tsx @@ -2,12 +2,13 @@ import { z } from "zod"; +import type { TFilteredListInputSchema } from "@calcom/features/ee/workflows/repositories/WorkflowRepository"; import { filterQuerySchemaStrict } from "@calcom/features/filters/lib/getTeamsFiltersFromQuery"; -export const ZFilteredListInputSchema = z +export const ZFilteredListInputSchema: z.ZodType = z .object({ filters: filterQuerySchemaStrict.optional(), }) .nullish(); -export type TFilteredListInputSchema = z.infer; +export type { TFilteredListInputSchema }; diff --git a/packages/trpc/server/routers/viewer/workflows/getAllActiveWorkflows.schema.ts b/packages/trpc/server/routers/viewer/workflows/getAllActiveWorkflows.schema.ts index 045c589bee..bc2f5b5e37 100644 --- a/packages/trpc/server/routers/viewer/workflows/getAllActiveWorkflows.schema.ts +++ b/packages/trpc/server/routers/viewer/workflows/getAllActiveWorkflows.schema.ts @@ -1,63 +1,9 @@ +import type { Workflow } from "@calcom/ee/workflows/lib/types"; +import { ZWorkflow } from "@calcom/ee/workflows/lib/types"; +import { EventTypeMetaDataSchema } from "@calcom/prisma/zod-utils"; import { z } from "zod"; -import { - TIME_UNIT, - WORKFLOW_ACTIONS, - WORKFLOW_TEMPLATES, - WORKFLOW_TRIGGER_EVENTS, -} from "@calcom/ee/workflows/lib/constants"; -import { EventTypeMetaDataSchema } from "@calcom/prisma/zod-utils"; - -// Define types first to use with z.ZodType annotations -type TWorkflow = { - id: number; - name: string; - trigger: (typeof WORKFLOW_TRIGGER_EVENTS)[number]; - time: number | null; - timeUnit: (typeof TIME_UNIT)[number] | null; - userId: number | null; - teamId: number | null; - steps: { - id: number; - action: (typeof WORKFLOW_ACTIONS)[number]; - sendTo: string | null; - template: (typeof WORKFLOW_TEMPLATES)[number]; - reminderBody: string | null; - emailSubject: string | null; - numberRequired: boolean | null; - sender: string | null; - includeCalendarEvent: boolean; - numberVerificationPending: boolean; - verifiedAt?: Date | null; - }[]; -}; - -export const ZWorkflow: z.ZodType = z.object({ - id: z.number(), - name: z.string(), - trigger: z.enum(WORKFLOW_TRIGGER_EVENTS), - time: z.number().nullable(), - timeUnit: z.enum(TIME_UNIT).nullable(), - userId: z.number().nullable(), - teamId: z.number().nullable(), - steps: z - .object({ - id: z.number(), - action: z.enum(WORKFLOW_ACTIONS), - sendTo: z.string().nullable(), - template: z.enum(WORKFLOW_TEMPLATES), - reminderBody: z.string().nullable(), - emailSubject: z.string().nullable(), - numberRequired: z.boolean().nullable(), - sender: z.string().nullable(), - includeCalendarEvent: z.boolean(), - numberVerificationPending: z.boolean(), - verifiedAt: z.coerce.date().nullable().optional(), - }) - .array(), -}); - -type TWorkflows = { workflow: TWorkflow }[] | undefined; +type TWorkflows = { workflow: Workflow }[] | undefined; export const ZWorkflows: z.ZodType = z .object({ diff --git a/packages/trpc/server/routers/viewer/workflows/getVerifiedEmails.schema.ts b/packages/trpc/server/routers/viewer/workflows/getVerifiedEmails.schema.ts index 2d75c96eda..18f008ab81 100644 --- a/packages/trpc/server/routers/viewer/workflows/getVerifiedEmails.schema.ts +++ b/packages/trpc/server/routers/viewer/workflows/getVerifiedEmails.schema.ts @@ -1,9 +1,8 @@ +import type { TGetVerifiedEmailsInputSchema } from "@calcom/features/ee/workflows/repositories/WorkflowRepository"; import { z } from "zod"; -export type TGetVerifiedEmailsInputSchema = { - teamId?: number; -}; - export const ZGetVerifiedEmailsInputSchema: z.ZodType = z.object({ teamId: z.number().optional(), }); + +export type { TGetVerifiedEmailsInputSchema }; diff --git a/packages/trpc/server/routers/viewer/workflows/getVerifiedNumbers.schema.ts b/packages/trpc/server/routers/viewer/workflows/getVerifiedNumbers.schema.ts index 1794b5961c..10ca46bc84 100644 --- a/packages/trpc/server/routers/viewer/workflows/getVerifiedNumbers.schema.ts +++ b/packages/trpc/server/routers/viewer/workflows/getVerifiedNumbers.schema.ts @@ -1,9 +1,8 @@ +import type { TGetVerifiedNumbersInputSchema } from "@calcom/features/ee/workflows/repositories/WorkflowRepository"; import { z } from "zod"; -export type TGetVerifiedNumbersInputSchema = { - teamId?: number; -}; - export const ZGetVerifiedNumbersInputSchema: z.ZodType = z.object({ teamId: z.number().optional(), }); + +export type { TGetVerifiedNumbersInputSchema };