Skip to content

Commit de880f6

Browse files
committed
Create run templates in a new service
1 parent 77dfb27 commit de880f6

3 files changed

Lines changed: 103 additions & 2 deletions

File tree

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
import { packetRequiresOffloading, stringifyIO } from "@trigger.dev/core/v3";
2+
import { type AuthenticatedEnvironment } from "~/services/apiAuth.server";
3+
import { BaseService } from "./baseService.server";
4+
import { env } from "~/env.server";
5+
import { handleMetadataPacket } from "~/utils/packets";
6+
import { type RunTemplateData } from "../taskRunTemplate";
7+
8+
export class TaskRunTemplateService extends BaseService {
9+
public async call(environment: AuthenticatedEnvironment, data: RunTemplateData) {
10+
const { triggerSource } = data;
11+
12+
switch (triggerSource) {
13+
case "STANDARD": {
14+
const packet = { data: JSON.stringify(data.payload), dataType: "application/json" };
15+
16+
const { needsOffloading } = packetRequiresOffloading(
17+
packet,
18+
env.TASK_PAYLOAD_OFFLOAD_THRESHOLD
19+
);
20+
21+
if (needsOffloading) {
22+
// we currently disallow large payloads in task run templates
23+
throw new Error("Payload too large");
24+
}
25+
26+
const metadataPacket = data.metadata
27+
? handleMetadataPacket(data.metadata, "application/json")
28+
: undefined;
29+
30+
const taskRunTemplate = await this._prisma.taskRunTemplate.create({
31+
data: {
32+
taskSlug: data.taskIdentifier,
33+
label: data.label,
34+
payload: packet.data,
35+
payloadType: packet.dataType,
36+
metadata: metadataPacket?.data,
37+
metadataType: metadataPacket?.dataType,
38+
queue: data.queue ?? "default",
39+
delaySeconds: data.delaySeconds,
40+
maxAttempts: data.maxAttempts,
41+
maxDurationSeconds: data.maxDurationSeconds,
42+
tags: data.tags ?? [],
43+
machinePreset: data.machine,
44+
projectId: environment.projectId,
45+
organizationId: environment.organizationId,
46+
},
47+
});
48+
49+
return taskRunTemplate;
50+
}
51+
case "SCHEDULED": {
52+
const payload = {
53+
scheduleId: "sched_1234",
54+
type: "IMPERATIVE",
55+
timestamp: data.timestamp,
56+
lastTimestamp: data.lastTimestamp,
57+
timezone: data.timezone,
58+
externalId: data.externalId,
59+
upcoming: [],
60+
};
61+
const payloadPacket = await stringifyIO(payload);
62+
63+
const taskRunTemplate = await this._prisma.taskRunTemplate.create({
64+
data: {
65+
taskSlug: data.taskIdentifier,
66+
label: data.label,
67+
payload: payloadPacket.data,
68+
payloadType: payloadPacket.dataType,
69+
queue: data.queue ?? "default",
70+
delaySeconds: data.delaySeconds,
71+
maxAttempts: data.maxAttempts,
72+
maxDurationSeconds: data.maxDurationSeconds,
73+
tags: data.tags ?? [],
74+
machinePreset: data.machine,
75+
projectId: environment.projectId,
76+
organizationId: environment.organizationId,
77+
},
78+
});
79+
80+
return taskRunTemplate;
81+
}
82+
default: {
83+
triggerSource satisfies never;
84+
throw new Error("Invalid trigger source");
85+
}
86+
}
87+
}
88+
}

apps/webapp/app/v3/services/testTask.server.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@ import { TriggerTaskService } from "./triggerTask.server";
77
export class TestTaskService extends BaseService {
88
public async call(environment: AuthenticatedEnvironment, data: TestTaskData) {
99
const triggerTaskService = new TriggerTaskService();
10+
const { triggerSource } = data;
1011

11-
switch (data.triggerSource) {
12+
switch (triggerSource) {
1213
case "STANDARD": {
1314
const result = await triggerTaskService.call(data.taskIdentifier, environment, {
1415
payload: data.payload,
@@ -72,8 +73,10 @@ export class TestTaskService extends BaseService {
7273

7374
return result?.run;
7475
}
75-
default:
76+
default: {
77+
triggerSource satisfies never;
7678
throw new Error("Invalid trigger source");
79+
}
7780
}
7881
}
7982
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { z } from "zod";
2+
import { TestTaskData } from "./testTask";
3+
4+
export const RunTemplateData = TestTaskData.and(
5+
z.object({
6+
label: z.string(),
7+
})
8+
);
9+
10+
export type RunTemplateData = z.infer<typeof RunTemplateData>;

0 commit comments

Comments
 (0)