go-itg/itglue.go

110 lines
3.0 KiB
Go

package itglue
import (
"fmt"
"io"
"io/ioutil"
"log"
"net/http"
"net/url"
)
func check(err error) {
if err != nil {
log.Fatal(err)
}
}
//ITGAPI contains the ITG API URL for North America, as well as the API key.
//Think of it as an instance of the API client
type ITGAPI struct {
Site string //Full URL ITG API
APIKey string //API Key
}
//NewITGAPI expects the API key to be passed to it
//Returns a pointer to an ITGAPI struct
func NewITGAPI(apiKey string) *ITGAPI {
return &ITGAPI{Site: "https://api.itglue.com", APIKey: apiKey}
}
func getHTTPResponseBody(resp *http.Response) []byte {
if resp.StatusCode != http.StatusOK {
out := fmt.Sprintf("ITG returned HTTP status code %s\n%s", resp.Status, resp.Body)
log.Fatal(out)
return make([]byte, 0) //TBD: Don't hack
}
body, err := ioutil.ReadAll(resp.Body)
check(err)
return body
}
//BuildURL expects a restaction to be passed to it
//Returns the full request URL containing the ITG API domain prepended to the rest action
func (itg *ITGAPI) BuildURL(restAction string) *url.URL {
var URL *url.URL
URL, err := url.Parse(itg.Site)
check(err)
URL.Path += restAction
return URL
}
//GetRequest allows a custom GET request to the API to be made.
//Also used internally by this package by the binding functions
//Expects URL to be passed
//Returns the response body as a byte slice
func (itg *ITGAPI) GetRequest(URL *url.URL) []byte {
client := &http.Client{}
req, err := http.NewRequest("GET", URL.String(), nil)
check(err)
req.Header.Set("Content-Type", "application/vnd.api+json")
req.Header.Set("x-api-key", itg.APIKey)
req.Header.Set("cache-control", "no-cache")
response, err := client.Do(req)
check(err)
defer response.Body.Close()
return getHTTPResponseBody(response)
}
//PostRequest allows a custom POST request tot he API to be made
//Also used internally by this package by the binding functions
//Expects a URL and a body to be passed
//Returns the response body as a byte slice
func (itg *ITGAPI) PostRequest(URL *url.URL, body io.Reader) []byte {
client := &http.Client{}
req, err := http.NewRequest("POST", URL.String(), body)
check(err)
req.Header.Set("Content-Type", "application/vnd.api+json")
req.Header.Set("x-api-key", itg.APIKey)
req.Header.Set("cache-control", "no-cache")
response, err := client.Do(req)
check(err)
defer response.Body.Close()
return getHTTPResponseBody(response)
}
//PatchRequest allows a custom PATCH request tot he API to be made
//Also used internally by this package by the binding functions
//Expects a URL and a body to be passed
//Returns the response body as a byte slice
func (itg *ITGAPI) PatchRequest(URL *url.URL, body io.Reader) []byte {
client := &http.Client{}
req, err := http.NewRequest("PATCH", URL.String(), body)
check(err)
req.Header.Set("Content-Type", "application/vnd.api+json")
req.Header.Set("x-api-key", itg.APIKey)
req.Header.Set("cache-control", "no-cache")
response, err := client.Do(req)
check(err)
defer response.Body.Close()
return getHTTPResponseBody(response)
}