grim/paytreon

Setup go mod
draft
2019-04-10, Gary Kramlich
ca53823de404
Setup go mod
package paytreon
import (
"context"
"fmt"
"net/http"
"reflect"
"github.com/google/jsonapi"
"golang.org/x/oauth2"
)
type Client struct {
client *http.Client
baseURL string
}
const (
baseURL = "https://api.patreon.com/oauth2/api"
)
func NewClient(client *http.Client) *Client {
if client == nil {
client = http.DefaultClient
}
return NewCustomClient(client, baseURL)
}
func NewClientWithStaticToken(token string) *Client {
source := oauth2.StaticTokenSource(&oauth2.Token{AccessToken: token})
client := oauth2.NewClient(context.Background(), source)
return NewCustomClient(client, baseURL)
}
func NewCustomClient(client *http.Client, baseURL string) *Client {
return &Client{
client: client,
baseURL: baseURL,
}
}
func (c *Client) makeRequest(path string) (*http.Response, error) {
resp, err := c.client.Get(c.baseURL + path)
if err != nil {
return nil, err
}
return resp, nil
}
func (c *Client) getSingle(path string, payload interface{}) error {
resp, err := c.makeRequest(path)
if err != nil {
return err
}
return jsonapi.UnmarshalPayload(resp.Body, payload)
}
func (c *Client) getMultiple(path string, payload reflect.Type) ([]interface{}, error) {
resp, err := c.makeRequest(path)
if err != nil {
return nil, err
}
return jsonapi.UnmarshalManyPayload(resp.Body, payload)
}
func (c *Client) CurrentUser() (User, error) {
var user User
err := c.getSingle("/current_user", &user)
return user, err
}
func (c *Client) Campaigns() ([]*Campaign, error) {
objs, err := c.getMultiple("/current_user/campaigns", reflect.TypeOf(new(Campaign)))
if err != nil {
return nil, err
}
campaigns := []*Campaign{}
for _, obj := range objs {
campaigns = append(campaigns, obj.(*Campaign))
}
return campaigns, nil
}
func (c *Client) Pledges(campaign *Campaign) ([]*Pledge, error) {
url := fmt.Sprintf("/campaigns/%s/pledges", campaign.ID)
objs, err := c.getMultiple(url, reflect.TypeOf(new(Pledge)))
if err != nil {
return nil, err
}
pledges := make([]*Pledge, len(objs))
for idx, obj := range objs {
pledges[idx] = obj.(*Pledge)
}
return pledges, nil
}