grim/paytreon
Clone
Summary
Browse
Changes
Graph
Move the package to the new import path and other changes from who knows when
draft
default
tip
2020-04-27, Gary Kramlich
b542428d4fe6
Move the package to the new import path and other changes from who knows when
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
}