13
"gohome.4gophers.ru/getapp/boosty/auth"
22
func New(options ...Option) (*Request, error) {
23
auth, err := auth.New()
29
url: "https://api.boosty.to",
30
client: &http.Client{},
34
for _, o := range options {
35
if err := o(r); err != nil {
44
func (b *Request) Request(method string, u string, body io.Reader) (*http.Response, error) {
45
resp, err := b.do(method, b.url+u, body)
47
return nil, fmt.Errorf("error on do request: %w", err)
50
if resp.StatusCode == http.StatusUnauthorized {
51
if err := b.refresh(); err != nil {
52
return nil, fmt.Errorf("error on refresh token: %w", err)
55
resp, err = b.do(method, u, body)
57
return nil, fmt.Errorf("error on do request: %w", err)
65
func (b *Request) do(method string, u string, body io.Reader) (*http.Response, error) {
66
req, err := http.NewRequest(method, u, body)
68
return nil, fmt.Errorf("boosty stats request error: %w", err)
71
req.Header.Add("Authorization", b.auth.BearerHeader())
73
resp, err := b.client.Do(req)
75
return nil, fmt.Errorf("boosty stats do error: %w", err)
82
AccessToken string `json:"access_token"`
83
RefreshToken string `json:"refresh_token"`
84
ExpiresIn int64 `json:"expires_in"`
87
func (b *Request) refresh() error {
88
if b.auth.RefreshToken() == "" {
89
return errors.New("empty refresh token")
93
form.Add("device_id", b.auth.DeviceId())
94
form.Add("device_os", "web")
95
form.Add("grant_type", "refresh_token")
96
form.Add("refresh_token", b.auth.RefreshToken())
98
req, err := http.NewRequest(http.MethodPost, b.url+"/oauth/token/", strings.NewReader(form.Encode()))
100
return fmt.Errorf("boosty refresh request error: %w", err)
103
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
104
req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36")
105
req.Header.Set("Authorization", b.auth.BearerHeader())
106
resp, err := b.client.Do(req)
108
return fmt.Errorf("boosty refresh do error: %w", err)
111
if resp.StatusCode != http.StatusOK {
112
return fmt.Errorf("boosty refresh do error: %d", resp.StatusCode)
117
if err := json.NewDecoder(resp.Body).Decode(&refresh); err != nil {
118
return fmt.Errorf("boosty refresh decode error: %w", err)
122
AccessToken: refresh.AccessToken,
123
RefreshToken: refresh.RefreshToken,
124
ExpiresAt: time.Now().Unix() + refresh.ExpiresIn,
125
DeviceId: b.auth.DeviceId(),
129
if err := b.auth.Save(); err != nil {
130
return fmt.Errorf("boosty refresh save error: %w", err)