diff --git a/api-client-go b/api-client-go new file mode 160000 index 0000000..5c6d2eb --- /dev/null +++ b/api-client-go @@ -0,0 +1 @@ +Subproject commit 5c6d2ebead217f5916767a9a542117fa496c677b diff --git a/client.go b/client.go index 804b8b1..abb0b3b 100644 --- a/client.go +++ b/client.go @@ -2136,10 +2136,14 @@ func (c *Client) IntegrationModule(code string) (IntegrationModuleResponse, int, func (c *Client) LinksCreate(link SerializedOrderLink, site ...string) (SuccessfulResponse, int, error) { var resp SuccessfulResponse - linkJson, _ := json.Marshal(link) + linkJSON, err := json.Marshal(link) + + if err != nil { + return resp, http.StatusBadRequest, err + } p := url.Values{ - "link": {string(linkJson)}, + "link": {string(linkJSON)}, } fillSite(&p, site) @@ -2166,7 +2170,7 @@ func (c *Client) LinksCreate(link SerializedOrderLink, site ...string) (Successf // // var client = retailcrm.New("https://demo.url", "09jIJ") // -// data, status, err := client.ClientIdsUpload([]retailcrm.ClientId{ +// data, status, err := client.ClientIdsUpload([]retailcrm.ClientID{ // { // Value: "value", // Order: LinkedOrder{ID: 10, ExternalID: "externalID", Number: "number"}, @@ -2192,9 +2196,13 @@ func (c *Client) LinksCreate(link SerializedOrderLink, site ...string) (Successf // if data.Success == true { // log.Println("Upload is successful") // } -func (c *Client) ClientIdsUpload(clientIds []ClientId) (ClientIdResponse, int, error) { - var resp ClientIdResponse - clientIdsJSON, _ := json.Marshal(&clientIds) +func (c *Client) ClientIdsUpload(clientIds []ClientID) (ClientIDResponse, int, error) { + var resp ClientIDResponse + clientIdsJSON, err := json.Marshal(&clientIds) + + if err != nil { + return resp, http.StatusBadRequest, err + } p := url.Values{ "clientIds": {string(clientIdsJSON)}, @@ -2228,7 +2236,7 @@ func (c *Client) ClientIdsUpload(clientIds []ClientId) (ClientIdResponse, int, e // Campaign: "campaign", // Keyword: "keyword", // Content: "content", -// ClientId: "10", +// ClientID: "10", // Order: LinkedOrder{ID: 10, ExternalID: "externalId", Number: "number"}, // Customer: SerializedEntityCustomer{ID: 10, ExternalID: "externalId"}, // Site: "site", @@ -2248,7 +2256,11 @@ func (c *Client) ClientIdsUpload(clientIds []ClientId) (ClientIdResponse, int, e // } func (c *Client) SourcesUpload(sources []Source) (SourcesResponse, int, error) { var resp SourcesResponse - sourcesJSON, _ := json.Marshal(&sources) + sourcesJSON, err := json.Marshal(&sources) + + if err != nil { + return resp, http.StatusBadRequest, err + } p := url.Values{ "sources": {string(sourcesJSON)}, @@ -2335,7 +2347,11 @@ func (c *Client) Currencies() (CurrencyResponse, int, error) { // } func (c *Client) CurrenciesCreate(currency Currency) (CurrencyCreateResponse, int, error) { var resp CurrencyCreateResponse - currencyJSON, _ := json.Marshal(¤cy) + currencyJSON, err := json.Marshal(¤cy) + + if err != nil { + return resp, http.StatusBadRequest, err + } p := url.Values{ "currency": {string(currencyJSON)}, @@ -2388,7 +2404,11 @@ func (c *Client) CurrenciesEdit(currency Currency) (SuccessfulResponse, int, err var resp SuccessfulResponse var uid = strconv.Itoa(currency.ID) - currencyJSON, _ := json.Marshal(¤cy) + currencyJSON, err := json.Marshal(¤cy) + + if err != nil { + return resp, http.StatusBadRequest, err + } p := url.Values{ "currency": {string(currencyJSON)}, diff --git a/client_test.go b/client_test.go index 6691785..ce64aa6 100644 --- a/client_test.go +++ b/client_test.go @@ -1998,10 +1998,10 @@ func TestClient_LinksCreate(t *testing.T) { Orders: orders, } - linkJson, _ := json.Marshal(link) + linkJSON, _ := json.Marshal(link) p := url.Values{ - "link": {string(linkJson)}, + "link": {string(linkJSON)}, } defer gock.Off() @@ -2028,10 +2028,45 @@ func TestClient_LinksCreate(t *testing.T) { } } +func TestClient_LinksCreate_Fail(t *testing.T) { + c := client() + + orders := []LinkedOrder{{ID: 10}} + + link := SerializedOrderLink{ + Comment: "comment", + Orders: orders, + } + + linkJSON, _ := json.Marshal(link) + + p := url.Values{ + "link": {string(linkJSON)}, + } + + defer gock.Off() + + gock.New(crmURL). + Post("/links/create"). + BodyString(p.Encode()). + Reply(400). + BodyString(`{"errorMsg": "Errors in the entity format", errors: [orders: "This collection should contain 2 elements or more."}`) + + data, _, err := c.LinksCreate(link) + + if err == nil { + t.Error("Error must be return") + } + + if data.Success != false { + t.Error(successFail) + } +} + func TestClient_ClientIdsUpload(t *testing.T) { c := client() - clientIds := []ClientId{ + clientIds := []ClientID{ { Value: "value", Order: LinkedOrder{ID: 10, ExternalID: "externalID", Number: "number"}, @@ -2078,18 +2113,11 @@ func TestClient_ClientIdsUpload(t *testing.T) { func TestClient_ClientIdsUpload_Fail(t *testing.T) { c := client() - clientIds := []ClientId{ + clientIds := []ClientID{ { Value: "value", - Order: LinkedOrder{ID: 10, ExternalID: "externalID", Number: "number"}, + Order: LinkedOrder{ID: 10}, Customer: SerializedEntityCustomer{}, - Site: "site", - }, - { - Value: "value2", - Order: LinkedOrder{ID: 12, ExternalID: "externalID2", Number: "number2"}, - Customer: SerializedEntityCustomer{ID: 12, ExternalID: "externalID2"}, - Site: "site2", }, } @@ -2103,22 +2131,11 @@ func TestClient_ClientIdsUpload_Fail(t *testing.T) { gock.New(crmURL). Post("/web-analytics/client-ids/upload"). BodyString(p.Encode()). - Reply(460). + Reply(400). BodyString(` { - "success": false, - "failedClientIds": { - "value": "value", - "order": { - "id": 10, - "externalID": "externalID", - "number": "number" - }, - "customer": {}. - "site": "site2" - }, - "errorMsg": "customer is required", - "errors": [460] + "errorMsg": "ClientIds are loaded with errors", + "errors": [0: "customer: Set one of the following fields: id, externalId"] } `) @@ -2143,7 +2160,7 @@ func TestClient_SourcesUpload(t *testing.T) { Campaign: "campaign", Keyword: "keyword", Content: "content", - ClientId: "10", + ClientID: "10", Order: LinkedOrder{ID: 10, ExternalID: "externalId", Number: "number"}, Customer: SerializedEntityCustomer{ID: 10, ExternalID: "externalId"}, Site: "site", @@ -2189,19 +2206,8 @@ func TestClient_SourcesUpload_Fail(t *testing.T) { Campaign: "campaign", Keyword: "keyword", Content: "content", - ClientId: "10", + ClientID: "12", Order: LinkedOrder{ID: 10, ExternalID: "externalId", Number: "number"}, - Customer: SerializedEntityCustomer{ID: 10, ExternalID: "externalId"}, - Site: "site", - }, - { - Source: "source", - Medium: "medium", - Campaign: "campaign", - Keyword: "keyword", - Content: "content", - ClientId: "12", - Order: LinkedOrder{}, Customer: SerializedEntityCustomer{}, Site: "site", }, @@ -2216,22 +2222,11 @@ func TestClient_SourcesUpload_Fail(t *testing.T) { gock.New(crmURL). Post("/web-analytics/sources/upload"). BodyString(p.Encode()). - Reply(460). + Reply(400). BodyString(` { - "success": false, - "failedSources": { - "source": "source", - "medium": "medium", - "campaign": "campaign", - "keyword": "keyword", - "content": "content", - "order": {}, - "customer": {}. - "site": "sitey" - }, - "errorMsg": "order and customer is required", - "errors": [460] + "errorMsg": "ClientIds are loaded with errors", + "errors": [0: "customer: Set one of the following fields: id, externalId"] } `) @@ -2325,7 +2320,7 @@ func TestClient_CurrenciesCreate(t *testing.T) { currency := Currency{ ID: 10, - Code: "code", + Code: "RUB", IsBase: true, IsAutoConvert: true, AutoConvertExtraPercent: 1, diff --git a/response.go b/response.go index e9c538b..78e3e65 100644 --- a/response.go +++ b/response.go @@ -596,18 +596,18 @@ type AccountBonusOperationsResponse struct { BonusOperations []BonusOperation `json:"bonusOperations,omitempty"` } -// ClientIdResponse type -type ClientIdResponse struct { - Success bool `json:"success"` - FailedClientIds []ClientId `json:"failed_client_ids,omitempty"` +// ClientIDResponse type. +type ClientIDResponse struct { ErrorMsg string `json:"errorMsg,omitempty"` Errors map[string]string `json:"errors,omitempty"` + FailedClientIds []ClientID `json:"failed_client_ids,omitempty"` + Success bool `json:"success"` } // SourcesResponse type type SourcesResponse struct { Success bool `json:"success"` - FailedSources []Source `json:"failed_sources,omitempty"` + FailedSources []Source `json:"failedSources,omitempty"` ErrorMsg string `json:"errorMsg,omitempty"` Errors map[string]string `json:"errors,omitempty"` } diff --git a/types.go b/types.go index 36d5ae7..e0ae080 100644 --- a/types.go +++ b/types.go @@ -69,7 +69,7 @@ type Source struct { Campaign string `json:"campaign,omitempty"` Keyword string `json:"keyword,omitempty"` Content string `json:"content,omitempty"` - ClientId string `json:"client_id,omitempty"` + ClientID string `json:"client_id,omitempty"` Order LinkedOrder `json:"order,omitempty"` Customer SerializedEntityCustomer `json:"customer,omitempty"` Site string `json:"site,omitempty"` @@ -352,45 +352,45 @@ type Order struct { Currency string `json:"currency,omitempty"` } -// LinkedOrder type +// LinkedOrder type. type LinkedOrder struct { - ID int `json:"id,omitempty"` Number string `json:"number,omitempty"` ExternalID string `json:"externalID,omitempty"` + ID int `json:"id,omitempty"` } -// OrderLink type +// OrderLink type. type OrderLink struct { Comment string `json:"comment,omitempty"` - Order LinkedOrder `json:"order,omitempty"` CreatedAt string `json:"createdAt,omitempty"` + Order LinkedOrder `json:"order,omitempty"` } -// SerializedOrderLink type +// SerializedOrderLink type. type SerializedOrderLink struct { Comment string `json:"comment,omitempty"` - Orders []LinkedOrder `json:"orders,omitempty"` CreatedAt string `json:"createdAt,omitempty"` + Orders []LinkedOrder `json:"orders,omitempty"` } -// ClientId type -type ClientId struct { +// ClientID type. +type ClientID struct { Value string `json:"value"` CreateAt string `json:"createAt,omitempty"` - Order LinkedOrder `json:"order,omitempty"` - Customer SerializedEntityCustomer `json:"customer,omitempty"` Site string `json:"site,omitempty"` + Customer SerializedEntityCustomer `json:"customer,omitempty"` + Order LinkedOrder `json:"order,omitempty"` } -// Currency type +// Currency type. type Currency struct { - ID int `json:"id,omitempty"` Code string `json:"code,omitempty"` + ID int `json:"id,omitempty"` + ManualConvertNominal int `json:"manualConvertNominal,omitempty"` + AutoConvertExtraPercent int `json:"autoConvertExtraPercent,omitempty"` IsBase bool `json:"isBase,omitempty"` IsAutoConvert bool `json:"isAutoConvert,omitempty"` - AutoConvertExtraPercent int `json:"autoConvertExtraPercent,omitempty"` - ManualConvertNominal int `json:"manualConvertNominal,omitempty"` - ManualConvertValue float64 `json:"manualConvertValue,omitempty"` + ManualConvertValue float32 `json:"manualConvertValue,omitempty"` } // OrdersStatus type.