github.com/cli/cli@v1.14.1-0.20210902173923-1af6a669e342/pkg/cmd/release/list/http.go (about)

     1  package list
     2  
     3  import (
     4  	"context"
     5  	"net/http"
     6  	"time"
     7  
     8  	"github.com/cli/cli/internal/ghinstance"
     9  	"github.com/cli/cli/internal/ghrepo"
    10  	"github.com/shurcooL/githubv4"
    11  	"github.com/shurcooL/graphql"
    12  )
    13  
    14  type Release struct {
    15  	Name         string
    16  	TagName      string
    17  	IsDraft      bool
    18  	IsPrerelease bool
    19  	CreatedAt    time.Time
    20  	PublishedAt  time.Time
    21  }
    22  
    23  func fetchReleases(httpClient *http.Client, repo ghrepo.Interface, limit int) ([]Release, error) {
    24  	type responseData struct {
    25  		Repository struct {
    26  			Releases struct {
    27  				Nodes    []Release
    28  				PageInfo struct {
    29  					HasNextPage bool
    30  					EndCursor   string
    31  				}
    32  			} `graphql:"releases(first: $perPage, orderBy: {field: CREATED_AT, direction: DESC}, after: $endCursor)"`
    33  		} `graphql:"repository(owner: $owner, name: $name)"`
    34  	}
    35  
    36  	perPage := limit
    37  	if limit > 100 {
    38  		perPage = 100
    39  	}
    40  
    41  	variables := map[string]interface{}{
    42  		"owner":     githubv4.String(repo.RepoOwner()),
    43  		"name":      githubv4.String(repo.RepoName()),
    44  		"perPage":   githubv4.Int(perPage),
    45  		"endCursor": (*githubv4.String)(nil),
    46  	}
    47  
    48  	gql := graphql.NewClient(ghinstance.GraphQLEndpoint(repo.RepoHost()), httpClient)
    49  
    50  	var releases []Release
    51  loop:
    52  	for {
    53  		var query responseData
    54  		err := gql.QueryNamed(context.Background(), "RepositoryReleaseList", &query, variables)
    55  		if err != nil {
    56  			return nil, err
    57  		}
    58  
    59  		for _, r := range query.Repository.Releases.Nodes {
    60  			releases = append(releases, r)
    61  			if len(releases) == limit {
    62  				break loop
    63  			}
    64  		}
    65  
    66  		if !query.Repository.Releases.PageInfo.HasNextPage {
    67  			break
    68  		}
    69  		variables["endCursor"] = githubv4.String(query.Repository.Releases.PageInfo.EndCursor)
    70  	}
    71  
    72  	return releases, nil
    73  }