github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/atc/api/buildserver/list.go (about) 1 package buildserver 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "net/http" 7 "strconv" 8 9 "github.com/pf-qiu/concourse/v6/atc" 10 "github.com/pf-qiu/concourse/v6/atc/api/accessor" 11 "github.com/pf-qiu/concourse/v6/atc/api/present" 12 "github.com/pf-qiu/concourse/v6/atc/db" 13 ) 14 15 func (s *Server) ListBuilds(w http.ResponseWriter, r *http.Request) { 16 17 logger := s.logger.Session("list-builds") 18 19 var ( 20 err error 21 from int 22 to int 23 ) 24 25 page := db.Page{} 26 27 urlLimit := r.FormValue(atc.PaginationQueryLimit) 28 page.Limit, _ = strconv.Atoi(urlLimit) 29 if page.Limit == 0 { 30 page.Limit = atc.PaginationAPIDefaultLimit 31 } 32 33 urlFrom := r.FormValue(atc.PaginationQueryFrom) 34 if urlFrom != "" { 35 from, _ = strconv.Atoi(urlFrom) 36 page.From = db.NewIntPtr(from) 37 } 38 urlTo := r.FormValue(atc.PaginationQueryTo) 39 if urlTo != "" { 40 to, _ = strconv.Atoi(urlTo) 41 page.To = db.NewIntPtr(to) 42 } 43 44 timestamps := r.FormValue(atc.PaginationQueryTimestamps) 45 if timestamps != "" { 46 page.UseDate = true 47 } 48 49 var builds []db.Build 50 var pagination db.Pagination 51 52 acc := accessor.GetAccessor(r) 53 if acc.IsAdmin() { 54 builds, pagination, err = s.buildFactory.AllBuilds(page) 55 } else { 56 builds, pagination, err = s.buildFactory.VisibleBuilds(acc.TeamNames(), page) 57 } 58 59 if err != nil { 60 logger.Error("failed-to-get-all-builds", err) 61 w.WriteHeader(http.StatusInternalServerError) 62 return 63 } 64 65 if pagination.Older != nil { 66 s.addNextLink(w, *pagination.Older) 67 } 68 69 if pagination.Newer != nil { 70 s.addPreviousLink(w, *pagination.Newer) 71 } 72 73 w.Header().Set("Content-Type", "application/json") 74 w.WriteHeader(http.StatusOK) 75 76 atc := make([]atc.Build, len(builds)) 77 for i := 0; i < len(builds); i++ { 78 build := builds[i] 79 atc[i] = present.Build(build) 80 } 81 82 err = json.NewEncoder(w).Encode(atc) 83 if err != nil { 84 logger.Error("failed-to-encode-builds", err) 85 w.WriteHeader(http.StatusInternalServerError) 86 } 87 } 88 89 func (s *Server) addNextLink(w http.ResponseWriter, page db.Page) { 90 w.Header().Add("Link", fmt.Sprintf( 91 `<%s/api/v1/builds?%s=%d&%s=%d>; rel="%s"`, 92 s.externalURL, 93 atc.PaginationQueryTo, 94 *page.To, 95 atc.PaginationQueryLimit, 96 page.Limit, 97 atc.LinkRelNext, 98 )) 99 } 100 101 func (s *Server) addPreviousLink(w http.ResponseWriter, page db.Page) { 102 w.Header().Add("Link", fmt.Sprintf( 103 `<%s/api/v1/builds?%s=%d&%s=%d>; rel="%s"`, 104 s.externalURL, 105 atc.PaginationQueryFrom, 106 *page.From, 107 atc.PaginationQueryLimit, 108 page.Limit, 109 atc.LinkRelPrevious, 110 )) 111 }