|
1 | 1 | package list |
2 | 2 |
|
3 | 3 | import ( |
4 | | - "fmt" |
5 | 4 | "net/http" |
6 | | - "net/url" |
7 | 5 | "sort" |
| 6 | + "strings" |
| 7 | + "time" |
8 | 8 |
|
9 | 9 | "github.com/cli/cli/api" |
10 | 10 | "github.com/cli/cli/pkg/cmd/gist/shared" |
11 | 11 | ) |
12 | 12 |
|
13 | 13 | func listGists(client *http.Client, hostname string, limit int, visibility string) ([]shared.Gist, error) { |
14 | | - result := []shared.Gist{} |
| 14 | + type response struct { |
| 15 | + Viewer struct { |
| 16 | + Gists struct { |
| 17 | + Nodes []struct { |
| 18 | + Description string |
| 19 | + Files []struct { |
| 20 | + Name string |
| 21 | + Language struct { |
| 22 | + Name string |
| 23 | + } |
| 24 | + Extension string |
| 25 | + } |
| 26 | + IsPublic bool |
| 27 | + Name string |
| 28 | + UpdatedAt time.Time |
| 29 | + } |
| 30 | + } |
| 31 | + } |
| 32 | + } |
| 33 | + |
| 34 | + query := ` |
| 35 | + query ListGists($visibility: GistPrivacy!, $per_page: Int = 10) { |
| 36 | + viewer { |
| 37 | + gists(first: $per_page, privacy: $visibility) { |
| 38 | + nodes { |
| 39 | + name |
| 40 | + files { |
| 41 | + name |
| 42 | + language { |
| 43 | + name |
| 44 | + } |
| 45 | + extension |
| 46 | + } |
| 47 | + description |
| 48 | + updatedAt |
| 49 | + isPublic |
| 50 | + } |
| 51 | + } |
| 52 | + } |
| 53 | + }` |
15 | 54 |
|
16 | | - query := url.Values{} |
17 | | - if visibility == "all" { |
18 | | - query.Add("per_page", fmt.Sprintf("%d", limit)) |
19 | | - } else { |
20 | | - query.Add("per_page", "100") |
| 55 | + if visibility != "all" { |
| 56 | + limit = 100 |
| 57 | + } |
| 58 | + variables := map[string]interface{}{ |
| 59 | + "per_page": limit, |
| 60 | + "visibility": strings.ToUpper(visibility), |
21 | 61 | } |
22 | 62 |
|
23 | | - // TODO switch to graphql |
24 | 63 | apiClient := api.NewClientFromHTTP(client) |
25 | | - err := apiClient.REST(hostname, "GET", "gists?"+query.Encode(), nil, &result) |
| 64 | + var result response |
| 65 | + err := apiClient.GraphQL(hostname, query, variables, &result) |
26 | 66 | if err != nil { |
27 | 67 | return nil, err |
28 | 68 | } |
29 | 69 |
|
30 | 70 | gists := []shared.Gist{} |
| 71 | + for _, gist := range result.Viewer.Gists.Nodes { |
31 | 72 |
|
32 | | - for _, gist := range result { |
33 | | - if len(gists) == limit { |
34 | | - break |
35 | | - } |
36 | | - if visibility == "all" || (visibility == "secret" && !gist.Public) || (visibility == "public" && gist.Public) { |
37 | | - gists = append(gists, gist) |
| 73 | + files := map[string]*shared.GistFile{} |
| 74 | + for _, file := range gist.Files { |
| 75 | + files[file.Name] = &shared.GistFile{ |
| 76 | + Filename: file.Name, |
| 77 | + Type: file.Extension, |
| 78 | + Language: file.Language.Name, |
| 79 | + } |
38 | 80 | } |
| 81 | + |
| 82 | + gists = append( |
| 83 | + gists, |
| 84 | + shared.Gist{ |
| 85 | + ID: gist.Name, |
| 86 | + Description: gist.Description, |
| 87 | + Files: files, |
| 88 | + UpdatedAt: gist.UpdatedAt, |
| 89 | + Public: gist.IsPublic, |
| 90 | + }, |
| 91 | + ) |
39 | 92 | } |
40 | 93 |
|
41 | 94 | sort.SliceStable(gists, func(i, j int) bool { |
|
0 commit comments