package github
import (
"encoding/json"
"fmt"
"log"
"net/http"
"regexp"
"strings"
"time"
"most-active-github-users-counter/net"
)
const root string = "https://api.github.com/"
type HTTPGithubClient struct {
wrappers []net.Wrapper
}
func (client HTTPGithubClient) Request(url string, body string) ([]byte, error) {
httpClient := &http.Client{}
var req *http.Request
var err error
if body != "" {
req, err = http.NewRequest("POST", url, strings.NewReader(body))
} else {
req, err = http.NewRequest("GET", url, nil)
}
if err != nil {
return []byte{}, err
}
return net.Compose(client.wrappers...)(net.MakeRequester(httpClient))(req)
}
func (client HTTPGithubClient) CurrentUser() (User, error) {
body, err := client.Request(fmt.Sprintf("%suser", root), "")
if err != nil {
return User{}, err
}
user := User{}
if err := json.Unmarshal(body, &user); err != nil {
return User{}, err
}
return user, nil
}
func (client HTTPGithubClient) User(login string) (User, error) {
body, err := client.Request(fmt.Sprintf("%susers/%s", root, login), "")
if err != nil {
return User{}, err
}
user := User{}
if err := json.Unmarshal(body, &user); err != nil {
return User{}, err
}
return user, nil
}
func (client HTTPGithubClient) SearchUsers(query UserSearchQuery) (GithubSearchResults, error) {
users := []User{}
userLogins := map[string]bool{}
totalCount := 0
minFollowerCount := -1
maxPerQuery := 1000
perPage := 5
totalUsersCount := 0
retryCount := 0
maxRetryCount := 10
Pages:
for totalCount < query.MaxUsers {
previousCursor := ""
followerCountQueryStr := ""
if minFollowerCount >= 0 {
followerCountQueryStr = fmt.Sprintf(" followers: