44 RunStatus ,
55 SerializedError ,
66 TaskRunError ,
7+ TriggerFunction ,
78 conditionallyImportPacket ,
89 createJsonErrorObject ,
910 logger ,
@@ -14,6 +15,47 @@ import assertNever from "assert-never";
1415import { AuthenticatedEnvironment } from "~/services/apiAuth.server" ;
1516import { generatePresignedUrl } from "~/v3/r2.server" ;
1617import { 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+ > ;
1759
1860export class ApiRetrieveRunPresenter extends BasePresenter {
1961 public async call (
@@ -22,7 +64,7 @@ export class ApiRetrieveRunPresenter extends BasePresenter {
2264 showSecretDetails : boolean
2365 ) : Promise < RetrieveRunResponse | undefined > {
2466 return this . traceWithEnv ( "call" , env , async ( span ) => {
25- const taskRun = await this . _prisma . taskRun . findUnique ( {
67+ const taskRun = await this . _replica . taskRun . findFirst ( {
2668 where : {
2769 friendlyId,
2870 runtimeEnvironmentId : env . id ,
@@ -36,6 +78,23 @@ export class ApiRetrieveRunPresenter extends BasePresenter {
3678 lockedToVersion : true ,
3779 schedule : true ,
3880 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+ } ,
3998 } ,
4099 } ) ;
41100
@@ -101,29 +160,11 @@ export class ApiRetrieveRunPresenter extends BasePresenter {
101160 const apiStatus = ApiRetrieveRunPresenter . apiStatusFromRunStatus ( taskRun . status ) ;
102161
103162 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 ) ,
116164 payload : $payload ,
117165 payloadPresignedUrl : $payloadPresignedUrl ,
118166 output : $output ,
119167 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 ,
127168 schedule : taskRun . schedule
128169 ? {
129170 id : taskRun . schedule . friendlyId ,
@@ -138,7 +179,6 @@ export class ApiRetrieveRunPresenter extends BasePresenter {
138179 } ,
139180 }
140181 : undefined ,
141- ...ApiRetrieveRunPresenter . apiBooleanHelpersFromRunStatus ( apiStatus ) ,
142182 attempts : ! showSecretDetails
143183 ? [ ]
144184 : taskRun . attempts . map ( ( a ) => ( {
@@ -150,6 +190,13 @@ export class ApiRetrieveRunPresenter extends BasePresenter {
150190 completedAt : a . completedAt ?? undefined ,
151191 error : ApiRetrieveRunPresenter . apiErrorFromError ( a . error ) ,
152192 } ) ) ,
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+ } ,
153200 } ;
154201 } ) ;
155202 }
@@ -225,6 +272,12 @@ export class ApiRetrieveRunPresenter extends BasePresenter {
225272 }
226273 }
227274
275+ static apiBooleanHelpersFromTaskRunStatus ( status : TaskRunStatus ) {
276+ return ApiRetrieveRunPresenter . apiBooleanHelpersFromRunStatus (
277+ ApiRetrieveRunPresenter . apiStatusFromRunStatus ( status )
278+ ) ;
279+ }
280+
228281 static apiBooleanHelpersFromRunStatus ( status : RunStatus ) {
229282 const isQueued = status === "QUEUED" || status === "WAITING_FOR_DEPLOY" || status === "DELAYED" ;
230283 const isExecuting = status === "EXECUTING" || status === "REATTEMPTING" || status === "FROZEN" ;
@@ -275,3 +328,39 @@ export class ApiRetrieveRunPresenter extends BasePresenter {
275328 }
276329 }
277330}
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