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" ;
2
4
import { z } from "zod" ;
3
5
import { prisma } from "~/db.server" ;
4
6
import { authenticateApiRequestWithPersonalAccessToken } from "~/services/personalAccessToken.server" ;
@@ -18,7 +20,7 @@ export async function action({ request }: ActionFunctionArgs) {
18
20
return json ( { error : "Invalid or Missing API key" } , { status : 401 } ) ;
19
21
}
20
22
21
- const user = await prisma . user . findUnique ( {
23
+ const user = await prisma . user . findFirst ( {
22
24
where : {
23
25
id : authenticationResult . userId ,
24
26
} ,
@@ -36,28 +38,133 @@ export async function action({ request }: ActionFunctionArgs) {
36
38
const rawBody = await request . json ( ) ;
37
39
const { name, description, makeDefaultForProjectId } = RequestBodySchema . parse ( rawBody ?? { } ) ;
38
40
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
+ } ,
43
46
} ) ;
44
47
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 ,
49
81
} ,
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 ,
52
96
} ,
53
- } ) ;
97
+ { status : 400 }
98
+ ) ;
54
99
}
55
100
56
101
return json ( {
57
- token,
58
- workerGroup,
102
+ outcome : "set existing worker group as default for project" ,
103
+ workerGroup : existingWorkerGroup ,
104
+ project : updated . project ,
59
105
} ) ;
60
106
} 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
+ } ;
62
164
}
165
+
166
+ return {
167
+ success : true ,
168
+ project,
169
+ } ;
63
170
}
0 commit comments