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 }