Skip to content

Commit 0af367f

Browse files
committed
improve route to add worker group, handles existing groups gracefully
1 parent 6736cb5 commit 0af367f

File tree

1 file changed

+123
-16
lines changed

1 file changed

+123
-16
lines changed

apps/webapp/app/routes/admin.api.v1.workers.ts

Lines changed: 123 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
import { ActionFunctionArgs, json } from "@remix-run/server-runtime";
1+
import { type ActionFunctionArgs, json } from "@remix-run/server-runtime";
2+
import { tryCatch } from "@trigger.dev/core";
3+
import { type Project } from "@trigger.dev/database";
24
import { z } from "zod";
35
import { prisma } from "~/db.server";
46
import { authenticateApiRequestWithPersonalAccessToken } from "~/services/personalAccessToken.server";
@@ -18,7 +20,7 @@ export async function action({ request }: ActionFunctionArgs) {
1820
return json({ error: "Invalid or Missing API key" }, { status: 401 });
1921
}
2022

21-
const user = await prisma.user.findUnique({
23+
const user = await prisma.user.findFirst({
2224
where: {
2325
id: authenticationResult.userId,
2426
},
@@ -36,28 +38,133 @@ export async function action({ request }: ActionFunctionArgs) {
3638
const rawBody = await request.json();
3739
const { name, description, makeDefaultForProjectId } = RequestBodySchema.parse(rawBody ?? {});
3840

39-
const service = new WorkerGroupService();
40-
const { workerGroup, token } = await service.createWorkerGroup({
41-
name,
42-
description,
41+
const existingWorkerGroup = await prisma.workerInstanceGroup.findFirst({
42+
where: {
43+
// We only check managed worker groups
44+
masterQueue: name,
45+
},
4346
});
4447

45-
if (makeDefaultForProjectId) {
46-
await prisma.project.update({
47-
where: {
48-
id: makeDefaultForProjectId,
48+
if (!existingWorkerGroup) {
49+
const { workerGroup, token } = await createWorkerGroup(name, description);
50+
51+
if (!makeDefaultForProjectId) {
52+
return json({
53+
outcome: "created new worker group",
54+
token,
55+
workerGroup,
56+
});
57+
}
58+
59+
const updated = await setWorkerGroupAsDefaultForProject(
60+
workerGroup.id,
61+
makeDefaultForProjectId
62+
);
63+
64+
if (!updated.success) {
65+
return json({ error: updated.error }, { status: 400 });
66+
}
67+
68+
return json({
69+
outcome: "set new worker group as default for project",
70+
token,
71+
workerGroup,
72+
project: updated.project,
73+
});
74+
}
75+
76+
if (!makeDefaultForProjectId) {
77+
return json(
78+
{
79+
error: "worker group already exists",
80+
workerGroup: existingWorkerGroup,
4981
},
50-
data: {
51-
defaultWorkerGroupId: workerGroup.id,
82+
{ status: 400 }
83+
);
84+
}
85+
86+
const updated = await setWorkerGroupAsDefaultForProject(
87+
existingWorkerGroup.id,
88+
makeDefaultForProjectId
89+
);
90+
91+
if (!updated.success) {
92+
return json(
93+
{
94+
error: `failed to set worker group as default for project: ${updated.error}`,
95+
workerGroup: existingWorkerGroup,
5296
},
53-
});
97+
{ status: 400 }
98+
);
5499
}
55100

56101
return json({
57-
token,
58-
workerGroup,
102+
outcome: "set existing worker group as default for project",
103+
workerGroup: existingWorkerGroup,
104+
project: updated.project,
59105
});
60106
} catch (error) {
61-
return json({ error: error instanceof Error ? error.message : error }, { status: 400 });
107+
return json(
108+
{
109+
outcome: "unknown error",
110+
error: error instanceof Error ? error.message : error,
111+
},
112+
{ status: 400 }
113+
);
114+
}
115+
}
116+
117+
async function createWorkerGroup(name: string | undefined, description: string | undefined) {
118+
const service = new WorkerGroupService();
119+
return await service.createWorkerGroup({ name, description });
120+
}
121+
122+
async function setWorkerGroupAsDefaultForProject(
123+
workerGroupId: string,
124+
projectId: string
125+
): Promise<
126+
| {
127+
success: false;
128+
error: string;
129+
}
130+
| {
131+
success: true;
132+
project: Project;
133+
}
134+
> {
135+
const project = await prisma.project.findFirst({
136+
where: {
137+
id: projectId,
138+
},
139+
});
140+
141+
if (!project) {
142+
return {
143+
success: false,
144+
error: "project not found",
145+
};
146+
}
147+
148+
const [error] = await tryCatch(
149+
prisma.project.update({
150+
where: {
151+
id: projectId,
152+
},
153+
data: {
154+
defaultWorkerGroupId: workerGroupId,
155+
},
156+
})
157+
);
158+
159+
if (error) {
160+
return {
161+
success: false,
162+
error: error instanceof Error ? error.message : error,
163+
};
62164
}
165+
166+
return {
167+
success: true,
168+
project,
169+
};
63170
}

0 commit comments

Comments
 (0)