Skip to content

Commit

Permalink
Feature/issue 58 manage user retweet (#75)
Browse files Browse the repository at this point in the history
* added the retweet managing APIs

* added retweet manage examples

* updated the readmes
  • Loading branch information
g8rswimmer authored Jan 2, 2022
1 parent eef6dae commit a1a4f6c
Show file tree
Hide file tree
Showing 8 changed files with 426 additions and 0 deletions.
3 changes: 3 additions & 0 deletions v2/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,9 @@ Here are the current twitter `v2` API features supported:
* [Manage Tweet](https://developer.twitter.com/en/docs/twitter-api/tweets/manage-tweets/introduction)
* [create example](./_examples/tweet-create)
* [delete example](./_examples/tweet-delete)
* [Manage Retweet](https://developer.twitter.com/en/docs/twitter-api/tweets/retweets/introduction)
* [retweet example](./_examples/user-retweet)
* [delete retweet example](./_examples/user-delete-retweet)

## Examples
Much like `v1`, there is an `_example` directory to demostrate library usage. Refer to the [readme](./_examples) for more information.
Expand Down
14 changes: 14 additions & 0 deletions v2/_examples/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,3 +50,17 @@ This [example](./auth-user-lookup) demonstrates the authorized user lookup API c
```
go run *.go -token=YOUR_API_TOKEN
```

## User Retweet
This [example](./user-retweet) demonstrates the user retweet API call.

```
go run *.go -token=YOUR_API_TOKEN -user_id=2244994945 -tweet_id=1228393702244134912
```

## Delete User Retweet
This [example](./user-delete-retweet) demonstrates the deleting user retweet API call.

```
go run *.go -token=YOUR_API_TOKEN -user_id=2244994945 -tweet_id=1228393702244134912
```
51 changes: 51 additions & 0 deletions v2/_examples/user-delete-retweet/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package main

import (
"context"
"encoding/json"
"flag"
"fmt"
"log"
"net/http"

twitter "github.com/g8rswimmer/go-twitter/v2"
)

type authorize struct {
Token string
}

func (a authorize) Add(req *http.Request) {
req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", a.Token))
}

/**
In order to run, the user will need to provide the bearer token and the list of tweet ids.
**/
func main() {
token := flag.String("token", "", "twitter API token")
userID := flag.String("user_id", "", "user id")
tweetID := flag.String("tweet_id", "", "tweet id")
flag.Parse()

client := &twitter.Client{
Authorizer: authorize{
Token: *token,
},
Client: http.DefaultClient,
Host: "https://api.twitter.com",
}

fmt.Println("Callout to delete user retweet callout")

tweetResponse, err := client.DeleteUserRetweet(context.Background(), *userID, *tweetID)
if err != nil {
log.Panicf("user delete retweet error: %v", err)
}

enc, err := json.MarshalIndent(tweetResponse, "", " ")
if err != nil {
log.Panic(err)
}
fmt.Println(string(enc))
}
51 changes: 51 additions & 0 deletions v2/_examples/user-retweet/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package main

import (
"context"
"encoding/json"
"flag"
"fmt"
"log"
"net/http"

twitter "github.com/g8rswimmer/go-twitter/v2"
)

type authorize struct {
Token string
}

func (a authorize) Add(req *http.Request) {
req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", a.Token))
}

/**
In order to run, the user will need to provide the bearer token and the list of tweet ids.
**/
func main() {
token := flag.String("token", "", "twitter API token")
userID := flag.String("user_id", "", "user id")
tweetID := flag.String("tweet_id", "", "tweet id")
flag.Parse()

client := &twitter.Client{
Authorizer: authorize{
Token: *token,
},
Client: http.DefaultClient,
Host: "https://api.twitter.com",
}

fmt.Println("Callout to user retweet callout")

tweetResponse, err := client.UserRetweet(context.Background(), *userID, *tweetID)
if err != nil {
log.Panicf("user retweet error: %v", err)
}

enc, err := json.MarshalIndent(tweetResponse, "", " ")
if err != nil {
log.Panic(err)
}
fmt.Println(string(enc))
}
101 changes: 101 additions & 0 deletions v2/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -760,3 +760,104 @@ func (c Client) TweetHideReplies(ctx context.Context, id string, hide bool) erro
}
return nil
}

// UserRetweet will retweet a tweet for a user
func (c *Client) UserRetweet(ctx context.Context, userID, tweetID string) (*UserRetweetResponse, error) {
switch {
case len(userID) == 0:
return nil, fmt.Errorf("user retweet: user id is required %w", ErrParameter)
case len(tweetID) == 0:
return nil, fmt.Errorf("user retweet: tweet id is required %w", ErrParameter)
default:
}

reqBody := struct {
TweetID string `json:"tweet_id"`
}{
TweetID: tweetID,
}
enc, err := json.Marshal(reqBody)
if err != nil {
return nil, fmt.Errorf("user retweet: json marshal %w", err)
}
req, err := http.NewRequestWithContext(ctx, http.MethodPost, userManageRetweetEndpoint.urlID(c.Host, userID), bytes.NewReader(enc))
if err != nil {
return nil, fmt.Errorf("user retweet request: %w", err)
}
req.Header.Add("Content-Type", "application/json")
req.Header.Add("Accept", "application/json")
c.Authorizer.Add(req)

resp, err := c.Client.Do(req)
if err != nil {
return nil, fmt.Errorf("user retweet response: %w", err)
}
defer resp.Body.Close()

decoder := json.NewDecoder(resp.Body)

if resp.StatusCode != http.StatusOK {
e := &ErrorResponse{}
if err := decoder.Decode(e); err != nil {
return nil, &HTTPError{
Status: resp.Status,
StatusCode: resp.StatusCode,
URL: resp.Request.URL.String(),
}
}
e.StatusCode = resp.StatusCode
return nil, e
}

raw := &UserRetweetResponse{}
if err := decoder.Decode(raw); err != nil {
return nil, fmt.Errorf("user retweet decode response %w", err)
}
return raw, nil
}

// DeleteUserRetweet will return a retweet from a user
func (c *Client) DeleteUserRetweet(ctx context.Context, userID, tweetID string) (*DeleteUserRetweetResponse, error) {
switch {
case len(userID) == 0:
return nil, fmt.Errorf("user delete retweet: user id is required %w", ErrParameter)
case len(tweetID) == 0:
return nil, fmt.Errorf("user delete retweet: tweet id is required %w", ErrParameter)
default:
}

ep := userManageRetweetEndpoint.urlID(c.Host, userID) + "/" + tweetID
req, err := http.NewRequestWithContext(ctx, http.MethodDelete, ep, nil)
if err != nil {
return nil, fmt.Errorf("user delete retweet request: %w", err)
}
req.Header.Add("Accept", "application/json")
c.Authorizer.Add(req)

resp, err := c.Client.Do(req)
if err != nil {
return nil, fmt.Errorf("user delete retweet response: %w", err)
}
defer resp.Body.Close()

decoder := json.NewDecoder(resp.Body)

if resp.StatusCode != http.StatusOK {
e := &ErrorResponse{}
if err := decoder.Decode(e); err != nil {
return nil, &HTTPError{
Status: resp.Status,
StatusCode: resp.StatusCode,
URL: resp.Request.URL.String(),
}
}
e.StatusCode = resp.StatusCode
return nil, e
}

raw := &DeleteUserRetweetResponse{}
if err := decoder.Decode(raw); err != nil {
return nil, fmt.Errorf("user delete retweet decode response %w", err)
}
return raw, nil
}
Loading

0 comments on commit a1a4f6c

Please sign in to comment.