Skip to content

Commit 1f30bbc

Browse files
committed
refactor params struct, client #1
1 parent ba80dd6 commit 1f30bbc

9 files changed

Lines changed: 167 additions & 179 deletions

File tree

README.md

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ import (
9090

9191
"github.com/michimani/gotwi"
9292
"github.com/michimani/gotwi/api/resource/users"
93-
"github.com/michimani/gotwi/types/params"
93+
"github.com/michimani/gotwi/params"
9494
)
9595

9696
func main() {
@@ -100,26 +100,26 @@ func main() {
100100
return
101101
}
102102

103-
p := &params.ByUserNameParams{
104-
UserName: "michimani210",
105-
Expansions: &params.UsersExpansions{
106-
params.ExpansionPinnedTweetID,
103+
p := &params.ByUsernameParams{
104+
Username: "michimani210",
105+
Expansions: []string{
106+
string(params.ExpansionPinnedTweetID),
107107
},
108-
UserFields: &params.UsersUserFields{
109-
params.PublicMetrics,
110-
params.UserCreatedAt,
108+
UserFields: []string{
109+
string(params.PublicMetrics),
110+
string(params.UserCreatedAt),
111111
},
112112
}
113113

114-
u, err := users.UsersByUserName(c, p)
114+
u, err := users.UsersByUsername(c, p)
115115
if err != nil {
116116
fmt.Println(err)
117117
return
118118
}
119119

120120
fmt.Println(u.Data.ID)
121121
fmt.Println(u.Data.Name)
122-
fmt.Println(u.Data.UserName)
122+
fmt.Println(u.Data.Username)
123123
fmt.Println(u.Data.CreatedAt)
124124
fmt.Println(u.Data.PublicMetrics.FollowersCount)
125125
fmt.Println(u.Data.PublicMetrics.FollowingCount)
@@ -141,6 +141,6 @@ michimani210
141141
2012-05-16 12:07:04 +0000 UTC
142142
724
143143
709
144-
35096
144+
35097
145145
pinned tweet
146146
```

api/resource/users/users_by_username.go

Lines changed: 5 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,18 @@ import (
44
"encoding/json"
55
"fmt"
66
"net/http"
7-
"net/url"
8-
"strings"
97

10-
"github.com/michimani/gotwi/types"
11-
"github.com/michimani/gotwi/types/params"
8+
"github.com/michimani/gotwi"
9+
"github.com/michimani/gotwi/params"
1210
"github.com/michimani/gotwi/types/response"
1311
)
1412

1513
const (
16-
UsersByUserNameEndpoint = "https://api.twitter.com/2/users/by/username/:username"
14+
UsersByUsernameEndpoint = "https://api.twitter.com/2/users/by/username/:username"
1715
)
1816

19-
func UsersByUserName(c *types.TwitterClient, p *params.ByUserNameParams) (*response.UsersByUsername, error) {
20-
if p == nil {
21-
return nil, fmt.Errorf("ByUserNameParams is nil")
22-
}
23-
24-
if !c.IsReady() {
25-
return nil, fmt.Errorf("Twitter client is not ready")
26-
}
27-
28-
req, err := newRequest(c, p)
17+
func UsersByUsername(c *gotwi.TwitterClient, p *params.ByUsernameParams) (*response.UsersByUsername, error) {
18+
req, err := c.Prepare(UsersByUsernameEndpoint, "GET", p)
2919
if err != nil {
3020
return nil, err
3121
}
@@ -46,39 +36,3 @@ func UsersByUserName(c *types.TwitterClient, p *params.ByUserNameParams) (*respo
4636

4737
return &r, nil
4838
}
49-
50-
func newRequest(c *types.TwitterClient, p *params.ByUserNameParams) (*http.Request, error) {
51-
ep := resolveEndpoint(p)
52-
req, err := http.NewRequest("GET", ep, nil)
53-
if err != nil {
54-
return nil, err
55-
}
56-
57-
req.Header.Set("Content-Type", "application/json;charset=UTF-8")
58-
req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", c.AccessToken))
59-
60-
return req, nil
61-
}
62-
63-
func resolveEndpoint(p *params.ByUserNameParams) string {
64-
encoded := url.QueryEscape(p.UserName)
65-
endpoint := strings.Replace(UsersByUserNameEndpoint, ":username", encoded, 1)
66-
query := url.Values{}
67-
if p.Expansions != nil {
68-
query.Add("expansions", p.Expansions.QueryValue())
69-
}
70-
71-
if p.TweetFields != nil {
72-
query.Add("tweet.fields", p.TweetFields.QueryValue())
73-
}
74-
75-
if p.UserFields != nil {
76-
query.Add("user.fields", p.UserFields.QueryValue())
77-
}
78-
79-
if query.Has("expansions") || query.Has("tweet.fields") || query.Has("user.fields") {
80-
endpoint = endpoint + "?" + query.Encode()
81-
}
82-
83-
return endpoint
84-
}

client.go

Lines changed: 77 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,104 @@
11
package gotwi
22

33
import (
4+
"fmt"
5+
"io/ioutil"
46
"net/http"
57
"os"
68
"time"
79

8-
"github.com/michimani/gotwi/api/oauth2"
910
"github.com/michimani/gotwi/types"
11+
"github.com/michimani/gotwi/types/response"
1012
)
1113

12-
func NewClient() *types.TwitterClient {
13-
return &types.TwitterClient{
14+
const (
15+
APIKeyEnvName = "GOTWI_API_KEY"
16+
APIKeySecretEnvName = "GOTWI_API_KEY_SECRET"
17+
)
18+
19+
type TwitterClient struct {
20+
Client *http.Client
21+
AccessToken string
22+
}
23+
24+
func NewClient() *TwitterClient {
25+
return &TwitterClient{
1426
Client: &http.Client{
1527
Timeout: time.Duration(30) * time.Second,
1628
},
1729
}
1830
}
1931

20-
func NewAuthorizedClient() (*types.TwitterClient, error) {
32+
func NewAuthorizedClient() (*TwitterClient, error) {
2133
c := NewClient()
2234
return Authorize(c)
2335
}
2436

25-
func Authorize(c *types.TwitterClient) (*types.TwitterClient, error) {
26-
apiKey := os.Getenv(types.APIKeyEnvName)
27-
apiKeySecret := os.Getenv(types.APIKeySecretEnvName)
28-
accessToken, err := oauth2.GenerateBearerToken(c, apiKey, apiKeySecret)
37+
func Authorize(c *TwitterClient) (*TwitterClient, error) {
38+
apiKey := os.Getenv(APIKeyEnvName)
39+
apiKeySecret := os.Getenv(APIKeySecretEnvName)
40+
accessToken, err := GenerateBearerToken(c, apiKey, apiKeySecret)
2941
if err != nil {
3042
return nil, err
3143
}
3244

3345
c.AccessToken = accessToken
3446
return c, nil
3547
}
48+
49+
func (c *TwitterClient) IsReady() bool {
50+
if c == nil {
51+
return false
52+
}
53+
54+
if c.AccessToken == "" {
55+
return false
56+
}
57+
58+
return true
59+
}
60+
61+
func (c *TwitterClient) Exec(req *http.Request) (*response.ClientResponse, error) {
62+
res, err := c.Client.Do(req)
63+
if err != nil {
64+
return nil, err
65+
}
66+
defer res.Body.Close()
67+
68+
bytes, err := ioutil.ReadAll(res.Body)
69+
if err != nil {
70+
return nil, err
71+
}
72+
73+
return &response.ClientResponse{
74+
StatusCode: res.StatusCode,
75+
Status: res.Status,
76+
Body: bytes,
77+
}, nil
78+
}
79+
80+
func (c *TwitterClient) Prepare(endpointBase, method string, p types.Parameters) (*http.Request, error) {
81+
if p == nil {
82+
return nil, fmt.Errorf(types.ErrorParametersNil, endpointBase)
83+
}
84+
85+
if !c.IsReady() {
86+
return nil, fmt.Errorf(types.ErrorClientNotReady)
87+
}
88+
89+
endpoint := p.ResolveEndpoint(endpointBase)
90+
p.SetAccessToken(c.AccessToken)
91+
return newRequest(endpoint, method, p)
92+
}
93+
94+
func newRequest(endpoint, method string, p types.Parameters) (*http.Request, error) {
95+
req, err := http.NewRequest(method, endpoint, p.Body())
96+
if err != nil {
97+
return nil, err
98+
}
99+
100+
req.Header.Set("Content-Type", "application/json;charset=UTF-8")
101+
req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", p.AccessToken()))
102+
103+
return req, nil
104+
}
Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package oauth2
1+
package gotwi
22

33
import (
44
"encoding/json"
@@ -7,18 +7,24 @@ import (
77
"net/url"
88
"strings"
99

10-
"github.com/michimani/gotwi/types"
1110
"github.com/michimani/gotwi/types/response"
1211
)
1312

1413
const OAuth2TokenEndpoint = "https://api.twitter.com/oauth2/token"
1514

16-
func GenerateBearerToken(c *types.TwitterClient, apiKey, apiKeySecret string) (string, error) {
17-
req, err := newRequest(apiKey, apiKeySecret)
15+
func GenerateBearerToken(c *TwitterClient, apiKey, apiKeySecret string) (string, error) {
16+
uv := url.Values{}
17+
uv.Add("grant_type", "client_credentials")
18+
body := strings.NewReader(uv.Encode())
19+
20+
req, err := http.NewRequest("POST", OAuth2TokenEndpoint, body)
1821
if err != nil {
1922
return "", err
2023
}
2124

25+
req.Header.Set("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8")
26+
req.SetBasicAuth(apiKey, apiKeySecret)
27+
2228
res, err := c.Exec(req)
2329
if err != nil {
2430
return "", err
@@ -35,17 +41,3 @@ func GenerateBearerToken(c *types.TwitterClient, apiKey, apiKeySecret string) (s
3541

3642
return o2r.AccessToken, nil
3743
}
38-
39-
func newRequest(apiKey, apiKeySecret string) (*http.Request, error) {
40-
uv := url.Values{}
41-
uv.Add("grant_type", "client_credentials")
42-
body := strings.NewReader(uv.Encode())
43-
req, err := http.NewRequest("POST", OAuth2TokenEndpoint, body)
44-
if err != nil {
45-
return nil, err
46-
}
47-
req.Header.Set("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8")
48-
req.SetBasicAuth(apiKey, apiKeySecret)
49-
50-
return req, nil
51-
}

0 commit comments

Comments
 (0)