github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/atc/api/pipelineserver/badge.go (about)

     1  package pipelineserver
     2  
     3  import (
     4  	"fmt"
     5  	"net/http"
     6  
     7  	"code.cloudfoundry.org/lager"
     8  
     9  	"github.com/pf-qiu/concourse/v6/atc/api/jobserver"
    10  	"github.com/pf-qiu/concourse/v6/atc/db"
    11  )
    12  
    13  func badgeForPipeline(pipeline db.Pipeline, logger lager.Logger) (jobserver.Badge, error) {
    14  	var build db.Build
    15  
    16  	jobStatusPrecedence := map[db.BuildStatus]int{
    17  		db.BuildStatusFailed:    1,
    18  		db.BuildStatusErrored:   2,
    19  		db.BuildStatusAborted:   3,
    20  		db.BuildStatusSucceeded: 4,
    21  	}
    22  
    23  	jobs, err := pipeline.Jobs()
    24  	if err != nil {
    25  		logger.Error("could-not-get-jobs", err)
    26  		return jobserver.Badge{}, err
    27  	}
    28  
    29  	for _, job := range jobs {
    30  		b, _, err := job.FinishedAndNextBuild()
    31  		if err != nil {
    32  			logger.Error("could-not-get-finished-and-next-build", err)
    33  			return jobserver.Badge{}, err
    34  		}
    35  
    36  		if b == nil {
    37  			continue
    38  		}
    39  
    40  		if build == nil || jobStatusPrecedence[b.Status()] < jobStatusPrecedence[build.Status()] {
    41  			build = b
    42  		}
    43  	}
    44  
    45  	return jobserver.BadgeForBuild(build), nil
    46  }
    47  
    48  func (s *Server) PipelineBadge(pipeline db.Pipeline) http.Handler {
    49  	logger := s.logger.Session("pipeline-badge")
    50  	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    51  		w.Header().Set("Content-type", "image/svg+xml")
    52  
    53  		w.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate")
    54  		w.Header().Set("Expires", "0")
    55  
    56  		w.WriteHeader(http.StatusOK)
    57  
    58  		badge, err := badgeForPipeline(pipeline, logger)
    59  		badge.EnrichFromQuery(r.URL.Query())
    60  		if err != nil {
    61  			w.WriteHeader(http.StatusInternalServerError)
    62  			return
    63  		}
    64  
    65  		fmt.Fprint(w, &badge)
    66  	})
    67  }