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