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  }