@@ -6510,6 +6510,78 @@ func (ls *LocalStorage) ListExecutionVCs(ctx context.Context, filters types.VCFi
65106510 return infos , nil
65116511}
65126512
6513+ func (ls * LocalStorage ) ListWorkflowVCStatusSummaries (ctx context.Context , workflowIDs []string ) ([]* types.WorkflowVCStatusAggregation , error ) {
6514+ if err := ctx .Err (); err != nil {
6515+ return nil , fmt .Errorf ("context cancelled during workflow VC status summary query: %w" , err )
6516+ }
6517+
6518+ if len (workflowIDs ) == 0 {
6519+ return []* types.WorkflowVCStatusAggregation {}, nil
6520+ }
6521+
6522+ placeholders := make ([]string , len (workflowIDs ))
6523+ for i := range workflowIDs {
6524+ placeholders [i ] = "?"
6525+ }
6526+
6527+ query := fmt .Sprintf (`
6528+ SELECT workflow_id,
6529+ COUNT(*) AS vc_count,
6530+ SUM(CASE WHEN status = ? THEN 1 ELSE 0 END) AS verified_count,
6531+ SUM(CASE WHEN status = ? OR status = ? THEN 1 ELSE 0 END) AS failed_count,
6532+ MAX(created_at) AS last_created_at
6533+ FROM execution_vcs
6534+ WHERE workflow_id IN (%s)
6535+ GROUP BY workflow_id
6536+ ` , strings .Join (placeholders , "," ))
6537+
6538+ args := []interface {}{
6539+ string (types .ExecutionStatusSucceeded ),
6540+ string (types .ExecutionStatusFailed ),
6541+ string (types .ExecutionStatusTimeout ),
6542+ }
6543+ for _ , id := range workflowIDs {
6544+ args = append (args , id )
6545+ }
6546+
6547+ rows , err := ls .db .QueryContext (ctx , query , args ... )
6548+ if err != nil {
6549+ return nil , fmt .Errorf ("failed to query workflow VC status summaries: %w" , err )
6550+ }
6551+ defer rows .Close ()
6552+
6553+ var summaries []* types.WorkflowVCStatusAggregation
6554+ for rows .Next () {
6555+ if err := ctx .Err (); err != nil {
6556+ return nil , fmt .Errorf ("context cancelled during workflow VC status iteration: %w" , err )
6557+ }
6558+
6559+ var lastCreated sql.NullTime
6560+ summary := & types.WorkflowVCStatusAggregation {}
6561+ if err := rows .Scan (
6562+ & summary .WorkflowID ,
6563+ & summary .VCCount ,
6564+ & summary .VerifiedCount ,
6565+ & summary .FailedCount ,
6566+ & lastCreated ,
6567+ ); err != nil {
6568+ return nil , fmt .Errorf ("failed to scan workflow VC status summary: %w" , err )
6569+ }
6570+
6571+ if lastCreated .Valid {
6572+ summary .LastCreatedAt = & lastCreated .Time
6573+ }
6574+
6575+ summaries = append (summaries , summary )
6576+ }
6577+
6578+ if err := rows .Err (); err != nil {
6579+ return nil , fmt .Errorf ("workflow VC status summary rows error: %w" , err )
6580+ }
6581+
6582+ return summaries , nil
6583+ }
6584+
65136585func (ls * LocalStorage ) CountExecutionVCs (ctx context.Context , filters types.VCFilters ) (int , error ) {
65146586 if err := ctx .Err (); err != nil {
65156587 return 0 , fmt .Errorf ("context cancelled during count execution VCs: %w" , err )
0 commit comments