1
1
import { ScheduledTaskPayload , parsePacket , prettyPrintPacket } from "@trigger.dev/core/v3" ;
2
- import { RuntimeEnvironmentType , TaskRunStatus } from "@trigger.dev/database" ;
2
+ import { BackgroundWorkerTask , RuntimeEnvironmentType , TaskRunStatus } from "@trigger.dev/database" ;
3
3
import { PrismaClient , prisma , sqlDatabaseSchema } from "~/db.server" ;
4
4
import { getTimezones } from "~/utils/timezones.server" ;
5
5
import { getUsername } from "~/utils/username" ;
6
+ import { findCurrentWorkerDeployment } from "~/v3/models/workerDeployment.server" ;
6
7
7
8
type TestTaskOptions = {
8
9
userId : string ;
9
10
projectSlug : string ;
10
- taskFriendlyId : string ;
11
+ environmentSlug : string ;
12
+ taskIdentifier : string ;
11
13
} ;
12
14
13
15
type Task = {
@@ -37,6 +39,15 @@ export type TestTask =
37
39
runs : ScheduledRun [ ] ;
38
40
} ;
39
41
42
+ export type TestTaskResult =
43
+ | {
44
+ foundTask : true ;
45
+ task : TestTask ;
46
+ }
47
+ | {
48
+ foundTask : false ;
49
+ } ;
50
+
40
51
type RawRun = {
41
52
id : string ;
42
53
number : BigInt ;
@@ -71,55 +82,79 @@ export class TestTaskPresenter {
71
82
this . #prismaClient = prismaClient ;
72
83
}
73
84
74
- public async call ( { userId, projectSlug, taskFriendlyId } : TestTaskOptions ) : Promise < TestTask > {
75
- const task = await this . #prismaClient. backgroundWorkerTask . findFirstOrThrow ( {
85
+ public async call ( {
86
+ userId,
87
+ projectSlug,
88
+ environmentSlug,
89
+ taskIdentifier,
90
+ } : TestTaskOptions ) : Promise < TestTaskResult > {
91
+ const environment = await this . #prismaClient. runtimeEnvironment . findFirstOrThrow ( {
92
+ where : {
93
+ slug : environmentSlug ,
94
+ project : {
95
+ slug : projectSlug ,
96
+ } ,
97
+ orgMember : environmentSlug === "dev" ? { userId } : undefined ,
98
+ } ,
76
99
select : {
77
100
id : true ,
78
- filePath : true ,
79
- exportName : true ,
80
- slug : true ,
81
- triggerSource : true ,
82
- runtimeEnvironment : {
101
+ type : true ,
102
+ orgMember : {
83
103
select : {
84
- id : true ,
85
- type : true ,
86
- orgMember : {
104
+ user : {
87
105
select : {
88
- user : {
89
- select : {
90
- id : true ,
91
- name : true ,
92
- displayName : true ,
93
- } ,
94
- } ,
106
+ id : true ,
107
+ name : true ,
108
+ displayName : true ,
95
109
} ,
96
110
} ,
97
111
} ,
98
112
} ,
99
113
} ,
100
- where : {
101
- friendlyId : taskFriendlyId ,
102
- } ,
103
114
} ) ;
104
115
116
+ let task : BackgroundWorkerTask | null = null ;
117
+ if ( environment . type !== "DEVELOPMENT" ) {
118
+ const deployment = await findCurrentWorkerDeployment ( environment . id ) ;
119
+ if ( deployment ) {
120
+ task = deployment . worker ?. tasks . find ( ( t ) => t . slug === taskIdentifier ) ?? null ;
121
+ }
122
+ } else {
123
+ task = await this . #prismaClient. backgroundWorkerTask . findFirst ( {
124
+ where : {
125
+ slug : taskIdentifier ,
126
+ runtimeEnvironmentId : environment . id ,
127
+ } ,
128
+ orderBy : {
129
+ createdAt : "desc" ,
130
+ } ,
131
+ } ) ;
132
+ }
133
+
134
+ if ( ! task ) {
135
+ return {
136
+ foundTask : false ,
137
+ } ;
138
+ }
139
+
105
140
const latestRuns = await this . #prismaClient. $queryRaw < RawRun [ ] > `
106
141
WITH taskruns AS (
107
- SELECT
108
- tr.*
109
- FROM
142
+ SELECT
143
+ tr.*
144
+ FROM
110
145
${ sqlDatabaseSchema } ."TaskRun" as tr
111
146
JOIN
112
147
${ sqlDatabaseSchema } ."BackgroundWorkerTask" as bwt
113
148
ON
114
149
tr."taskIdentifier" = bwt.slug
115
150
WHERE
116
- bwt."friendlyId" = ${ taskFriendlyId } AND
117
- tr."runtimeEnvironmentId" = ${ task . runtimeEnvironment . id }
118
- ORDER BY
151
+ bwt."friendlyId" = ${ task . friendlyId } AND
152
+ tr."runtimeEnvironmentId" = ${ environment . id }
153
+ ORDER BY
119
154
tr."createdAt" DESC
120
155
LIMIT 5
121
156
)
122
- SELECT
157
+ SELECT
123
158
taskr.id,
124
159
taskr.number,
125
160
taskr."friendlyId",
@@ -131,7 +166,7 @@ export class TestTaskPresenter {
131
166
taskr."seedMetadata",
132
167
taskr."seedMetadataType",
133
168
taskr."runtimeEnvironmentId"
134
- FROM
169
+ FROM
135
170
taskruns AS taskr
136
171
WHERE
137
172
taskr."payloadType" = 'application/json' OR taskr."payloadType" = 'application/super+json'
@@ -143,58 +178,64 @@ export class TestTaskPresenter {
143
178
taskIdentifier : task . slug ,
144
179
filePath : task . filePath ,
145
180
exportName : task . exportName ,
146
- friendlyId : taskFriendlyId ,
181
+ friendlyId : task . friendlyId ,
147
182
environment : {
148
- id : task . runtimeEnvironment . id ,
149
- type : task . runtimeEnvironment . type ,
150
- userId : task . runtimeEnvironment . orgMember ?. user . id ,
151
- userName : getUsername ( task . runtimeEnvironment . orgMember ?. user ) ,
183
+ id : environment . id ,
184
+ type : environment . type ,
185
+ userId : environment . orgMember ?. user . id ,
186
+ userName : getUsername ( environment . orgMember ?. user ) ,
152
187
} ,
153
188
} ;
154
189
155
190
switch ( task . triggerSource ) {
156
191
case "STANDARD" :
157
192
return {
158
- triggerSource : "STANDARD" ,
159
- task : taskWithEnvironment ,
160
- runs : await Promise . all (
161
- latestRuns . map ( async ( r ) => {
162
- const number = Number ( r . number ) ;
163
-
164
- return {
165
- ...r ,
166
- number,
167
- payload : await prettyPrintPacket ( r . payload , r . payloadType ) ,
168
- metadata : r . seedMetadata
169
- ? await prettyPrintPacket ( r . seedMetadata , r . seedMetadataType )
170
- : undefined ,
171
- } ;
172
- } )
173
- ) ,
174
- } ;
175
- case "SCHEDULED" :
176
- const possibleTimezones = getTimezones ( ) ;
177
- return {
178
- triggerSource : "SCHEDULED" ,
179
- task : taskWithEnvironment ,
180
- possibleTimezones,
181
- runs : (
182
- await Promise . all (
193
+ foundTask : true ,
194
+ task : {
195
+ triggerSource : "STANDARD" ,
196
+ task : taskWithEnvironment ,
197
+ runs : await Promise . all (
183
198
latestRuns . map ( async ( r ) => {
184
199
const number = Number ( r . number ) ;
185
200
186
- const payload = await getScheduleTaskRunPayload ( r ) ;
187
-
188
- if ( payload . success ) {
189
- return {
190
- ...r ,
191
- number,
192
- payload : payload . data ,
193
- } ;
194
- }
201
+ return {
202
+ ...r ,
203
+ number,
204
+ payload : await prettyPrintPacket ( r . payload , r . payloadType ) ,
205
+ metadata : r . seedMetadata
206
+ ? await prettyPrintPacket ( r . seedMetadata , r . seedMetadataType )
207
+ : undefined ,
208
+ } ;
195
209
} )
196
- )
197
- ) . filter ( Boolean ) ,
210
+ ) ,
211
+ } ,
212
+ } ;
213
+ case "SCHEDULED" :
214
+ const possibleTimezones = getTimezones ( ) ;
215
+ return {
216
+ foundTask : true ,
217
+ task : {
218
+ triggerSource : "SCHEDULED" ,
219
+ task : taskWithEnvironment ,
220
+ possibleTimezones,
221
+ runs : (
222
+ await Promise . all (
223
+ latestRuns . map ( async ( r ) => {
224
+ const number = Number ( r . number ) ;
225
+
226
+ const payload = await getScheduleTaskRunPayload ( r ) ;
227
+
228
+ if ( payload . success ) {
229
+ return {
230
+ ...r ,
231
+ number,
232
+ payload : payload . data ,
233
+ } ;
234
+ }
235
+ } )
236
+ )
237
+ ) . filter ( Boolean ) ,
238
+ } ,
198
239
} ;
199
240
}
200
241
}
0 commit comments