diff --git a/lib/validations/webhook.ts b/lib/validations/webhook.ts index 40aec5c288..ee42052204 100644 --- a/lib/validations/webhook.ts +++ b/lib/validations/webhook.ts @@ -2,6 +2,18 @@ import { z } from "zod"; import { _WebhookModel as Webhook } from "@calcom/prisma/zod"; +export const WebhookTriggerEvents = { + BOOKING_CREATED: "BOOKING_CREATED", + BOOKING_RESCHEDULED: "BOOKING_RESCHEDULED", + BOOKING_CANCELLED: "BOOKING_CANCELLED", +}; + +export const WEBHOOK_TRIGGER_EVENTS = [ + WebhookTriggerEvents.BOOKING_CANCELLED, + WebhookTriggerEvents.BOOKING_CREATED, + WebhookTriggerEvents.BOOKING_RESCHEDULED, +] as ["BOOKING_CANCELLED", "BOOKING_CREATED", "BOOKING_RESCHEDULED"]; + const schemaWebhookBaseBodyParams = Webhook.pick({ id: true, userId: true, @@ -14,24 +26,22 @@ const schemaWebhookBaseBodyParams = Webhook.pick({ export const schemaWebhookCreateParams = z .object({ - userId: z.number().or(z.string()).optional(), - eventTypeId: z.number().or(z.string()).optional(), - eventTriggers: z.any().optional(), - active: z.boolean().optional(), - subscriberUrl: z.string(), - payloadTemplate: z.string().optional(), + id: z.string(), + subscriberUrl: z.string().url(), + eventTriggers: z.enum(WEBHOOK_TRIGGER_EVENTS).array(), + active: z.boolean(), + payloadTemplate: z.string().optional().nullable(), + eventTypeId: z.number().optional(), + appId: z.string().optional().nullable(), }) .strict(); -export const schemaWebhookCreateBodyParams = schemaWebhookBaseBodyParams.merge( - schemaWebhookCreateParams -); +export const schemaWebhookCreateBodyParams = schemaWebhookBaseBodyParams.merge(schemaWebhookCreateParams); export const schemaWebhookEditBodyParams = schemaWebhookBaseBodyParams.merge( z.object({ payloadTemplate: z.string().optional(), - /** @todo: don't use any here and validate eventTriggers proper */ - eventTriggers: z.any(), + eventTriggers: z.enum(WEBHOOK_TRIGGER_EVENTS).array().optional(), subscriberUrl: z.string().optional(), }) );