-
Notifications
You must be signed in to change notification settings - Fork 14
Expand file tree
/
Copy pathcommunity_notes_lookup.go
More file actions
148 lines (121 loc) · 4.05 KB
/
community_notes_lookup.go
File metadata and controls
148 lines (121 loc) · 4.05 KB
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
package gotwtr
import (
"bytes"
"context"
"encoding/json"
"errors"
"fmt"
"net/http"
)
func searchPostsEligibleForNotes(ctx context.Context, c *client, opt ...*SearchPostsEligibleForNotesOption) (*SearchPostsEligibleForNotesResponse, error) {
req, err := http.NewRequestWithContext(ctx, http.MethodGet, searchPostsEligibleForNotesURL, nil)
if err != nil {
return nil, fmt.Errorf("search posts eligible for notes new request with ctx: %w", err)
}
req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", c.bearerToken))
var sopt SearchPostsEligibleForNotesOption
switch len(opt) {
case 0:
// Set default test_mode = true
sopt.TestMode = true
case 1:
sopt = *opt[0]
sopt.TestMode = true // Ensure test_mode is always true
default:
return nil, errors.New("search posts eligible for notes: only one option is allowed")
}
sopt.addQuery(req)
resp, err := c.client.Do(req)
if err != nil {
return nil, fmt.Errorf("search posts eligible for notes response: %w", err)
}
defer func() { _ = resp.Body.Close() }()
var spr SearchPostsEligibleForNotesResponse
if err := json.NewDecoder(resp.Body).Decode(&spr); err != nil {
return nil, fmt.Errorf("search posts eligible for notes decode: %w", err)
}
if resp.StatusCode != http.StatusOK {
return &spr, &HTTPError{
APIName: "search posts eligible for notes",
Status: resp.Status,
URL: req.URL.String(),
}
}
return &spr, nil
}
func searchNotesWritten(ctx context.Context, c *client, opt ...*SearchNotesWrittenOption) (*SearchNotesWrittenResponse, error) {
req, err := http.NewRequestWithContext(ctx, http.MethodGet, searchNotesWrittenURL, nil)
if err != nil {
return nil, fmt.Errorf("search notes written new request with ctx: %w", err)
}
req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", c.bearerToken))
var sopt SearchNotesWrittenOption
switch len(opt) {
case 0:
// Set default test_mode = true
sopt.TestMode = true
case 1:
sopt = *opt[0]
sopt.TestMode = true // Ensure test_mode is always true
default:
return nil, errors.New("search notes written: only one option is allowed")
}
sopt.addQuery(req)
resp, err := c.client.Do(req)
if err != nil {
return nil, fmt.Errorf("search notes written response: %w", err)
}
defer func() { _ = resp.Body.Close() }()
var snr SearchNotesWrittenResponse
if err := json.NewDecoder(resp.Body).Decode(&snr); err != nil {
return nil, fmt.Errorf("search notes written decode: %w", err)
}
if resp.StatusCode != http.StatusOK {
return &snr, &HTTPError{
APIName: "search notes written",
Status: resp.Status,
URL: req.URL.String(),
}
}
return &snr, nil
}
func createCommunityNote(ctx context.Context, c *client, body *CreateCommunityNoteBody) (*CreateCommunityNoteResponse, error) {
if body == nil {
return nil, errors.New("create community note: body parameter is required")
}
if body.PostID == "" {
return nil, errors.New("create community note: post_id is required")
}
if body.Info == nil {
return nil, errors.New("create community note: info is required")
}
// Ensure test_mode is always true
body.TestMode = true
j, err := json.Marshal(body)
if err != nil {
return nil, fmt.Errorf("create community note json marshal: %w", err)
}
req, err := http.NewRequestWithContext(ctx, http.MethodPost, createCommunityNoteURL, bytes.NewReader(j))
if err != nil {
return nil, fmt.Errorf("create community note 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("create community note response: %w", err)
}
defer func() { _ = resp.Body.Close() }()
var cnr CreateCommunityNoteResponse
if err := json.NewDecoder(resp.Body).Decode(&cnr); err != nil {
return nil, fmt.Errorf("create community note decode: %w", err)
}
if resp.StatusCode != http.StatusCreated && resp.StatusCode != http.StatusOK {
return &cnr, &HTTPError{
APIName: "create community note",
Status: resp.Status,
URL: req.URL.String(),
}
}
return &cnr, nil
}