Skip to content

Commit c94c357

Browse files
authored
Refactor Twitter client tweet fetching (#91)
1 parent c637427 commit c94c357

File tree

1 file changed

+53
-92
lines changed

1 file changed

+53
-92
lines changed

pkg/twitter/client.go

Lines changed: 53 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -100,51 +100,9 @@ func (c *Client) GetUserTweets(ctx context.Context, userId string, maxResults in
100100
tracer := metrics.TraceMethodCall(ctx, metricsStructName, "GetUserTweets")
101101
defer tracer.End()
102102

103-
tweets, err := func() ([]*Tweet, error) {
104-
bearerToken, err := c.getBearerToken(c.clientId, c.clientSecret)
105-
if err != nil {
106-
return nil, err
107-
}
108-
109-
url := fmt.Sprintf(baseUrl+"users/"+userId+"/tweets?max_results=%d", maxResults)
110-
111-
req, err := http.NewRequest("GET", url, nil)
112-
if err != nil {
113-
return nil, err
114-
}
115-
116-
req.Header.Add("Authorization", "Bearer "+bearerToken)
117-
118-
resp, err := c.httpClient.Do(req)
119-
if err != nil {
120-
return nil, err
121-
}
122-
defer resp.Body.Close()
123-
124-
if resp.StatusCode != http.StatusOK {
125-
return nil, fmt.Errorf("unexpected http status code: %d", resp.StatusCode)
126-
}
127-
128-
var result struct {
129-
Data []*Tweet `json:"data"`
130-
Errors []*twitterError `json:"errors"`
131-
}
132-
133-
body, err := io.ReadAll(resp.Body)
134-
if err != nil {
135-
return nil, err
136-
}
137-
138-
if err := json.Unmarshal(body, &result); err != nil {
139-
return nil, err
140-
}
141-
142-
if len(result.Errors) > 0 {
143-
return nil, result.Errors[0].toError()
144-
}
145-
return result.Data, nil
146-
}()
103+
url := fmt.Sprintf(baseUrl+"users/"+userId+"/tweets?max_results=%d", maxResults)
147104

105+
tweets, err := c.getTweets(ctx, url)
148106
if err != nil {
149107
tracer.OnError(err)
150108
}
@@ -156,55 +114,13 @@ func (c *Client) SearchUserTweets(ctx context.Context, userId, searchString stri
156114
tracer := metrics.TraceMethodCall(ctx, metricsStructName, "SearchUserTweets")
157115
defer tracer.End()
158116

159-
tweets, err := func() ([]*Tweet, error) {
160-
bearerToken, err := c.getBearerToken(c.clientId, c.clientSecret)
161-
if err != nil {
162-
return nil, err
163-
}
164-
165-
url := fmt.Sprintf(
166-
baseUrl+"tweets/search/all?query=%s&max_results=%d",
167-
url.QueryEscape(fmt.Sprintf("from:%s %s", userId, searchString)),
168-
maxResults,
169-
)
170-
171-
req, err := http.NewRequest("GET", url, nil)
172-
if err != nil {
173-
return nil, err
174-
}
175-
176-
req.Header.Add("Authorization", "Bearer "+bearerToken)
177-
178-
resp, err := c.httpClient.Do(req)
179-
if err != nil {
180-
return nil, err
181-
}
182-
defer resp.Body.Close()
183-
184-
if resp.StatusCode != http.StatusOK {
185-
return nil, fmt.Errorf("unexpected http status code: %d", resp.StatusCode)
186-
}
187-
188-
var result struct {
189-
Data []*Tweet `json:"data"`
190-
Errors []*twitterError `json:"errors"`
191-
}
192-
193-
body, err := io.ReadAll(resp.Body)
194-
if err != nil {
195-
return nil, err
196-
}
197-
198-
if err := json.Unmarshal(body, &result); err != nil {
199-
return nil, err
200-
}
201-
202-
if len(result.Errors) > 0 {
203-
return nil, result.Errors[0].toError()
204-
}
205-
return result.Data, nil
206-
}()
117+
url := fmt.Sprintf(
118+
baseUrl+"tweets/search/all?query=%s&max_results=%d",
119+
url.QueryEscape(fmt.Sprintf("from:%s %s", userId, searchString)),
120+
maxResults,
121+
)
207122

123+
tweets, err := c.getTweets(ctx, url)
208124
if err != nil {
209125
tracer.OnError(err)
210126
}
@@ -256,6 +172,51 @@ func (c *Client) getUser(ctx context.Context, fromUrl string) (*User, error) {
256172
return result.Data, nil
257173
}
258174

175+
func (c *Client) getTweets(ctx context.Context, fromUrl string) ([]*Tweet, error) {
176+
bearerToken, err := c.getBearerToken(c.clientId, c.clientSecret)
177+
if err != nil {
178+
return nil, err
179+
}
180+
181+
req, err := http.NewRequest("GET", fromUrl, nil)
182+
if err != nil {
183+
return nil, err
184+
}
185+
186+
req = req.WithContext(ctx)
187+
188+
req.Header.Add("Authorization", "Bearer "+bearerToken)
189+
190+
resp, err := c.httpClient.Do(req)
191+
if err != nil {
192+
return nil, err
193+
}
194+
defer resp.Body.Close()
195+
196+
if resp.StatusCode != http.StatusOK {
197+
return nil, fmt.Errorf("unexpected http status code: %d", resp.StatusCode)
198+
}
199+
200+
var result struct {
201+
Data []*Tweet `json:"data"`
202+
Errors []*twitterError `json:"errors"`
203+
}
204+
205+
body, err := io.ReadAll(resp.Body)
206+
if err != nil {
207+
return nil, err
208+
}
209+
210+
if err := json.Unmarshal(body, &result); err != nil {
211+
return nil, err
212+
}
213+
214+
if len(result.Errors) > 0 {
215+
return nil, result.Errors[0].toError()
216+
}
217+
return result.Data, nil
218+
}
219+
259220
func (c *Client) getBearerToken(clientId, clientSecret string) (string, error) {
260221
c.bearerTokenMu.RLock()
261222
if time.Since(c.lastBearerTokenRefresh) < bearerTokenMaxAge {

0 commit comments

Comments
 (0)