Skip to content

Commit 302bd02

Browse files
authored
Issue #377: only expose the external eventId in the API (#380)
* Issue #377: only expose the external eventId in the API * Create eighty-zebras-bow.md
1 parent b5db9f5 commit 302bd02

File tree

11 files changed

+97
-49
lines changed

11 files changed

+97
-49
lines changed

.changeset/eighty-zebras-bow.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"@trigger.dev/core": patch
3+
"@trigger.dev/sdk": patch
4+
---
5+
6+
Issue #377: only expose the external eventId in the API

apps/webapp/app/api.server.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { ApiEventLog } from "@trigger.dev/core";
2+
import { EventRecord } from "@trigger.dev/database";
3+
4+
export function eventRecordToApiJson(eventRecord: EventRecord): ApiEventLog {
5+
return {
6+
id: eventRecord.eventId,
7+
name: eventRecord.name,
8+
payload: eventRecord.payload as any,
9+
context: eventRecord.context as any,
10+
timestamp: eventRecord.timestamp,
11+
deliverAt: eventRecord.deliverAt,
12+
deliveredAt: eventRecord.deliveredAt,
13+
cancelledAt: eventRecord.cancelledAt,
14+
};
15+
}

apps/webapp/app/routes/api.v1.events.$eventId.cancel.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import type { ActionArgs } from "@remix-run/server-runtime";
22
import { json } from "@remix-run/server-runtime";
33
import { z } from "zod";
4+
import { eventRecordToApiJson } from "~/api.server";
45
import { authenticateApiRequest } from "~/services/apiAuth.server";
56
import { CancelEventService } from "~/services/events/cancelEvent.server";
67
import { logger } from "~/services/logger.server";
@@ -40,7 +41,7 @@ export async function action({ request, params }: ActionArgs) {
4041
return json({ error: "Event not found" }, { status: 404 });
4142
}
4243

43-
return json(updatedEvent);
44+
return json(eventRecordToApiJson(updatedEvent));
4445
} catch (err) {
4546
logger.error("CancelEventService.call() error", {
4647
error: err,

apps/webapp/app/routes/api.v1.events.$eventId.ts

Lines changed: 35 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import type { ActionArgs, LoaderArgs } from "@remix-run/server-runtime";
1+
import type { LoaderArgs } from "@remix-run/server-runtime";
22
import { json } from "@remix-run/server-runtime";
3-
import { cors } from "remix-utils";
3+
import { GetEvent } from "@trigger.dev/core";
44
import { z } from "zod";
55
import { prisma } from "~/db.server";
66
import { authenticateApiRequest } from "~/services/apiAuth.server";
@@ -32,9 +32,36 @@ export async function loader({ request, params }: LoaderArgs) {
3232

3333
const { eventId } = parsed.data;
3434

35-
const event = await prisma.eventRecord.findFirst({
35+
const event = await findEventRecord(eventId, authenticatedEnv.id);
36+
37+
if (!event) {
38+
return apiCors(request, json({ error: "Event not found" }, { status: 404 }));
39+
}
40+
41+
return apiCors(request, json(toJSON(event)));
42+
}
43+
44+
function toJSON(eventRecord: FoundEventRecord): GetEvent {
45+
return {
46+
id: eventRecord.eventId,
47+
name: eventRecord.name,
48+
createdAt: eventRecord.createdAt,
49+
updatedAt: eventRecord.updatedAt,
50+
runs: eventRecord.runs.map((run) => ({
51+
id: run.id,
52+
status: run.status,
53+
startedAt: run.startedAt,
54+
completedAt: run.completedAt,
55+
})),
56+
};
57+
}
58+
59+
type FoundEventRecord = NonNullable<Awaited<ReturnType<typeof findEventRecord>>>;
60+
61+
async function findEventRecord(eventId: string, environmentId: string) {
62+
return await prisma.eventRecord.findUnique({
3663
select: {
37-
id: true,
64+
eventId: true,
3865
name: true,
3966
createdAt: true,
4067
updatedAt: true,
@@ -48,14 +75,10 @@ export async function loader({ request, params }: LoaderArgs) {
4875
},
4976
},
5077
where: {
51-
id: eventId,
52-
environmentId: authenticatedEnv.id,
78+
eventId_environmentId: {
79+
eventId,
80+
environmentId,
81+
},
5382
},
5483
});
55-
56-
if (!event) {
57-
return apiCors(request, json({ error: "Event not found" }, { status: 404 }));
58-
}
59-
60-
return apiCors(request, json(event));
6184
}

apps/webapp/app/routes/api.v1.events.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { SendEventBodySchema } from "@trigger.dev/core";
44
import { generateErrorMessage } from "zod-error";
55
import { authenticateApiRequest } from "~/services/apiAuth.server";
66
import { IngestSendEvent } from "~/services/events/ingestSendEvent.server";
7+
import { eventRecordToApiJson } from "~/api.server";
78

89
export async function action({ request }: ActionArgs) {
910
// Ensure this is a POST request
@@ -33,5 +34,9 @@ export async function action({ request }: ActionArgs) {
3334

3435
const event = await service.call(authenticatedEnv, body.data.event, body.data.options);
3536

36-
return json(event);
37+
if (!event) {
38+
return json({ error: "Failed to create event" }, { status: 500 });
39+
}
40+
41+
return json(eventRecordToApiJson(event));
3742
}

apps/webapp/app/services/runs/performRunExecutionV1.server.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import {
2-
ApiEventLogSchema,
32
CachedTaskSchema,
43
RunJobError,
54
RunJobResumeWithTask,
@@ -9,6 +8,7 @@ import {
98
} from "@trigger.dev/core";
109
import type { Task } from "@trigger.dev/database";
1110
import { generateErrorMessage } from "zod-error";
11+
import { eventRecordToApiJson } from "~/api.server";
1212
import { EXECUTE_JOB_RETRY_LIMIT } from "~/consts";
1313
import { $transaction, PrismaClient, PrismaClientOrTransaction, prisma } from "~/db.server";
1414
import { enqueueRunExecutionV1 } from "~/models/jobRunExecution.server";
@@ -54,7 +54,7 @@ export class PerformRunExecutionV1Service {
5454
const { run } = execution;
5555

5656
const client = new EndpointApi(run.environment.apiKey, run.endpoint.url);
57-
const event = ApiEventLogSchema.parse({ ...run.event, id: run.eventId });
57+
const event = eventRecordToApiJson(run.event);
5858
const startedAt = new Date();
5959

6060
await this.#prismaClient.jobRunExecution.update({
@@ -174,7 +174,7 @@ export class PerformRunExecutionV1Service {
174174
}
175175

176176
const client = new EndpointApi(run.environment.apiKey, run.endpoint.url);
177-
const event = ApiEventLogSchema.parse({ ...run.event, id: run.eventId });
177+
const event = eventRecordToApiJson(run.event);
178178

179179
const startedAt = new Date();
180180

apps/webapp/app/services/runs/performRunExecutionV2.server.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import {
2-
ApiEventLogSchema,
32
CachedTask,
43
RunJobError,
54
RunJobResumeWithTask,
@@ -9,6 +8,7 @@ import {
98
} from "@trigger.dev/core";
109
import type { Task } from "@trigger.dev/database";
1110
import { generateErrorMessage } from "zod-error";
11+
import { eventRecordToApiJson } from "~/api.server";
1212
import { $transaction, PrismaClient, PrismaClientOrTransaction, prisma } from "~/db.server";
1313
import { enqueueRunExecutionV2 } from "~/models/jobRunExecution.server";
1414
import { resolveRunConnections } from "~/models/runConnection.server";
@@ -57,7 +57,7 @@ export class PerformRunExecutionV2Service {
5757
// the run execution will be marked as failed and the run will start
5858
async #executePreprocessing(run: FoundRun) {
5959
const client = new EndpointApi(run.environment.apiKey, run.endpoint.url);
60-
const event = ApiEventLogSchema.parse({ ...run.event, id: run.eventId });
60+
const event = eventRecordToApiJson(run.event);
6161

6262
const { response, parser } = await client.preprocessRunRequest({
6363
event,
@@ -146,7 +146,7 @@ export class PerformRunExecutionV2Service {
146146
}
147147

148148
const client = new EndpointApi(run.environment.apiKey, run.endpoint.url);
149-
const event = ApiEventLogSchema.parse({ ...run.event, id: run.eventId });
149+
const event = eventRecordToApiJson(run.event);
150150

151151
const startedAt = new Date();
152152

examples/job-catalog/src/events.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,19 @@ client.defineJob({
3939
run: async (payload, io, ctx) => {
4040
await io.sendEvent(
4141
"send-event",
42-
{ name: "Cancellable Event", id: payload.id },
42+
{ name: "Cancellable Event", id: payload.id, payload: { payload, ctx } },
4343
{
4444
deliverAt: new Date(Date.now() + 1000 * 60 * 60 * 24), // 24 hours from now
4545
}
4646
);
4747

48+
await io.getEvent("get-event", payload.id);
49+
4850
await io.wait("wait-1", 60); // 1 minute
4951

5052
await io.cancelEvent("cancel-event", payload.id);
53+
54+
await io.getEvent("get-event-2", payload.id);
5155
},
5256
});
5357

packages/core/src/schemas/api.ts

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,9 @@ export const ApiEventLogSchema = z.object({
257257
/** The timestamp when the event was delivered. Is `undefined` if `deliverAt`
258258
or `deliverAfter` were set when sending the event. */
259259
deliveredAt: z.coerce.date().optional().nullable(),
260+
/** The timestamp when the event was cancelled. Is `undefined` if the event
261+
* wasn't cancelled. */
262+
cancelledAt: z.coerce.date().optional().nullable(),
260263
});
261264

262265
export type ApiEventLog = z.infer<typeof ApiEventLogSchema>;
@@ -424,15 +427,6 @@ export const PreprocessRunResponseSchema = z.object({
424427

425428
export type PreprocessRunResponse = z.infer<typeof PreprocessRunResponseSchema>;
426429

427-
export const CreateRunBodySchema = z.object({
428-
client: z.string(),
429-
job: JobMetadataSchema,
430-
event: ApiEventLogSchema,
431-
properties: z.array(DisplayPropertySchema).optional(),
432-
});
433-
434-
export type CreateRunBody = z.infer<typeof CreateRunBodySchema>;
435-
436430
const CreateRunResponseOkSchema = z.object({
437431
ok: z.literal(true),
438432
data: z.object({

packages/trigger-sdk/src/apiClient.ts

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ import {
33
ApiEventLogSchema,
44
CompleteTaskBodyInput,
55
ConnectionAuthSchema,
6-
CreateRunBody,
7-
CreateRunResponseBodySchema,
86
FailTaskBodyInput,
97
GetEventSchema,
108
GetRunOptionsWithTaskDetails,
@@ -105,23 +103,6 @@ export class ApiClient {
105103
return await response.json();
106104
}
107105

108-
async createRun(params: CreateRunBody) {
109-
const apiKey = await this.#apiKey();
110-
111-
this.#logger.debug("Creating run", {
112-
params,
113-
});
114-
115-
return await zodfetch(CreateRunResponseBodySchema, `${this.#apiUrl}/api/v1/runs`, {
116-
method: "POST",
117-
headers: {
118-
"Content-Type": "application/json",
119-
Authorization: `Bearer ${apiKey}`,
120-
},
121-
body: JSON.stringify(params),
122-
});
123-
}
124-
125106
async runTask(runId: string, task: RunTaskBodyInput) {
126107
const apiKey = await this.#apiKey();
127108

0 commit comments

Comments
 (0)