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 itgurl *url.URL itgurl, err := url.Parse(itg.Site) check(err) itgurl.Path += restAction return itgurl } //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(itgurl *url.URL) []byte { client := &http.Client{} req, err := http.NewRequest("GET", itgurl.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(itgurl *url.URL, body io.Reader) []byte { client := &http.Client{} req, err := http.NewRequest("POST", itgurl.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(itgurl *url.URL, body io.Reader) []byte { client := &http.Client{} req, err := http.NewRequest("PATCH", itgurl.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) }