11using PkgDiff . Application . Interfaces ;
2- using PkgDiff . Domain . Entities ;
3- using PkgDiff . Domain . Interfaces ;
2+ using PkgDiff . Application . Jobs ;
43using PkgDiff . Shared . DTOs ;
54using Hangfire ;
65using Hangfire . Storage ;
7- using Microsoft . AspNetCore . Identity ;
6+ using Hangfire . Storage . Monitoring ;
87
98namespace PkgDiff . Application . Services ;
109
@@ -35,30 +34,40 @@ public Task<JobsOverview> GetJobsOverviewAsync()
3534 foreach ( var job in succeeded )
3635 {
3736 var details = monitor . JobDetails ( job . Key ) ;
37+ var target = JobDescriptions . Target ( job . Value . Job ) ;
3838 allJobs . Add ( new RecentJobInfo
3939 {
4040 JobId = job . Key ,
41- JobName = GetJobDisplayName ( job . Value . Job ) ,
41+ JobName = JobDescriptions . TechnicalName ( job . Value . Job ) ,
42+ JobType = JobDescriptions . Label ( job . Value . Job ) ,
4243 State = "Succeeded" ,
4344 CreatedAt = details ? . CreatedAt ,
4445 CompletedAt = job . Value . SucceededAt ,
4546 Duration = job . Value . TotalDuration ,
46- PackageId = ExtractPackageId ( job . Value . Job )
47+ PackageId = target . PackageId ,
48+ Registry = target . Registry ,
49+ Detail = target . Detail ,
50+ TriggeredBy = DescribeTrigger ( details )
4751 } ) ;
4852 }
4953
5054 foreach ( var job in failed )
5155 {
5256 var details = monitor . JobDetails ( job . Key ) ;
57+ var target = JobDescriptions . Target ( job . Value . Job ) ;
5358 allJobs . Add ( new RecentJobInfo
5459 {
5560 JobId = job . Key ,
56- JobName = GetJobDisplayName ( job . Value . Job ) ,
61+ JobName = JobDescriptions . TechnicalName ( job . Value . Job ) ,
62+ JobType = JobDescriptions . Label ( job . Value . Job ) ,
5763 State = "Failed" ,
5864 CreatedAt = details ? . CreatedAt ,
5965 CompletedAt = job . Value . FailedAt ,
6066 ExceptionMessage = job . Value . ExceptionMessage ,
61- PackageId = ExtractPackageId ( job . Value . Job )
67+ PackageId = target . PackageId ,
68+ Registry = target . Registry ,
69+ Detail = target . Detail ,
70+ TriggeredBy = DescribeTrigger ( details )
6271 } ) ;
6372 }
6473
@@ -104,28 +113,38 @@ public Task<JobsOverview> GetJobsOverviewAsync()
104113 var enqueuedJobs = monitor . EnqueuedJobs ( queue . Name , 0 , 50 ) ;
105114 foreach ( var job in enqueuedJobs )
106115 {
116+ var target = JobDescriptions . Target ( job . Value . Job ) ;
107117 queuedJobs . Add ( new QueuedJobInfo
108118 {
109119 JobId = job . Key ,
110- JobName = GetJobDisplayName ( job . Value . Job ) ,
120+ JobName = JobDescriptions . TechnicalName ( job . Value . Job ) ,
121+ JobType = JobDescriptions . Label ( job . Value . Job ) ,
111122 State = "Enqueued" ,
112123 EnqueuedAt = job . Value . EnqueuedAt ,
113- PackageId = ExtractPackageId ( job . Value . Job )
124+ PackageId = target . PackageId ,
125+ Registry = target . Registry ,
126+ Detail = target . Detail ,
127+ TriggeredBy = DescribeTrigger ( monitor . JobDetails ( job . Key ) )
114128 } ) ;
115129 }
116130 }
117131
118132 var processingJobs = monitor . ProcessingJobs ( 0 , 50 ) ;
119133 foreach ( var job in processingJobs )
120134 {
135+ var target = JobDescriptions . Target ( job . Value . Job ) ;
121136 queuedJobs . Add ( new QueuedJobInfo
122137 {
123138 JobId = job . Key ,
124- JobName = GetJobDisplayName ( job . Value . Job ) ,
139+ JobName = JobDescriptions . TechnicalName ( job . Value . Job ) ,
140+ JobType = JobDescriptions . Label ( job . Value . Job ) ,
125141 State = "Processing" ,
126142 StartedAt = job . Value . StartedAt ,
127143 ServerId = job . Value . ServerId ,
128- PackageId = ExtractPackageId ( job . Value . Job )
144+ PackageId = target . PackageId ,
145+ Registry = target . Registry ,
146+ Detail = target . Detail ,
147+ TriggeredBy = DescribeTrigger ( monitor . JobDetails ( job . Key ) )
129148 } ) ;
130149 }
131150
@@ -142,35 +161,31 @@ public Task<JobsOverview> GetJobsOverviewAsync()
142161 } ) ;
143162 }
144163
145- private static string GetJobDisplayName ( Hangfire . Common . Job ? job )
164+ private static string ? DescribeTrigger ( JobDetailsDto ? details )
146165 {
147- if ( job == null ) return "Unknown" ;
148- return $ "{ job . Type . Name } .{ job . Method . Name } ";
166+ if ( details ? . Properties == null ) return null ;
167+
168+ if ( details . Properties . TryGetValue ( JobDescriptions . TriggerParameter , out var trigger ) )
169+ return ReadParameter ( trigger ) ;
170+
171+ if ( details . Properties . TryGetValue ( "RecurringJobId" , out var recurringJobId ) )
172+ return $ "Schedule · { ReadParameter ( recurringJobId ) } ";
173+
174+ return null ;
149175 }
150176
151- private static string ? ExtractPackageId ( Hangfire . Common . Job ? job )
177+ private static string ? ReadParameter ( string ? value )
152178 {
153- if ( job ? . Args == null || job . Args . Count == 0 ) return null ;
154-
155- if ( job . Args [ 0 ] is AnalyzeRequest request )
156- return request . PackageId ;
179+ if ( string . IsNullOrEmpty ( value ) ) return null ;
157180
158181 try
159182 {
160- var json = job . Args [ 0 ] ? . ToString ( ) ;
161- if ( json != null && json . Contains ( "PackageId" ) )
162- {
163- using var doc = System . Text . Json . JsonDocument . Parse ( json ) ;
164- if ( doc . RootElement . TryGetProperty ( "PackageId" , out var prop ) )
165- return prop . GetString ( ) ;
166- }
183+ return System . Text . Json . JsonSerializer . Deserialize < string > ( value ) ;
167184 }
168185 catch ( System . Text . Json . JsonException )
169186 {
170- // The argument is not JSON: this job has no package to show
187+ return value . Trim ( '"' ) ;
171188 }
172-
173- return null ;
174189 }
175190
176191 public Task TriggerJobAsync ( string jobId )
0 commit comments