Remove comboTrigger and add elements to JobVersion

This commit is contained in:
Eric Allam
2023-06-05 16:43:32 +01:00
parent 8e189cbf2b
commit 8a2cd974fd
15 changed files with 124 additions and 161 deletions
@@ -280,9 +280,12 @@ export class RegisterJobService {
},
});
for (const trigger of metadata.triggers) {
await this.#upsertEventDispatcher(trigger, job, jobVersion, environment);
}
await this.#upsertEventDispatcher(
metadata.trigger,
job,
jobVersion,
environment
);
return jobVersion;
}
@@ -327,6 +330,17 @@ export class RegisterJobService {
},
});
if (trigger.elements) {
await this.#prismaClient.jobVersion.update({
where: {
id: jobVersion.id,
},
data: {
elements: trigger.elements,
},
});
}
break;
}
case "scheduled": {
@@ -0,0 +1,2 @@
-- AlterTable
ALTER TABLE "JobVersion" ADD COLUMN "elements" JSONB;
+6 -4
View File
@@ -32,7 +32,7 @@ model User {
featureCloud Boolean @default(false)
isOnHostedRepoWaitlist Boolean @default(false)
marketingEmails Boolean @default(true)
marketingEmails Boolean @default(true)
confirmedBasicDetails Boolean @default(false)
orgMemberships OrgMember[]
@@ -195,10 +195,10 @@ enum OrgMemberRole {
}
model OrgMemberInvite {
id String @id @default(cuid())
token String @unique @default(cuid())
id String @id @default(cuid())
token String @unique @default(cuid())
email String
role OrgMemberRole @default(MEMBER)
role OrgMemberRole @default(MEMBER)
organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade, onUpdate: Cascade)
organizationId String
@@ -326,6 +326,8 @@ model JobVersion {
version String
eventSpecification Json
elements Json?
job Job @relation(fields: [jobId], references: [id], onDelete: Cascade, onUpdate: Cascade)
jobId String
@@ -1,5 +1,4 @@
import {
comboTrigger,
cronTrigger,
customEvent,
customTrigger,
+14
View File
@@ -35,6 +35,13 @@ export function createRepoEventSource(
schema: z.object({ repo: z.string() }),
integration,
key: (params) => params.repo,
elements: (params) => [
{
label: "Repo",
text: params.repo,
url: `https://github.com/${params.repo}`,
},
],
filter: (params) => ({
repository: {
full_name: [params.repo],
@@ -190,6 +197,13 @@ export function createOrgEventSource(
integration,
schema: z.object({ org: z.string() }),
key: (params) => params.org,
elements: (params) => [
{
label: "Org",
text: params.org,
url: `https://github.com/${params.org}`,
},
],
filter: (params) => ({
organization: {
login: [params.org],
+1 -1
View File
@@ -136,7 +136,7 @@ export const JobMetadataSchema = z.object({
name: z.string(),
version: z.string(),
event: EventSpecificationSchema,
triggers: z.array(TriggerMetadataSchema),
trigger: TriggerMetadataSchema,
integrations: z.record(IntegrationConfigSchema),
internal: z.boolean().default(false),
queue: z.union([QueueOptionsSchema, z.string()]).optional(),
-1
View File
@@ -2,7 +2,6 @@ export * from "./job";
export * from "./triggerClient";
export * from "./integrations";
export * from "./triggers/customTrigger";
export * from "./triggers/comboTrigger";
export * from "./triggers/externalSource";
export * from "./triggers/dynamic";
export * from "./triggers/scheduled";
+1 -1
View File
@@ -113,7 +113,7 @@ export class Job<
name: this.name,
version: this.version,
event: this.trigger.event,
triggers: this.trigger.toJSON(),
trigger: this.trigger.toJSON(),
integrations: this.integrations,
queue: this.options.queue,
startPosition: this.options.startPosition ?? "latest",
@@ -1,55 +0,0 @@
import { TriggerMetadata } from "@trigger.dev/internal";
import { Job } from "../job";
import { TriggerClient } from "../triggerClient";
import { EventSpecification, Trigger } from "../types";
type ComboTriggerOptions<
TEventSpecification extends EventSpecification<any>,
TTriggers extends Array<Trigger<TEventSpecification>>
> = {
event: TEventSpecification;
triggers: TTriggers;
};
class ComboTrigger<
TEventSpecification extends EventSpecification<any>,
TTriggers extends Array<Trigger<TEventSpecification>>
> implements Trigger<TEventSpecification>
{
#options: ComboTriggerOptions<TEventSpecification, TTriggers>;
constructor(options: ComboTriggerOptions<TEventSpecification, TTriggers>) {
this.#options = options;
}
toJSON(): Array<TriggerMetadata> {
return this.#options.triggers.flatMap((trigger) => trigger.toJSON());
}
get event() {
return this.#options.event;
}
get requiresPreparaton(): boolean {
return this.#options.triggers.some((trigger) => trigger.requiresPreparaton);
}
attachToJob(
triggerClient: TriggerClient,
job: Job<Trigger<TEventSpecification>, any>,
index?: number
): void {
this.#options.triggers.forEach((trigger, i) =>
trigger.attachToJob(triggerClient, job, i)
);
}
}
export function comboTrigger<
TEventSpecification extends EventSpecification<any>,
TTriggers extends Array<Trigger<TEventSpecification>>
>(
options: ComboTriggerOptions<TEventSpecification, TTriggers>
): Trigger<TEventSpecification> {
return new ComboTrigger(options);
}
@@ -25,21 +25,19 @@ export class CustomTrigger<TEventSpecification extends EventSpecification<any>>
this.#options = options;
}
toJSON(): Array<TriggerMetadata> {
return [
{
type: "static",
title: this.#options.name ?? this.#options.event.title,
rule: {
event: this.#options.name ?? this.#options.event.name,
source: this.#options.source ?? "trigger.dev",
payload: deepMergeFilters(
this.#options.filter ?? {},
this.#options.event.filter ?? {}
),
},
toJSON(): TriggerMetadata {
return {
type: "static",
title: this.#options.name ?? this.#options.event.title,
rule: {
event: this.#options.name ?? this.#options.event.name,
source: this.#options.source ?? "trigger.dev",
payload: deepMergeFilters(
this.#options.filter ?? {},
this.#options.event.filter ?? {}
),
},
];
};
}
get requiresPreparaton(): boolean {
+6 -9
View File
@@ -39,13 +39,11 @@ export class DynamicTrigger<
client.attachDynamicTrigger(this);
}
toJSON(): Array<TriggerMetadata> {
return [
{
type: "dynamic",
id: this.#options.id,
},
];
toJSON(): TriggerMetadata {
return {
type: "dynamic",
id: this.#options.id,
};
}
get id() {
@@ -97,8 +95,7 @@ export class DynamicTrigger<
attachToJob(
triggerClient: TriggerClient,
job: Job<Trigger<TEventSpec>, any>,
index?: number
job: Job<Trigger<TEventSpec>, any>
): void {
triggerClient.attachJobToDynamicTrigger(job, this);
}
@@ -1,6 +1,7 @@
import { z } from "zod";
import {
DisplayElement,
EventFilter,
HandleTriggerSource,
Logger,
@@ -108,6 +109,7 @@ type ExternalSourceOptions<
filter: FilterFunction<TParams>;
handler: HandlerFunction<TChannel, TParams>;
key: KeyFunction<TParams>;
elements?: (params: TParams) => DisplayElement[];
};
export class ExternalSource<
@@ -142,6 +144,10 @@ export class ExternalSource<
return this.options.filter(params);
}
elements(params: TParams): DisplayElement[] {
return this.options.elements?.(params) ?? [];
}
async register(
params: TParams,
registerEvent: RegisterSourceEvent,
@@ -232,27 +238,25 @@ export class ExternalSourceTrigger<
return true;
}
toJSON(): Array<TriggerMetadata> {
return [
{
type: "static",
title: "External Source",
rule: {
event: this.event.name,
payload: deepMergeFilters(
this.options.source.filter(this.options.params),
this.event.filter ?? {}
),
source: this.event.source,
},
toJSON(): TriggerMetadata {
return {
type: "static",
title: "External Source",
rule: {
event: this.event.name,
payload: deepMergeFilters(
this.options.source.filter(this.options.params),
this.event.filter ?? {}
),
source: this.event.source,
},
];
elements: this.options.source.elements(this.options.params),
};
}
attachToJob(
triggerClient: TriggerClient,
job: Job<Trigger<TEventSpecification>, any>,
index?: number
job: Job<Trigger<TEventSpecification>, any>
) {
triggerClient.attachSource({
key: slugifyId(this.options.source.key(this.options.params)),
@@ -57,22 +57,20 @@ export class MissingConnectionNotification
job: Job<Trigger<MissingConnectionNotificationSpecification>, any>
): void {}
toJSON(): Array<TriggerMetadata> {
return [
{
type: "static",
title: this.event.title,
rule: {
event: this.event.name,
source: "trigger.dev",
payload: {
client: {
id: this.options.integrations.map((i) => i.id),
},
toJSON(): TriggerMetadata {
return {
type: "static",
title: this.event.title,
rule: {
event: this.event.name,
source: "trigger.dev",
payload: {
client: {
id: this.options.integrations.map((i) => i.id),
},
},
},
];
};
}
get requiresPreparaton(): boolean {
@@ -109,22 +107,20 @@ export class MissingConnectionResolvedNotification
job: Job<Trigger<MissingConnectionResolvedNotificationSpecification>, any>
): void {}
toJSON(): Array<TriggerMetadata> {
return [
{
type: "static",
title: this.event.title,
rule: {
event: this.event.name,
source: "trigger.dev",
payload: {
client: {
id: this.options.integrations.map((i) => i.id),
},
toJSON(): TriggerMetadata {
return {
type: "static",
title: this.event.title,
rule: {
event: this.event.name,
source: "trigger.dev",
payload: {
client: {
id: this.options.integrations.map((i) => i.id),
},
},
},
];
};
}
get requiresPreparaton(): boolean {
+21 -27
View File
@@ -38,18 +38,16 @@ export class IntervalTrigger implements Trigger<ScheduledEventSpecification> {
job: Job<Trigger<ScheduledEventSpecification>, any>
): void {}
toJSON(): Array<TriggerMetadata> {
return [
{
type: "scheduled",
schedule: {
type: "interval",
options: {
seconds: this.options.seconds,
},
toJSON(): TriggerMetadata {
return {
type: "scheduled",
schedule: {
type: "interval",
options: {
seconds: this.options.seconds,
},
},
];
};
}
get requiresPreparaton(): boolean {
@@ -85,18 +83,16 @@ export class CronTrigger implements Trigger<ScheduledEventSpecification> {
job: Job<Trigger<ScheduledEventSpecification>, any>
): void {}
toJSON(): Array<TriggerMetadata> {
return [
{
type: "scheduled",
schedule: {
type: "cron",
options: {
cron: this.options.cron,
},
toJSON(): TriggerMetadata {
return {
type: "scheduled",
schedule: {
type: "cron",
options: {
cron: this.options.cron,
},
},
];
};
}
get requiresPreparaton(): boolean {
@@ -145,13 +141,11 @@ export class DynamicSchedule implements Trigger<ScheduledEventSpecification> {
triggerClient.attachDynamicSchedule(this.options.id, job);
}
toJSON(): Array<TriggerMetadata> {
return [
{
type: "dynamic",
id: this.options.id,
},
];
toJSON(): TriggerMetadata {
return {
type: "dynamic",
id: this.options.id,
};
}
get requiresPreparaton(): boolean {
+2 -3
View File
@@ -33,13 +33,12 @@ export type TriggerEventType<TTrigger extends Trigger<any>> =
export interface Trigger<TEventSpec extends EventSpecification<any>> {
event: TEventSpec;
toJSON(): Array<TriggerMetadata>;
toJSON(): TriggerMetadata;
// Attach this trigger to the job and the trigger client
// Gives different triggers the ability to do things like register internal jobs
attachToJob(
triggerClient: TriggerClient,
job: Job<Trigger<TEventSpec>, any>,
index?: number
job: Job<Trigger<TEventSpec>, any>
): void;
requiresPreparaton: boolean;
}