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  }