From ee20f9212f343e928cb408bab405ae841785cc87 Mon Sep 17 00:00:00 2001 From: Eric Allam Date: Thu, 23 Feb 2023 12:33:51 +0000 Subject: [PATCH 1/2] Make the schema an optional param for customEvent and webhookEvent --- .changeset/big-apples-reflect.md | 5 + .../app/presenters/testPresenter.server.ts | 8 ++ examples/generic-webhook/src/index.ts | 118 ++++-------------- packages/trigger-sdk/src/events.ts | 16 ++- 4 files changed, 46 insertions(+), 101 deletions(-) create mode 100644 .changeset/big-apples-reflect.md diff --git a/.changeset/big-apples-reflect.md b/.changeset/big-apples-reflect.md new file mode 100644 index 00000000000..1fc71d6881d --- /dev/null +++ b/.changeset/big-apples-reflect.md @@ -0,0 +1,5 @@ +--- +"@trigger.dev/sdk": patch +--- + +Make the schema an optional param for customEvent and webhookEvent diff --git a/apps/webapp/app/presenters/testPresenter.server.ts b/apps/webapp/app/presenters/testPresenter.server.ts index f9f141d9703..bff62d7e982 100644 --- a/apps/webapp/app/presenters/testPresenter.server.ts +++ b/apps/webapp/app/presenters/testPresenter.server.ts @@ -93,6 +93,14 @@ export class WorkflowTestPresenter { } if (workflow.jsonSchema) { + // If jsonSchema is just { "$schema": "http://json-schema.org/draft-07/schema#" }, then return an empty object + if ( + Object.keys(workflow.jsonSchema).length === 1 && + // @ts-ignore + workflow.jsonSchema["$schema"] + ) { + return {}; + } // @ts-ignore return JSONSchemaFaker.generate(workflow.jsonSchema); } diff --git a/examples/generic-webhook/src/index.ts b/examples/generic-webhook/src/index.ts index 7d33c66bbaf..4f5b6c0acd4 100644 --- a/examples/generic-webhook/src/index.ts +++ b/examples/generic-webhook/src/index.ts @@ -1,106 +1,32 @@ -import * as slack from "@trigger.dev/slack"; -import { Trigger, webhookEvent } from "@trigger.dev/sdk"; -import { z } from "zod"; - -export const bookingPayloadSchema = z.object({ - triggerEvent: z.string(), - createdAt: z.coerce.date(), - payload: z.object({ - type: z.string(), - title: z.string(), - description: z.string(), - additionalNotes: z.string(), - customInputs: z.object({}), - startTime: z.coerce.date(), - endTime: z.coerce.date(), - organizer: z.object({ - id: z.number(), - name: z.string(), - email: z.string(), - timeZone: z.string(), - language: z.object({ locale: z.string() }), - }), - attendees: z.array( - z.object({ - email: z.string(), - name: z.string(), - timeZone: z.string(), - language: z.object({ locale: z.string() }), - }) - ), - location: z.string(), - destinationCalendar: z.object({ - id: z.number(), - integration: z.string(), - externalId: z.string(), - userId: z.number(), - eventTypeId: z.null(), - credentialId: z.number(), - }), - hideCalendarNotes: z.boolean(), - requiresConfirmation: z.null(), - eventTypeId: z.number(), - seatsShowAttendees: z.boolean(), - uid: z.string(), - conferenceData: z.object({ - createRequest: z.object({ requestId: z.string() }), - }), - videoCallData: z.object({ - type: z.string(), - id: z.string(), - password: z.string(), - url: z.string(), - }), - appsStatus: z.array( - z.object({ - appName: z.string(), - type: z.string(), - success: z.number(), - failures: z.number(), - errors: z.array(z.any()).optional(), - warnings: z.array(z.any()).optional(), - }) - ), - eventTitle: z.string(), - eventDescription: z.null(), - price: z.number(), - currency: z.string(), - length: z.number(), - bookingId: z.number(), - metadata: z.object({ videoCallUrl: z.string() }), - status: z.string(), - }), -}); +import { Trigger, webhookEvent, customEvent } from "@trigger.dev/sdk"; new Trigger({ - id: "caldotcom-to-slack-2", - name: "Cal.com To Slack", - apiKey: "trigger_development_lwlXEjyhSNF4", + id: "typeform-webhook", + name: "Typeform Webhook", + apiKey: "trigger_development_qthXXiRnLJuM", endpoint: "ws://localhost:8889/ws", logLevel: "debug", on: webhookEvent({ - service: "cal.com", - eventName: "BOOKING_CREATED", - filter: { - triggerEvent: ["BOOKING_CREATED"], - }, - schema: bookingPayloadSchema, - verifyPayload: { - enabled: true, - header: "X-Cal-Signature-256", - }, + service: "typeform.com", + eventName: "form_response", }), run: async (event, ctx) => { - await ctx.logger.info("Received a cal.com booking", { - event, - wallTime: new Date(), - }); + // Do something with the event + await ctx.logger.info("Received event", event); + }, +}).listen(); - await slack.postMessage(`Cal.com booking yo`, { - channelName: "customers", - text: `New Booking: ${ - event.payload.title - } at ${event.payload.startTime.toLocaleDateString()}`, - }); +new Trigger({ + id: "new-user", + name: "New User", + apiKey: "trigger_development_qthXXiRnLJuM", + endpoint: "ws://localhost:8889/ws", + logLevel: "debug", + on: customEvent({ + name: "new.user", + }), + run: async (event, ctx) => { + // Do something with the event + await ctx.logger.info("Received event", event); }, }).listen(); diff --git a/packages/trigger-sdk/src/events.ts b/packages/trigger-sdk/src/events.ts index 80d0ed236ca..0aebb6e6c7a 100644 --- a/packages/trigger-sdk/src/events.ts +++ b/packages/trigger-sdk/src/events.ts @@ -22,22 +22,25 @@ export type TriggerEvent = { export type TriggerCustomEventOptions = { name: string; - schema: TSchema; + schema?: TSchema; filter?: EventFilter; }; export function customEvent( options: TriggerCustomEventOptions ): TriggerEvent { + const schema = options.schema ?? z.any(); + return { metadata: { type: "CUSTOM_EVENT", service: "trigger", name: options.name, filter: { event: [options.name], payload: options.filter ?? {} }, - schema: zodToJsonSchema(options.schema) as CustomEventTrigger["schema"], + schema: zodToJsonSchema(schema) as CustomEventTrigger["schema"], }, - schema: options.schema, + // @ts-ignore + schema, }; } @@ -58,7 +61,7 @@ export function scheduleEvent( } export type TriggerWebhookEventOptions = { - schema: TSchema; + schema?: TSchema; service: string; eventName: string; filter?: EventFilter; @@ -71,6 +74,8 @@ export type TriggerWebhookEventOptions = { export function webhookEvent( options: TriggerWebhookEventOptions ): TriggerEvent { + const schema = options.schema ?? z.any(); + return { metadata: { type: "WEBHOOK", @@ -86,8 +91,9 @@ export function webhookEvent( event: options.eventName, }, manualRegistration: true, - schema: zodToJsonSchema(options.schema) as WebhookEventTrigger["schema"], + schema: zodToJsonSchema(schema) as WebhookEventTrigger["schema"], }, + // @ts-ignore schema: options.schema, }; } From 173f88dcadabe381bd1ec2ea50fd2a9fa004188c Mon Sep 17 00:00:00 2001 From: Eric Allam Date: Thu, 23 Feb 2023 18:23:37 +0000 Subject: [PATCH 2/2] Fixed the revalidator in the useEffect deps array causing tons of requests --- .../orgs/$organizationSlug/__org/templates/$templateId.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/webapp/app/routes/__app/orgs/$organizationSlug/__org/templates/$templateId.tsx b/apps/webapp/app/routes/__app/orgs/$organizationSlug/__org/templates/$templateId.tsx index 2fb8eebd6d0..8e74f62f67c 100644 --- a/apps/webapp/app/routes/__app/orgs/$organizationSlug/__org/templates/$templateId.tsx +++ b/apps/webapp/app/routes/__app/orgs/$organizationSlug/__org/templates/$templateId.tsx @@ -60,7 +60,8 @@ export default function TemplatePage() { if (events !== null) { revalidator.revalidate(); } - }, [events, revalidator]); + // WARNING Don't put the revalidator in the useEffect deps array or bad things will happen + }, [events]); // eslint-disable-line react-hooks/exhaustive-deps const organizationTemplateByStatus = (