g2i/g2i/github.go
2019-03-16 16:26:56 +03:00

107 lines
2.2 KiB
Go

package g2i
import (
"context"
"time"
"encoding/json"
"net/http"
"io/ioutil"
"github.com/google/go-github/github"
log "github.com/sirupsen/logrus"
"golang.org/x/oauth2"
)
type GithubClient struct {
c *github.Client
Owner string
Repo string
token string
ctx context.Context
}
func NewGithubClient(config *Config, ctx context.Context) *GithubClient {
var ts oauth2.TokenSource
if config.Github.Token != "" {
ts = oauth2.StaticTokenSource(
&oauth2.Token{
AccessToken: config.Github.Token,
},
)
}
tc := oauth2.NewClient(ctx, ts)
client := github.NewClient(tc)
return &GithubClient{client, config.Github.RepoOwner, config.Github.Repo, config.Github.Token, ctx}
}
// GetIssues returns all repo issues
func (g *GithubClient) GetIssues() ([]*github.Issue, error) {
log.Print("Get repository issues")
issues, _, err := g.c.Issues.ListByRepo(g.ctx, g.Owner, g.Repo, nil)
return issues, err
}
// GetRepoEvents
func (g *GithubClient) EventsURL() (string, error) {
var eventsURL string
repos, _, err := g.c.Repositories.ListByOrg(g.ctx, g.Owner, nil)
if err != nil {
return eventsURL, err
}
for i, _ := range repos {
if *repos[i].Name == g.Repo {
eventsURL = *repos[i].EventsURL
break
}
}
return eventsURL, nil
}
// GetEvents returns repo events
func (g *GithubClient) GetEvents(eventsURL string) ([]github.Event, error) {
var events []github.Event
log.Info("Get repository events")
client := &http.Client{Timeout: time.Second * 15}
req, err := http.NewRequest("GET", eventsURL, nil)
if err != nil {
log.Error(err)
return events, err
}
resp, err := client.Do(req)
if err != nil {
log.Error(err)
return events, err
}
defer resp.Body.Close()
log.Debug("Rate limit is: ", resp.Header.Get("X-RateLimit-Limit"),
" Remaining: ", resp.Header.Get("X-RateLimit-Remaining"), " Reset time: ", resp.Header.Get("X-RateLimit-Reset"))
data, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Error(err)
return events, err
}
err = json.Unmarshal(data, &events)
if err != nil {
return events, err
}
return events, nil
}
func (c *Config) IsEventProcessable(eventType string) bool {
for i, _ := range c.Github.WatchedEventTypes {
if eventType == c.Github.WatchedEventTypes[i] {
return true
}
}
return false
}