Use resty client

pull/30/head
Aloïs Micard 4 years ago
parent a4f86fbee9
commit 8750830a62
No known key found for this signature in database
GPG Key ID: 1A0EB82F071F5EFE

@ -1,11 +1,9 @@
package api
import (
"bytes"
"encoding/json"
"encoding/base64"
"fmt"
"github.com/rs/zerolog/log"
"net/http"
"github.com/go-resty/resty/v2"
"strconv"
"time"
)
@ -52,7 +50,7 @@ type Client interface {
}
type client struct {
httpClient *http.Client
httpClient *resty.Client
baseURL string
token string
}
@ -61,39 +59,43 @@ func (c *client) SearchResources(url, keyword string,
startDate, endDate time.Time, paginationPage, paginationSize int) ([]ResourceDto, int64, error) {
targetEndpoint := fmt.Sprintf("%s/v1/resources?", c.baseURL)
req := c.httpClient.R()
if url != "" {
targetEndpoint += fmt.Sprintf("url=%s&", url)
b64URL := base64.URLEncoding.EncodeToString([]byte(url))
req.SetQueryParam("url", b64URL)
}
if keyword != "" {
targetEndpoint += fmt.Sprintf("keyword=%s&", keyword)
req.SetQueryParam("keyword", keyword)
}
if !startDate.IsZero() {
targetEndpoint += fmt.Sprintf("start-date=%s&", startDate.Format(time.RFC3339))
req.SetQueryParam("start-date", startDate.Format(time.RFC3339))
}
if !endDate.IsZero() {
targetEndpoint += fmt.Sprintf("end-date=%s&", endDate.Format(time.RFC3339))
req.SetQueryParam("end-date", endDate.Format(time.RFC3339))
}
headers := map[string]string{}
headers[authorizationHeader] = fmt.Sprintf("Bearer %s", c.token)
req.Header.Set(authorizationHeader, fmt.Sprintf("Bearer %s", c.token))
if paginationPage != 0 {
headers[PaginationPageHeader] = strconv.Itoa(paginationPage)
req.Header.Set(PaginationPageHeader, strconv.Itoa(paginationPage))
}
if paginationSize != 0 {
headers[PaginationSizeHeader] = strconv.Itoa(paginationSize)
req.Header.Set(PaginationSizeHeader, strconv.Itoa(paginationSize))
}
var resources []ResourceDto
res, err := jsonGet(c.httpClient, targetEndpoint, headers, &resources)
req.SetResult(&resources)
res, err := req.Get(targetEndpoint)
if err != nil {
return nil, 0, err
}
count, err := strconv.ParseInt(res.Header[PaginationCountHeader][0], 10, 64)
count, err := strconv.ParseInt(res.Header().Get(PaginationCountHeader), 10, 64)
if err != nil {
return nil, 0, err
}
@ -104,40 +106,48 @@ func (c *client) SearchResources(url, keyword string,
func (c *client) AddResource(res ResourceDto) (ResourceDto, error) {
targetEndpoint := fmt.Sprintf("%s/v1/resources", c.baseURL)
headers := map[string]string{}
headers[authorizationHeader] = fmt.Sprintf("Bearer %s", c.token)
req := c.httpClient.R()
req.SetBody(res)
req.Header.Set(authorizationHeader, fmt.Sprintf("Bearer %s", c.token))
var resourceDto ResourceDto
_, err := jsonPost(c.httpClient, targetEndpoint, headers, res, &resourceDto)
req.SetResult(&resourceDto)
_, err := req.Post(targetEndpoint)
return resourceDto, err
}
func (c *client) ScheduleURL(url string) error {
targetEndpoint := fmt.Sprintf("%s/v1/urls", c.baseURL)
headers := map[string]string{}
headers[authorizationHeader] = fmt.Sprintf("Bearer %s", c.token)
req := c.httpClient.R()
req.SetBody(url)
req.Header.Set(authorizationHeader, fmt.Sprintf("Bearer %s", c.token))
_, err := jsonPost(c.httpClient, targetEndpoint, headers, url, nil)
_, err := req.Post(targetEndpoint)
return err
}
func (c *client) Authenticate(credentials CredentialsDto) (string, error) {
var token string
targetEndpoint := fmt.Sprintf("%s/v1/sessions", c.baseURL)
headers := map[string]string{}
_, err := jsonPost(c.httpClient, targetEndpoint, headers, credentials, &token)
req := c.httpClient.R()
req.SetBody(credentials)
var token string
req.SetResult(&token)
_, err := req.Post(targetEndpoint)
return token, err
}
// NewAuthenticatedClient create a new Client & authenticate it against the API
func NewAuthenticatedClient(baseURL string, credentials CredentialsDto) (Client, error) {
client := &client{
httpClient: &http.Client{
Timeout: time.Second * 10,
},
baseURL: baseURL,
httpClient: resty.New(),
baseURL: baseURL,
}
token, err := client.Authenticate(credentials)
@ -148,65 +158,3 @@ func NewAuthenticatedClient(baseURL string, credentials CredentialsDto) (Client,
return client, nil
}
func jsonGet(httpClient *http.Client, url string, headers map[string]string, response interface{}) (*http.Response, error) {
log.Trace().Str("verb", "GET").Str("url", url).Msg("")
req, err := http.NewRequest("GET", url, nil)
if err != nil {
return nil, err
}
// populate custom headers
for key, value := range headers {
req.Header.Set(key, value)
}
r, err := httpClient.Do(req)
if err != nil {
return nil, err
}
if err := json.NewDecoder(r.Body).Decode(&response); err != nil {
return nil, err
}
return r, nil
}
func jsonPost(httpClient *http.Client, url string, headers map[string]string, request, response interface{}) (*http.Response, error) {
log.Trace().Str("verb", "POST").Str("url", url).Msg("")
var err error
var b []byte
if request != nil {
b, err = json.Marshal(request)
if err != nil {
return nil, err
}
}
req, err := http.NewRequest("POST", url, bytes.NewBuffer(b))
if err != nil {
return nil, err
}
// populate custom headers
for key, value := range headers {
req.Header.Set(key, value)
}
req.Header.Set("Content-Type", contentTypeJSON)
r, err := httpClient.Do(req)
if err != nil {
return nil, err
}
if response != nil {
if err := json.NewDecoder(r.Body).Decode(&response); err != nil {
return nil, err
}
}
return r, nil
}

@ -6,6 +6,7 @@ require (
github.com/PuerkitoBio/purell v1.1.1
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect
github.com/dgrijalva/jwt-go v3.2.0+incompatible
github.com/go-resty/resty/v2 v2.3.0
github.com/golang/mock v1.4.4
github.com/golang/protobuf v1.4.2 // indirect
github.com/labstack/echo/v4 v4.1.16

@ -15,6 +15,9 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumC
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw=
github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
github.com/go-resty/resty v1.12.0 h1:L1P5qymrXL5H/doXe2pKUr1wxovAI5ilm2LdVLbwThc=
github.com/go-resty/resty/v2 v2.3.0 h1:JOOeAvjSlapTT92p8xiS19Zxev1neGikoHsXJeOq8So=
github.com/go-resty/resty/v2 v2.3.0/go.mod h1:UpN9CgLZNsv4e9XG50UU8xdI0F43UQ4HmxLBDwaroHU=
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
@ -129,6 +132,8 @@ golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLL
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b h1:0mm1VjtFUOIlE1SbDlwjYaDxZVDP2S5ou6y0gSgXHu8=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200513185701-a91f0712d120 h1:EZ3cVSzKOlJxAd8e8YAJ7no8nNypTxexh/YE/xW3ZEY=
golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@ -144,6 +149,8 @@ golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae h1:/WDfKMnPU+m5M4xB+6x4kaepxRw6jWvR5iDRdvjHgy8=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=

@ -1,7 +1,6 @@
package scheduler
import (
"encoding/base64"
"fmt"
"github.com/creekorful/trandoshan/api"
"github.com/creekorful/trandoshan/internal/logging"
@ -101,8 +100,7 @@ func handleMessage(apiClient api.Client, refreshDelay time.Duration) messaging.M
endDate = time.Now().Add(-refreshDelay)
}
b64URI := base64.URLEncoding.EncodeToString([]byte(u.String()))
_, count, err := apiClient.SearchResources(b64URI, "", time.Time{}, endDate, 1, 1)
_, count, err := apiClient.SearchResources(u.String(), "", time.Time{}, endDate, 1, 1)
if err != nil {
log.Err(err).Msg("Error while searching URL")
return err

@ -61,7 +61,7 @@ func TestHandleMessageNoSchedule(t *testing.T) {
Return(nil)
apiClientMock.EXPECT().
SearchResources("aHR0cHM6Ly9leGFtcGxlLm9uaW9u", "", time.Time{}, time.Time{}, 1, 1).
SearchResources("https://example.onion", "", time.Time{}, time.Time{}, 1, 1).
Return([]api.ResourceDto{}, int64(1), nil)
if err := handleMessage(apiClientMock, -1)(subscriberMock, &msg); err != nil {
@ -83,7 +83,7 @@ func TestHandleMessage(t *testing.T) {
Return(nil)
apiClientMock.EXPECT().
SearchResources("aHR0cHM6Ly9leGFtcGxlLm9uaW9u", "", time.Time{}, time.Time{}, 1, 1).
SearchResources("https://example.onion", "", time.Time{}, time.Time{}, 1, 1).
Return([]api.ResourceDto{}, int64(0), nil)
subscriberMock.EXPECT().

Loading…
Cancel
Save