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" ;
24import { z } from "zod" ;
35import { prisma } from "~/db.server" ;
46import { 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