github.com/ungtb10d/cli/v2@v2.0.0-20221110210412-98537dd9d6a1/pkg/cmd/release/list/http.go (about)

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