You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

89 lines
1.6 KiB

package twitter
import (
"encoding/json"
"net/http"
)
type TwitterClient interface {
GetUsername(userId string) (string, error)
GetFollowing(userId string) ([]User, error)
}
type Client struct {
httpClient *http.Client
bearerToken string
baseURL string
}
type User struct {
ID string
Username string
Name string
}
func NewClient(bearerToken string) *Client {
return &Client{
httpClient: &http.Client{},
bearerToken: bearerToken,
baseURL: "https://api.twitter.com",
}
}
func (c *Client) GetUsername(userId string) (string, error) {
url := c.baseURL + "/users/" + userId
req, err := http.NewRequest("GET", url, nil)
if err != nil {
return "", err
}
req.Header.Set("Authorization", "Bearer "+c.bearerToken)
resp, err := c.httpClient.Do(req)
if err != nil {
return "", err
}
defer resp.Body.Close()
var userResponse struct {
Data User
}
if err := json.NewDecoder(resp.Body).Decode(&userResponse); err != nil {
return "", err
}
return userResponse.Data.Username, nil
}
func (c *Client) GetFollowing(userId string) ([]User, error) {
url := c.baseURL + "/users/" + userId + "/following"
req, err := http.NewRequest("GET", url, nil)
if err != nil {
return nil, err
}
req.Header.Set("Authorization", "Bearer "+c.bearerToken)
resp, err := c.httpClient.Do(req)
if err != nil {
return nil, err
}
defer func() {
if cerr := resp.Body.Close(); cerr != nil {
err = cerr
}
}()
var followingResponse struct {
Data []User
}
if err := json.NewDecoder(resp.Body).Decode(&followingResponse); err != nil {
return nil, err
}
return followingResponse.Data, nil
}