forked from sivchari/gotwtr
-
Notifications
You must be signed in to change notification settings - Fork 0
/
block.go
131 lines (117 loc) · 3.64 KB
/
block.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package gotwtr
import (
"bytes"
"context"
"encoding/json"
"errors"
"fmt"
"net/http"
)
func blocking(ctx context.Context, c *client, userID string, opt ...*BlockOption) (*BlockingResponse, error) {
if userID == "" {
return nil, errors.New("blocking: userID parameter is required")
}
ep := fmt.Sprintf(blockingURL, userID)
req, err := http.NewRequestWithContext(ctx, http.MethodGet, ep, nil)
if err != nil {
return nil, fmt.Errorf("blocking new request with ctx: %w", err)
}
req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", c.bearerToken))
var ropt BlockOption
switch len(opt) {
case 0:
// do nothing
case 1:
ropt = *opt[0]
default:
return nil, errors.New("blocking: only one option is allowed")
}
ropt.addQuery(req)
resp, err := c.client.Do(req)
if err != nil {
return nil, fmt.Errorf("blocking response: %w", err)
}
defer resp.Body.Close()
var blocking BlockingResponse
if err := json.NewDecoder(resp.Body).Decode(&blocking); err != nil {
return nil, fmt.Errorf("blocking decode: %w", err)
}
if resp.StatusCode != http.StatusOK {
return &blocking, &HTTPError{
APIName: "blocking",
Status: resp.Status,
URL: req.URL.String(),
}
}
return &blocking, nil
}
func postBlocking(ctx context.Context, c *client, userID string, targetUserID string) (*PostBlockingResponse, error) {
if userID == "" {
return nil, errors.New("post blocking: userID parameter is required")
}
ep := fmt.Sprintf(postBlockingURL, userID)
if targetUserID == "" {
return nil, errors.New("post blocking: targetUserID parameter is required")
}
body := &BlockingBody{
TargetUserID: targetUserID,
}
j, err := json.Marshal(body)
if err != nil {
return nil, fmt.Errorf("post blocking: can not marshal: %w", err)
}
req, err := http.NewRequestWithContext(ctx, http.MethodPost, ep, bytes.NewBuffer(j))
if err != nil {
return nil, fmt.Errorf("post blocking new request with ctx: %w", err)
}
req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", c.bearerToken))
req.Header.Set("Content-Type", "application/json")
resp, err := c.client.Do(req)
if err != nil {
return nil, fmt.Errorf("post blocking response: %w", err)
}
defer resp.Body.Close()
var postBlocking PostBlockingResponse
if err := json.NewDecoder(resp.Body).Decode(&postBlocking); err != nil {
return nil, fmt.Errorf("post blocking decode: %w", err)
}
if resp.StatusCode != http.StatusOK {
return &postBlocking, &HTTPError{
APIName: "post blocking",
Status: resp.Status,
URL: req.URL.String(),
}
}
return &postBlocking, nil
}
func undoBlocking(ctx context.Context, c *client, sourceUserID string, targetUserID string) (*UndoBlockingResponse, error) {
if sourceUserID == "" {
return nil, errors.New("undo blocking: sourceUserID parameter is required")
}
if targetUserID == "" {
return nil, errors.New("undo blocking: targetUserID parameter is required")
}
ep := fmt.Sprintf(undoBlockingURL, sourceUserID, targetUserID)
req, err := http.NewRequestWithContext(ctx, http.MethodDelete, ep, nil)
if err != nil {
return nil, fmt.Errorf("undo blocking new request with ctx: %w", err)
}
req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", c.bearerToken))
resp, err := c.client.Do(req)
if err != nil {
return nil, fmt.Errorf("undo blocking response: %w", err)
}
defer resp.Body.Close()
var undoBlocking UndoBlockingResponse
if err := json.NewDecoder(resp.Body).Decode(&undoBlocking); err != nil {
return nil, fmt.Errorf("undo blocking decode: %w", err)
}
if resp.StatusCode != http.StatusOK {
return &undoBlocking, &HTTPError{
APIName: "undo blocking",
Status: resp.Status,
URL: req.URL.String(),
}
}
return &undoBlocking, nil
}