From 13e136698522a39f5bd5714d2d16be8a7d352002 Mon Sep 17 00:00:00 2001 From: Steven Polley Date: Fri, 29 Jun 2018 16:53:14 -0600 Subject: [PATCH] Beginning framework --- itglue.go | 109 +++++++++++++++++++++++++++++++++++++++++++++++ organizations.go | 36 ++++++++++++++++ 2 files changed, 145 insertions(+) create mode 100644 itglue.go create mode 100644 organizations.go diff --git a/itglue.go b/itglue.go new file mode 100644 index 0000000..1662d75 --- /dev/null +++ b/itglue.go @@ -0,0 +1,109 @@ +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) + +} diff --git a/organizations.go b/organizations.go new file mode 100644 index 0000000..36fbf21 --- /dev/null +++ b/organizations.go @@ -0,0 +1,36 @@ +package itglue + +import "fmt" + +//Organization maps JSON data from the ITG Organization resource to Go struct +type Organization struct { + Data struct { + ID int `json:"id"` + Type string `json:"type"` + Attributes struct { + Name string `json:"name"` + Description string `json:"description"` + OrganizationTypeID int `json:"organization-type-id"` + OrganizationTypeName string `json:"organization-type-name"` + OrganizationStatusID int `json:"organization-status-id"` + OrganizationStatusName string `json:"organization-status-name"` + Logo string `json:"logo"` + QuickNotes string `json:"quick-notes"` + ShortName string `json:"short-name"` + CreatedAt string `json:"created-at"` + UpdatedAt string `json:"updated-at"` + } `json:"attributes"` + } `json:"data"` +} + +//GetOrganizationByID expects an ITG organization ID +//Returns a pointer to an Organization struct +func (itg *ITGAPI) GetOrganizationByID(organizationID int) { + URL := itg.BuildURL(fmt.Sprintf("/organizations/%d", organizationID)) + + body := itg.GetRequest(URL) + fmt.Print(string(body)) + + //organization := Organization{} + +}