Skip to content

Commit 8c5ebd1

Browse files
committed
Parse gh app install callback with a discriminated union
1 parent 4054f5d commit 8c5ebd1

File tree

1 file changed

+25
-13
lines changed
  • apps/webapp/app/routes/_app.github.callback

1 file changed

+25
-13
lines changed

apps/webapp/app/routes/_app.github.callback/route.tsx

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,22 @@ import { tryCatch } from "@trigger.dev/core";
88
import { $replica } from "~/db.server";
99
import { requireUser } from "~/services/session.server";
1010

11-
const QuerySchema = z.object({
12-
installation_id: z.coerce.number(),
13-
setup_action: z.enum(["install", "update", "request"]),
14-
state: z.string(),
15-
});
11+
const QuerySchema = z.discriminatedUnion("setup_action", [
12+
z.object({
13+
setup_action: z.literal("install"),
14+
installation_id: z.coerce.number(),
15+
state: z.string(),
16+
}),
17+
z.object({
18+
setup_action: z.literal("update"),
19+
installation_id: z.coerce.number(),
20+
state: z.string(),
21+
}),
22+
z.object({
23+
setup_action: z.literal("request"),
24+
state: z.string(),
25+
}),
26+
]);
1627

1728
export async function loader({ request }: LoaderFunctionArgs) {
1829
const url = new URL(request.url);
@@ -28,14 +39,13 @@ export async function loader({ request }: LoaderFunctionArgs) {
2839
return redirectWithErrorMessage("/", request, "Failed to install GitHub App");
2940
}
3041

31-
const { installation_id, setup_action, state } = result.data;
42+
const callbackData = result.data;
3243

33-
const sessionResult = await validateGitHubAppInstallSession(cookieHeader, state);
44+
const sessionResult = await validateGitHubAppInstallSession(cookieHeader, callbackData.state);
3445

3546
if (!sessionResult.valid) {
3647
logger.error("GitHub App callback with invalid session", {
37-
state,
38-
installation_id,
48+
callbackData,
3949
error: sessionResult.error,
4050
});
4151

@@ -63,10 +73,12 @@ export async function loader({ request }: LoaderFunctionArgs) {
6373
return redirectWithErrorMessage(redirectTo, request, "Failed to install GitHub App");
6474
}
6575

66-
switch (setup_action) {
76+
switch (callbackData.setup_action) {
6777
case "install":
6878
case "update": {
69-
const [error] = await tryCatch(linkGitHubAppInstallation(installation_id, organizationId));
79+
const [error] = await tryCatch(
80+
linkGitHubAppInstallation(callbackData.installation_id, organizationId)
81+
);
7082

7183
if (error) {
7284
logger.error("Failed to link GitHub App installation", {
@@ -82,14 +94,14 @@ export async function loader({ request }: LoaderFunctionArgs) {
8294
// This happens when a non-admin user requests installation
8395
// The installation_id won't be available until an admin approves
8496
logger.info("GitHub App installation requested, awaiting approval", {
85-
state,
97+
callbackData,
8698
});
8799

88100
return redirectWithSuccessMessage(redirectTo, request, "GitHub App installation requested");
89101
}
90102

91103
default:
92-
setup_action satisfies never;
104+
callbackData satisfies never;
93105
return redirectWithErrorMessage(redirectTo, request, "Failed to install GitHub App");
94106
}
95107
}

0 commit comments

Comments
 (0)