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 }