package clickoutsapi /** * Generated by API Builder - https://www.apibuilder.io * Service version: 0.0.1-dev * User agent: apibuilder app.apibuilder.io/shopr/clickouts-api/0.0.1-dev/go_1_5_client */ import ( "bytes" "encoding/json" "errors" "fmt" "html" "io" "io/ioutil" "net/http" "strconv" "strings" ) const BaseUrl = "http://api.shopr.nl/stats" const UserAgent = "apibuilder app.apibuilder.io/shopr/clickouts-api/0.0.1-dev/go_1_5_client" const Version = "0.0.1-dev" const VersionMajor = 0 type Client struct { HttpClient *http.Client Username string Password string BaseUrl string Headers http.Header } type ClientRequestBody struct { contentType string bytes io.Reader } /** * Describes the client where the request for a clickout has originated. */ type ClientOrigin string const ( ClientOriginShoprWebsite ClientOrigin = "shopr_website" // The Shopr website ClientOriginShoprMobileWeb = "shopr_mobile_web" // The Shopr website, but from a mobile. ClientOriginShoprIphone = "shopr_iphone" // IPhone native application. ClientOriginShoprIpad = "shopr_ipad" // Native application running on an IPad. ClientOriginShoprAndroid = "shopr_android" // Android native application. ClientOriginUNDEFINED = "UNDEFINED" ) func ClientOriginFromString(value string) ClientOrigin { switch strings.TrimSpace(strings.ToLower(value)) { case "shopr_website": return ClientOriginShoprWebsite case "shopr_mobile_web": return ClientOriginShoprMobileWeb case "shopr_iphone": return ClientOriginShoprIphone case "shopr_ipad": return ClientOriginShoprIpad case "shopr_android": return ClientOriginShoprAndroid default: return ClientOriginUNDEFINED } } /** * Represents an Offer click-out. It contains all the information needed to * properly identify the offer, trace it ot the user navigating from search page, * and relevant information about the offer at the click-out moment (e.g.: price, * lowest price among other offers, etc.) */ type Clickout struct { ProductId string `json:"productId"` Seller string `json:"seller"` SellerProductId string `json:"sellerProductId"` Price float64 `json:"price"` DeepUrl string `json:"deepUrl"` LowestPrice float64 `json:"lowestPrice"` HighestPrice float64 `json:"highestPrice"` OfferCount int32 `json:"offerCount"` OfferPosition int32 `json:"offerPosition"` CategoryId string `json:"categoryId"` Tracking Tracking `json:"tracking"` CreationTime string `json:"creationTime"` } func ClickoutFromMap(data interface{}) Clickout { b, err := json.Marshal(data) if err == nil { return ClickoutFromJson(bytes.NewReader(b)) } else { panic(err) } } func ClickoutFromJson(bytes io.Reader) Clickout { var clickout Clickout json.NewDecoder(bytes).Decode(&clickout) return clickout } type ErrorCode struct { Code string `json:"code"` LocalizedStringCode string `json:"localized_string_code"` } func ErrorCodeFromMap(data interface{}) ErrorCode { b, err := json.Marshal(data) if err == nil { return ErrorCodeFromJson(bytes.NewReader(b)) } else { panic(err) } } func ErrorCodeFromJson(bytes io.Reader) ErrorCode { var errorCode ErrorCode json.NewDecoder(bytes).Decode(&errorCode) return errorCode } type ErrorResponse struct { Message string `json:"message,omitempty"` ErrorCodes []ErrorCode `json:"error_codes"` Fingerprint string `json:"fingerprint,omitempty"` } func ErrorResponseFromMap(data interface{}) ErrorResponse { b, err := json.Marshal(data) if err == nil { return ErrorResponseFromJson(bytes.NewReader(b)) } else { panic(err) } } func ErrorResponseFromJson(bytes io.Reader) ErrorResponse { var errorResponse ErrorResponse json.NewDecoder(bytes).Decode(&errorResponse) return errorResponse } /** * Response for ping, health check and version */ type Status struct { Response string `json:"response"` } func StatusFromMap(data interface{}) Status { b, err := json.Marshal(data) if err == nil { return StatusFromJson(bytes.NewReader(b)) } else { panic(err) } } func StatusFromJson(bytes io.Reader) Status { var status Status json.NewDecoder(bytes).Decode(&status) return status } /** * Series of attributes for tracking purposes */ type Tracking struct { IpAddress string `json:"ipAddress"` Origin ClientOrigin `json:"origin"` UserAgent string `json:"userAgent,omitempty"` Referrer string `json:"referrer,omitempty"` } func TrackingFromMap(data interface{}) Tracking { b, err := json.Marshal(data) if err == nil { return TrackingFromJson(bytes.NewReader(b)) } else { panic(err) } } func TrackingFromJson(bytes io.Reader) Tracking { var tracking Tracking json.NewDecoder(bytes).Decode(&tracking) return tracking } type ClickoutsPostResponse struct { StatusCode int Response *http.Response Error error ErrorResponses []ErrorResponse Value string } func ClickoutsPost(client Client, fingerprint string, clickout Clickout) ClickoutsPostResponse { requestUrl := fmt.Sprintf("%s/%s/clickouts", client.BaseUrl, html.EscapeString(fingerprint)) if 0 == clickout.OfferCount { clickout.OfferCount = 1 } bodyDocument, err := json.Marshal(clickout) if err != nil { return ClickoutsPostResponse{Error: err} } body := ClientRequestBody{contentType: "application/json", bytes: bytes.NewReader(bodyDocument)} request, err := buildRequest(client, "POST", requestUrl, body) if err != nil { return ClickoutsPostResponse{Error: err} } resp, err := client.HttpClient.Do(request) if err != nil { return ClickoutsPostResponse{Error: err} } defer resp.Body.Close() switch resp.StatusCode { case 202: return ClickoutsPostResponse{StatusCode: resp.StatusCode, Response: resp, Value: func() string { body, _ := ioutil.ReadAll(resp.Body) return string(body) }()} case 422: return ClickoutsPostResponse{StatusCode: resp.StatusCode, Response: resp, ErrorResponses: func() []ErrorResponse { var tmp []interface{} json.NewDecoder(resp.Body).Decode(&tmp) var all []ErrorResponse for _, el := range tmp { all = append(all, ErrorResponseFromMap(el)) } return all }()} default: return ClickoutsPostResponse{StatusCode: resp.StatusCode, Response: resp, Error: errors.New(resp.Status)} } } type StatusesGetPingResponse struct { StatusCode int Response *http.Response Error error Status Status } func StatusesGetPing(client Client) StatusesGetPingResponse { requestUrl := fmt.Sprintf("%s/_internal_/ping", client.BaseUrl) request, err := buildRequest(client, "GET", requestUrl, ClientRequestBody{}) if err != nil { return StatusesGetPingResponse{Error: err} } resp, err := client.HttpClient.Do(request) if err != nil { return StatusesGetPingResponse{Error: err} } defer resp.Body.Close() switch resp.StatusCode { case 200: return StatusesGetPingResponse{StatusCode: resp.StatusCode, Response: resp, Status: StatusFromJson(resp.Body)} default: return StatusesGetPingResponse{StatusCode: resp.StatusCode, Response: resp, Error: errors.New(resp.Status)} } } type StatusesGetStatusResponse struct { StatusCode int Response *http.Response Error error Status Status } func StatusesGetStatus(client Client) StatusesGetStatusResponse { requestUrl := fmt.Sprintf("%s/_internal_/status", client.BaseUrl) request, err := buildRequest(client, "GET", requestUrl, ClientRequestBody{}) if err != nil { return StatusesGetStatusResponse{Error: err} } resp, err := client.HttpClient.Do(request) if err != nil { return StatusesGetStatusResponse{Error: err} } defer resp.Body.Close() switch resp.StatusCode { case 200: return StatusesGetStatusResponse{StatusCode: resp.StatusCode, Response: resp, Status: StatusFromJson(resp.Body)} default: return StatusesGetStatusResponse{StatusCode: resp.StatusCode, Response: resp, Error: errors.New(resp.Status)} } } type StatusesGetVersionResponse struct { StatusCode int Response *http.Response Error error Value string } func StatusesGetVersion(client Client) StatusesGetVersionResponse { requestUrl := fmt.Sprintf("%s/_internal_/version", client.BaseUrl) request, err := buildRequest(client, "GET", requestUrl, ClientRequestBody{}) if err != nil { return StatusesGetVersionResponse{Error: err} } resp, err := client.HttpClient.Do(request) if err != nil { return StatusesGetVersionResponse{Error: err} } defer resp.Body.Close() switch resp.StatusCode { case 200: return StatusesGetVersionResponse{StatusCode: resp.StatusCode, Response: resp, Value: func() string { body, _ := ioutil.ReadAll(resp.Body) return string(body) }()} default: return StatusesGetVersionResponse{StatusCode: resp.StatusCode, Response: resp, Error: errors.New(resp.Status)} } } func buildRequest(client Client, method, urlStr string, body ClientRequestBody) (*http.Request, error) { request, err := http.NewRequest(method, urlStr, body.bytes) if err != nil { return nil, err } request.Header.Add("User-Agent", UserAgent) request.Header.Add("X-Apidoc-Version", Version) request.Header.Add("X-Apidoc-Version-Major", strconv.Itoa(VersionMajor)) if client.Headers != nil { for key, values := range client.Headers { for _, value := range values { request.Header.Add(key, value) } } } if body.contentType != "" { request.Header.Add("Content-Type", body.contentType) } if client.Username != "" { request.SetBasicAuth(client.Username, client.Password) } return request, nil }