mirror of
https://github.com/GrandpaNutz/fafda.git
synced 2026-03-11 22:15:35 +00:00
135 lines
3.1 KiB
Go
135 lines
3.1 KiB
Go
package github
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"io"
|
|
"net/http"
|
|
"strings"
|
|
)
|
|
|
|
type Repository struct {
|
|
Name string `json:"name"`
|
|
FullName string `json:"full_name"`
|
|
Owner struct {
|
|
Login string `json:"login"`
|
|
} `json:"owner"`
|
|
}
|
|
|
|
type Release struct {
|
|
Id int64 `json:"id"`
|
|
TagName string `json:"tag_name"`
|
|
}
|
|
|
|
type ReleaseInfo struct {
|
|
AuthToken string `json:"authToken"`
|
|
Username string `json:"username"`
|
|
Repository string `json:"repository"`
|
|
ReleaseId int64 `json:"releaseId"`
|
|
ReleaseTag string `json:"releaseTag"`
|
|
}
|
|
|
|
func fetchGitHubAPI(token, url string) ([]byte, error) {
|
|
req, err := http.NewRequest("GET", url, nil)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("error creating request: %v", err)
|
|
}
|
|
|
|
req.Header.Set("Authorization", "Bearer "+token)
|
|
req.Header.Set("Accept", "application/vnd.github.v3+json")
|
|
|
|
resp, err := http.DefaultClient.Do(req)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("error making request: %v", err)
|
|
}
|
|
defer resp.Body.Close()
|
|
|
|
if resp.StatusCode != http.StatusOK {
|
|
return nil, fmt.Errorf("API request failed with status: %s", resp.Status)
|
|
}
|
|
|
|
body, err := io.ReadAll(resp.Body)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("error reading response: %v", err)
|
|
}
|
|
|
|
return body, nil
|
|
}
|
|
|
|
func getRepositories(token string) ([]Repository, error) {
|
|
body, err := fetchGitHubAPI(token, "https://api.github.com/user/repos?per_page=100")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var repos []Repository
|
|
if err := json.Unmarshal(body, &repos); err != nil {
|
|
return nil, fmt.Errorf("error parsing repositories: %v", err)
|
|
}
|
|
|
|
return repos, nil
|
|
}
|
|
|
|
func getReleases(token, repoFullName string) ([]Release, error) {
|
|
url := fmt.Sprintf("https://api.github.com/repos/%s/releases", repoFullName)
|
|
body, err := fetchGitHubAPI(token, url)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var releases []Release
|
|
if err := json.Unmarshal(body, &releases); err != nil {
|
|
return nil, fmt.Errorf("error parsing releases: %v", err)
|
|
}
|
|
|
|
return releases, nil
|
|
}
|
|
|
|
func GetAllReleasesInfo(tokens []string) ([]ReleaseInfo, error) {
|
|
var allReleases []ReleaseInfo
|
|
|
|
for _, token := range tokens {
|
|
repos, err := getRepositories(token)
|
|
if err != nil {
|
|
fmt.Printf("Warning: error fetching repositories for token: %v\n", err)
|
|
continue
|
|
}
|
|
|
|
for _, repo := range repos {
|
|
releases, err := getReleases(token, repo.FullName)
|
|
if err != nil {
|
|
fmt.Printf("Warning: error fetching releases for %s: %v\n", repo.FullName, err)
|
|
continue
|
|
}
|
|
|
|
for _, release := range releases {
|
|
releaseInfo := ReleaseInfo{
|
|
Username: strings.ToLower(repo.Owner.Login),
|
|
Repository: repo.Name,
|
|
ReleaseId: release.Id,
|
|
ReleaseTag: release.TagName,
|
|
AuthToken: token,
|
|
}
|
|
allReleases = append(allReleases, releaseInfo)
|
|
}
|
|
}
|
|
}
|
|
|
|
return allReleases, nil
|
|
}
|
|
|
|
func ListReleases(tokens []string) {
|
|
releases, err := GetAllReleasesInfo(tokens)
|
|
if err != nil {
|
|
fmt.Printf("Error: %v\n", err)
|
|
return
|
|
}
|
|
|
|
output, err := json.MarshalIndent(releases, "", " ")
|
|
if err != nil {
|
|
fmt.Printf("Error marshaling to JSON: %v\n", err)
|
|
return
|
|
}
|
|
|
|
fmt.Println(string(output))
|
|
}
|