forked from sivchari/gotwtr
-
Notifications
You must be signed in to change notification settings - Fork 0
/
space_lookup.go
160 lines (133 loc) · 3.91 KB
/
space_lookup.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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
package gotwtr
import (
"context"
"encoding/json"
"errors"
"fmt"
"net/http"
)
func lookUpSpace(ctx context.Context, c *client, spaceID string, opt ...*SpaceOption) (*SpaceResponse, error) {
if spaceID == "" {
return nil, errors.New("look up space: spaceID parameter is required")
}
ep := fmt.Sprintf(spaceURL, spaceID)
req, err := http.NewRequestWithContext(ctx, http.MethodGet, ep, nil)
if err != nil {
return nil, fmt.Errorf("look up space new request with ctx: %w", err)
}
req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", c.bearerToken))
var sopt SpaceOption
switch len(opt) {
case 0:
// do nothing
case 1:
sopt = *opt[0]
default:
return nil, errors.New("look up space: only one option is allowed")
}
sopt.addQuery(req)
resp, err := c.client.Do(req)
if err != nil {
return nil, fmt.Errorf("look up space response: %w", err)
}
defer resp.Body.Close()
var sr SpaceResponse
if err := json.NewDecoder(resp.Body).Decode(&sr); err != nil {
return nil, fmt.Errorf("space lookup: %w", err)
}
if resp.StatusCode != http.StatusOK {
return &sr, &HTTPError{
APIName: "space lookup by id",
Status: resp.Status,
URL: req.URL.String(),
}
}
return &sr, nil
}
func lookUpSpaces(ctx context.Context, c *client, spaceIDs []string, opt ...*SpaceOption) (*SpacesResponse, error) {
switch {
case len(spaceIDs) == 0:
return nil, errors.New("look up spaces: spaceIDs parameter is required")
case len(spaceIDs) > spaceLookUpMaxIDs:
return nil, fmt.Errorf("look up spaces: spaceIDs parameter must be less than %d", spaceLookUpMaxIDs)
default:
}
ep := spacesURL
for i, sid := range spaceIDs {
if i+1 < len(spaceIDs) {
ep += fmt.Sprintf("%s,", sid)
} else {
ep += sid
}
}
req, err := http.NewRequestWithContext(ctx, http.MethodGet, ep, nil)
if err != nil {
return nil, fmt.Errorf("look up spaces new request with ctx: %w", err)
}
req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", c.bearerToken))
var sopt SpaceOption
switch len(opt) {
case 0:
// do nothing
case 1:
sopt = *opt[0]
default:
return nil, errors.New("look up spaces: only one option is allowed")
}
sopt.addQuery(req)
resp, err := c.client.Do(req)
if err != nil {
return nil, fmt.Errorf("look up spaces response: %w", err)
}
defer resp.Body.Close()
var sr SpacesResponse
if err := json.NewDecoder(resp.Body).Decode(&sr); err != nil {
return nil, fmt.Errorf("look up spaces: %w", err)
}
if resp.StatusCode != http.StatusOK {
return &sr, &HTTPError{
APIName: "look up spaces",
Status: resp.Status,
URL: req.URL.String(),
}
}
return &sr, nil
}
func usersPurchasedSpaceTicket(ctx context.Context, c *client, spaceID string, opt ...*UsersPurchasedSpaceTicketOption) (*UsersPurchasedSpaceTicketResponse, error) {
if spaceID == "" {
return nil, errors.New("users purchased space ticket: spaceID parameter is required")
}
ep := fmt.Sprintf(usersPurchasedSpaceTicketURL, spaceID)
req, err := http.NewRequestWithContext(ctx, http.MethodGet, ep, nil)
if err != nil {
return nil, fmt.Errorf("users purchased space ticket new request with ctx: %w", err)
}
req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", c.bearerToken))
var uopt UsersPurchasedSpaceTicketOption
switch len(opt) {
case 0:
// do nothing
case 1:
uopt = *opt[0]
default:
return nil, errors.New("users purchased space ticket: only one option is allowed")
}
uopt.addQuery(req)
resp, err := c.client.Do(req)
if err != nil {
return nil, fmt.Errorf("users purchased space ticket response: %w", err)
}
defer resp.Body.Close()
var upstr UsersPurchasedSpaceTicketResponse
if err := json.NewDecoder(resp.Body).Decode(&upstr); err != nil {
return nil, fmt.Errorf("users purchased space ticket: %w", err)
}
if resp.StatusCode != http.StatusOK {
return &upstr, &HTTPError{
APIName: "users purchased space ticket",
Status: resp.Status,
URL: req.URL.String(),
}
}
return &upstr, nil
}