4
4
RunStatus ,
5
5
SerializedError ,
6
6
TaskRunError ,
7
+ TriggerFunction ,
7
8
conditionallyImportPacket ,
8
9
createJsonErrorObject ,
9
10
logger ,
@@ -14,6 +15,47 @@ import assertNever from "assert-never";
14
15
import { AuthenticatedEnvironment } from "~/services/apiAuth.server" ;
15
16
import { generatePresignedUrl } from "~/v3/r2.server" ;
16
17
import { BasePresenter } from "./basePresenter.server" ;
18
+ import { prisma } from "~/db.server" ;
19
+
20
+ // Build 'select' object
21
+ const commonRunSelect = {
22
+ id : true ,
23
+ friendlyId : true ,
24
+ status : true ,
25
+ taskIdentifier : true ,
26
+ createdAt : true ,
27
+ startedAt : true ,
28
+ updatedAt : true ,
29
+ completedAt : true ,
30
+ expiredAt : true ,
31
+ delayUntil : true ,
32
+ ttl : true ,
33
+ tags : true ,
34
+ costInCents : true ,
35
+ baseCostInCents : true ,
36
+ usageDurationMs : true ,
37
+ idempotencyKey : true ,
38
+ isTest : true ,
39
+ depth : true ,
40
+ lockedToVersion : {
41
+ select : {
42
+ version : true ,
43
+ } ,
44
+ } ,
45
+ resumeParentOnCompletion : true ,
46
+ batch : {
47
+ select : {
48
+ id : true ,
49
+ friendlyId : true ,
50
+ } ,
51
+ } ,
52
+ } satisfies Prisma . TaskRunSelect ;
53
+
54
+ type CommonRelatedRun = Prisma . Result <
55
+ typeof prisma . taskRun ,
56
+ { select : typeof commonRunSelect } ,
57
+ "findFirstOrThrow"
58
+ > ;
17
59
18
60
export class ApiRetrieveRunPresenter extends BasePresenter {
19
61
public async call (
@@ -22,7 +64,7 @@ export class ApiRetrieveRunPresenter extends BasePresenter {
22
64
showSecretDetails : boolean
23
65
) : Promise < RetrieveRunResponse | undefined > {
24
66
return this . traceWithEnv ( "call" , env , async ( span ) => {
25
- const taskRun = await this . _prisma . taskRun . findUnique ( {
67
+ const taskRun = await this . _replica . taskRun . findFirst ( {
26
68
where : {
27
69
friendlyId,
28
70
runtimeEnvironmentId : env . id ,
@@ -36,6 +78,23 @@ export class ApiRetrieveRunPresenter extends BasePresenter {
36
78
lockedToVersion : true ,
37
79
schedule : true ,
38
80
tags : true ,
81
+ batch : {
82
+ select : {
83
+ id : true ,
84
+ friendlyId : true ,
85
+ } ,
86
+ } ,
87
+ parentTaskRun : {
88
+ select : commonRunSelect ,
89
+ } ,
90
+ rootTaskRun : {
91
+ select : commonRunSelect ,
92
+ } ,
93
+ childRuns : {
94
+ select : {
95
+ ...commonRunSelect ,
96
+ } ,
97
+ } ,
39
98
} ,
40
99
} ) ;
41
100
@@ -101,29 +160,11 @@ export class ApiRetrieveRunPresenter extends BasePresenter {
101
160
const apiStatus = ApiRetrieveRunPresenter . apiStatusFromRunStatus ( taskRun . status ) ;
102
161
103
162
return {
104
- id : taskRun . friendlyId ,
105
- status : apiStatus ,
106
- taskIdentifier : taskRun . taskIdentifier ,
107
- idempotencyKey : taskRun . idempotencyKey ?? undefined ,
108
- version : taskRun . lockedToVersion ? taskRun . lockedToVersion . version : undefined ,
109
- createdAt : taskRun . createdAt ?? undefined ,
110
- updatedAt : taskRun . updatedAt ?? undefined ,
111
- startedAt : taskRun . startedAt ?? taskRun . lockedAt ?? undefined ,
112
- finishedAt : ApiRetrieveRunPresenter . isStatusFinished ( apiStatus )
113
- ? taskRun . updatedAt
114
- : undefined ,
115
- delayedUntil : taskRun . delayUntil ?? undefined ,
163
+ ...createCommonRunStructure ( taskRun ) ,
116
164
payload : $payload ,
117
165
payloadPresignedUrl : $payloadPresignedUrl ,
118
166
output : $output ,
119
167
outputPresignedUrl : $outputPresignedUrl ,
120
- isTest : taskRun . isTest ,
121
- ttl : taskRun . ttl ?? undefined ,
122
- expiredAt : taskRun . expiredAt ?? undefined ,
123
- tags : taskRun . tags . map ( ( t ) => t . name ) . sort ( ( a , b ) => a . localeCompare ( b ) ) ,
124
- costInCents : taskRun . costInCents ,
125
- baseCostInCents : taskRun . baseCostInCents ,
126
- durationMs : taskRun . usageDurationMs ,
127
168
schedule : taskRun . schedule
128
169
? {
129
170
id : taskRun . schedule . friendlyId ,
@@ -138,7 +179,6 @@ export class ApiRetrieveRunPresenter extends BasePresenter {
138
179
} ,
139
180
}
140
181
: undefined ,
141
- ...ApiRetrieveRunPresenter . apiBooleanHelpersFromRunStatus ( apiStatus ) ,
142
182
attempts : ! showSecretDetails
143
183
? [ ]
144
184
: taskRun . attempts . map ( ( a ) => ( {
@@ -150,6 +190,13 @@ export class ApiRetrieveRunPresenter extends BasePresenter {
150
190
completedAt : a . completedAt ?? undefined ,
151
191
error : ApiRetrieveRunPresenter . apiErrorFromError ( a . error ) ,
152
192
} ) ) ,
193
+ relatedRuns : {
194
+ root : taskRun . rootTaskRun ? createCommonRunStructure ( taskRun . rootTaskRun ) : undefined ,
195
+ parent : taskRun . parentTaskRun
196
+ ? createCommonRunStructure ( taskRun . parentTaskRun )
197
+ : undefined ,
198
+ children : taskRun . childRuns . map ( ( r ) => createCommonRunStructure ( r ) ) ,
199
+ } ,
153
200
} ;
154
201
} ) ;
155
202
}
@@ -225,6 +272,12 @@ export class ApiRetrieveRunPresenter extends BasePresenter {
225
272
}
226
273
}
227
274
275
+ static apiBooleanHelpersFromTaskRunStatus ( status : TaskRunStatus ) {
276
+ return ApiRetrieveRunPresenter . apiBooleanHelpersFromRunStatus (
277
+ ApiRetrieveRunPresenter . apiStatusFromRunStatus ( status )
278
+ ) ;
279
+ }
280
+
228
281
static apiBooleanHelpersFromRunStatus ( status : RunStatus ) {
229
282
const isQueued = status === "QUEUED" || status === "WAITING_FOR_DEPLOY" || status === "DELAYED" ;
230
283
const isExecuting = status === "EXECUTING" || status === "REATTEMPTING" || status === "FROZEN" ;
@@ -275,3 +328,39 @@ export class ApiRetrieveRunPresenter extends BasePresenter {
275
328
}
276
329
}
277
330
}
331
+
332
+ function createCommonRunStructure ( run : CommonRelatedRun ) {
333
+ return {
334
+ id : run . friendlyId ,
335
+ taskIdentifier : run . taskIdentifier ,
336
+ idempotencyKey : run . idempotencyKey ?? undefined ,
337
+ version : run . lockedToVersion ?. version ,
338
+ status : ApiRetrieveRunPresenter . apiStatusFromRunStatus ( run . status ) ,
339
+ createdAt : run . createdAt ,
340
+ startedAt : run . startedAt ?? undefined ,
341
+ updatedAt : run . updatedAt ,
342
+ finishedAt : run . completedAt ?? undefined ,
343
+ expiredAt : run . expiredAt ?? undefined ,
344
+ delayedUntil : run . delayUntil ?? undefined ,
345
+ ttl : run . ttl ?? undefined ,
346
+ costInCents : run . costInCents ,
347
+ baseCostInCents : run . baseCostInCents ,
348
+ durationMs : run . usageDurationMs ,
349
+ isTest : run . isTest ,
350
+ depth : run . depth ,
351
+ tags : run . tags
352
+ . map ( ( t : { name : string } ) => t . name )
353
+ . sort ( ( a : string , b : string ) => a . localeCompare ( b ) ) ,
354
+ ...ApiRetrieveRunPresenter . apiBooleanHelpersFromTaskRunStatus ( run . status ) ,
355
+ triggerFunction : resolveTriggerFunction ( run ) ,
356
+ batchId : run . batch ?. friendlyId ,
357
+ } ;
358
+ }
359
+
360
+ function resolveTriggerFunction ( run : CommonRelatedRun ) : TriggerFunction {
361
+ if ( run . batch ) {
362
+ return run . resumeParentOnCompletion ? "batchTriggerAndWait" : "batchTrigger" ;
363
+ } else {
364
+ return run . resumeParentOnCompletion ? "triggerAndWait" : "trigger" ;
365
+ }
366
+ }
0 commit comments