From 4f20218bcd987a5d9238c940844214345a5f6cae Mon Sep 17 00:00:00 2001 From: Sinh Date: Mon, 8 Apr 2024 15:38:20 +0700 Subject: [PATCH 1/8] feat(onpoint): get inventories --- partnerapi/onpoint/const.go | 1 + partnerapi/onpoint/model_request.go | 8 +++++ partnerapi/onpoint/model_response.go | 33 ++++++++++++++++++ partnerapi/onpoint/onpoint.go | 52 ++++++++++++++++++++++++++++ 4 files changed, 94 insertions(+) diff --git a/partnerapi/onpoint/const.go b/partnerapi/onpoint/const.go index d45efac..4df52f3 100644 --- a/partnerapi/onpoint/const.go +++ b/partnerapi/onpoint/const.go @@ -21,6 +21,7 @@ const ( apiPathUpdateDelivery = "/v1/orders/update_delivery" apiPathCancelOrder = "/v1/orders/cancel" apiPathGetChannels = "/v1/channels" + apiPathGetInventories = "/v1/inventories" headerXAPIKey = "x-api-key" headerXTimestamp = "x-timestamp" diff --git a/partnerapi/onpoint/model_request.go b/partnerapi/onpoint/model_request.go index aca58b3..ac700af 100644 --- a/partnerapi/onpoint/model_request.go +++ b/partnerapi/onpoint/model_request.go @@ -50,6 +50,14 @@ type CancelOrderRequest struct { OrderNo string `json:"order_code"` } +type ListInventoriesReq struct { + UpdatedFrom time.Time + UpdatedTo time.Time + SKUList []string + Size int + Page int +} + /** * WEBHOOK ONPOINT */ diff --git a/partnerapi/onpoint/model_response.go b/partnerapi/onpoint/model_response.go index 6ed84e0..237543a 100644 --- a/partnerapi/onpoint/model_response.go +++ b/partnerapi/onpoint/model_response.go @@ -1,5 +1,7 @@ package onpoint +import "time" + // CreateOrderResponse ... type CreateOrderResponse struct { OrderCode string `json:"order_code"` @@ -34,3 +36,34 @@ type ChannelResponse struct { Code string `json:"code"` Name string `json:"name"` } + +type ListInventoriesRes struct { + Code string `json:"code"` + Data struct { + Entries []InventoryEntry `json:"entries"` + Page int `json:"page"` + Size int `json:"size"` + TotalEntries int `json:"total_entries"` + TotalPages int `json:"total_pages"` + } `json:"data"` +} + +type InventoryEntry struct { + AvailableQuantity int `json:"available_quantity"` + PickupLocation Pickup `json:"pickup_location"` + Product Product `json:"product"` + UpdatedAt time.Time `json:"updated_at"` +} + +type Product struct { + Name string `json:"name"` + OriginalPrice int `json:"original_price"` + SellingPrice int `json:"selling_price"` + Sku string `json:"sku"` + Uom interface{} `json:"uom"` +} + +type Pickup struct { + Code string `json:"code"` + Name string `json:"name"` +} diff --git a/partnerapi/onpoint/onpoint.go b/partnerapi/onpoint/onpoint.go index c1f0cf1..efc4ea9 100644 --- a/partnerapi/onpoint/onpoint.go +++ b/partnerapi/onpoint/onpoint.go @@ -152,6 +152,58 @@ func (c *Client) CancelOrder(p CancelOrderRequest) (*CancelOrderResponse, error) return &dataRes.Data, nil } +// GetInventories ... +func (c *Client) GetInventories(req ListInventoriesReq) (*ListInventoriesRes, error) { + url := c.getBaseURL() + apiPathGetInventories + q := map[string]string{} + if !req.UpdatedFrom.IsZero() { + q["updated_from"] = req.UpdatedFrom.Format(TimeLayout) + } + if !req.UpdatedTo.IsZero() { + q["updated_to"] = req.UpdatedTo.Format(TimeLayout) + } + if len(req.SKUList) > 0 { + q["sku_list"] = strings.Join(req.SKUList, ",") + } + if req.Page > 0 { + q["page"] = strconv.Itoa(req.Page) + } + if req.Size > 0 { + q["size"] = strconv.Itoa(req.Size) + } + natsPayload := model.CommunicationRequestHttp{ + ResponseImmediately: true, + Payload: model.HttpRequest{ + URL: url, + Method: http.MethodPost, + Query: q, + }, + } + var ( + r model.CommunicationHttpResponse + errRes Error + dataRes ListInventoriesRes + ) + if err := c.requestHttpViaNats(natsPayload, &r); err != nil { + return nil, err + } + res := r.Response + if res == nil { + return nil, fmt.Errorf("onpoint.Client.GetInventories: empty_response") + } + if res.StatusCode >= http.StatusBadRequest { + if err := r.ParseResponseData(&errRes); err != nil { + return nil, fmt.Errorf("onpoint.Client.GetInventories: parse_response_err: %v", err) + } + return nil, errRes + } + if err := r.ParseResponseData(&dataRes); err != nil { + return nil, fmt.Errorf("onpoint.Client.GetInventories: parse_response_data: %v", err) + } + + return &dataRes, nil +} + func (c *Client) requestHttpViaNats(data model.CommunicationRequestHttp, res interface{}) error { ec, err := c.natsClient.NewJSONEncodedConn() if err != nil { -- 2.34.1 From 8788f7e89b70a9ef397801ae4a1de0e3a6d51c54 Mon Sep 17 00:00:00 2001 From: Sinh Date: Tue, 9 Apr 2024 12:08:19 +0700 Subject: [PATCH 2/8] feat(onpoint): update webhook payload --- partnerapi/onpoint/model_request.go | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/partnerapi/onpoint/model_request.go b/partnerapi/onpoint/model_request.go index ac700af..7f5f11c 100644 --- a/partnerapi/onpoint/model_request.go +++ b/partnerapi/onpoint/model_request.go @@ -64,13 +64,10 @@ type ListInventoriesReq struct { // WebhookDataUpdateInventory ... type WebhookDataUpdateInventory struct { - Sku string `json:"sku"` - PartnerSku string `json:"partner_sku"` - WarehouseCode string `json:"warehouse_code"` - AvailableQuantity int `json:"available_quantity"` - CommittedQuantity int `json:"committed_quantity"` - TotalQuantity int `json:"total_quantity"` - UpdatedAt string `json:"updated_at"` + Sku string `json:"sku"` + AvailableQuantity int `json:"available_quantity"` + PickupLocationCode string `json:"pickup_location_code"` + UpdatedAt time.Time `json:"updated_at"` } // WebhookDataUpdateOrderStatus ... -- 2.34.1 From d272537cf40ef4d64a5a737af10daf6ce897777e Mon Sep 17 00:00:00 2001 From: Sinh Date: Thu, 11 Apr 2024 11:28:59 +0700 Subject: [PATCH 3/8] update event name --- partnerapi/onpoint/const.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/partnerapi/onpoint/const.go b/partnerapi/onpoint/const.go index 4df52f3..5c406a6 100644 --- a/partnerapi/onpoint/const.go +++ b/partnerapi/onpoint/const.go @@ -28,7 +28,7 @@ const ( headerXSignature = "x-signature" webhookEventUpdateOrderStatus = "UPDATE_ORDER_STATUS" - webhookEventUpdateInventory = "update_inventory" + webhookEventUpdateInventory = "UPDATE_INVENTORY" ) var ( -- 2.34.1 From b9f59140a7eacb3624be2d504dcafcc6dc6b31cd Mon Sep 17 00:00:00 2001 From: Sinh Date: Tue, 16 Apr 2024 11:07:14 +0700 Subject: [PATCH 4/8] feat(onpoint): change method get inventories --- partnerapi/onpoint/onpoint.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/partnerapi/onpoint/onpoint.go b/partnerapi/onpoint/onpoint.go index efc4ea9..b3a686d 100644 --- a/partnerapi/onpoint/onpoint.go +++ b/partnerapi/onpoint/onpoint.go @@ -175,7 +175,7 @@ func (c *Client) GetInventories(req ListInventoriesReq) (*ListInventoriesRes, er ResponseImmediately: true, Payload: model.HttpRequest{ URL: url, - Method: http.MethodPost, + Method: http.MethodGet, Query: q, }, } -- 2.34.1 From 82145021a19a5a20b5cb95bd0ef6ca519771ab55 Mon Sep 17 00:00:00 2001 From: Sinh Date: Tue, 16 Apr 2024 11:28:44 +0700 Subject: [PATCH 5/8] feat(onpoint): fix OP sign --- partnerapi/onpoint/onpoint.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/partnerapi/onpoint/onpoint.go b/partnerapi/onpoint/onpoint.go index b3a686d..d36f07e 100644 --- a/partnerapi/onpoint/onpoint.go +++ b/partnerapi/onpoint/onpoint.go @@ -211,7 +211,7 @@ func (c *Client) requestHttpViaNats(data model.CommunicationRequestHttp, res int } qs := "" for k, v := range data.Payload.Query { - qs += k + "=" + v + qs += "&" + k + "=" + v } now := time.Now().Unix() ts := strconv.FormatInt(now, 10) -- 2.34.1 From 76eeabdf7fee83b55c06abd5646a0b189cd9c6a3 Mon Sep 17 00:00:00 2001 From: Sinh Date: Tue, 16 Apr 2024 11:39:10 +0700 Subject: [PATCH 6/8] feat(onpoint): fix OP sign --- partnerapi/onpoint/onpoint.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/partnerapi/onpoint/onpoint.go b/partnerapi/onpoint/onpoint.go index d36f07e..ce2f922 100644 --- a/partnerapi/onpoint/onpoint.go +++ b/partnerapi/onpoint/onpoint.go @@ -211,7 +211,10 @@ func (c *Client) requestHttpViaNats(data model.CommunicationRequestHttp, res int } qs := "" for k, v := range data.Payload.Query { - qs += "&" + k + "=" + v + if qs != "" { + qs += "&" + } + qs += k + "=" + v } now := time.Now().Unix() ts := strconv.FormatInt(now, 10) -- 2.34.1 From 2bf7ef6e8a38df81c4f961445d965f31861153c5 Mon Sep 17 00:00:00 2001 From: Sinh Date: Tue, 16 Apr 2024 12:04:34 +0700 Subject: [PATCH 7/8] feat(onpoint): fix OP sign --- partnerapi/onpoint/onpoint.go | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/partnerapi/onpoint/onpoint.go b/partnerapi/onpoint/onpoint.go index ce2f922..f377f77 100644 --- a/partnerapi/onpoint/onpoint.go +++ b/partnerapi/onpoint/onpoint.go @@ -4,6 +4,7 @@ import ( "errors" "fmt" "net/http" + "net/url" "strconv" "strings" "time" @@ -209,17 +210,20 @@ func (c *Client) requestHttpViaNats(data model.CommunicationRequestHttp, res int if err != nil { return fmt.Errorf("onpoint: request via nats %v", err) } - qs := "" - for k, v := range data.Payload.Query { - if qs != "" { - qs += "&" - } - qs += k + "=" + v + u, err := url.ParseRequestURI(data.Payload.URL) + if err != nil { + return fmt.Errorf("onpoint: request via nats %v", err) } + q := u.Query() + for k, v := range data.Payload.Query { + q.Set(k, v) + } + u.RawQuery = q.Encode() + now := time.Now().Unix() ts := strconv.FormatInt(now, 10) arr := []string{ - qs, + u.RawQuery, data.Payload.Data, ts, } @@ -232,6 +236,7 @@ func (c *Client) requestHttpViaNats(data model.CommunicationRequestHttp, res int headerXTimestamp: ts, httputil.HeaderKeyContentType: httputil.HeaderValueApplicationJSON, } + data.Payload.Query = map[string]string{} return ec.Request(subject.Communication.RequestHTTP, data, res) } -- 2.34.1 From 8fe213156a429d8c04406e0a47f8f7490a3b2dd6 Mon Sep 17 00:00:00 2001 From: Sinh Date: Tue, 16 Apr 2024 12:10:56 +0700 Subject: [PATCH 8/8] feat(onpoint): fix OP sign --- partnerapi/onpoint/onpoint.go | 1 + 1 file changed, 1 insertion(+) diff --git a/partnerapi/onpoint/onpoint.go b/partnerapi/onpoint/onpoint.go index f377f77..a05a079 100644 --- a/partnerapi/onpoint/onpoint.go +++ b/partnerapi/onpoint/onpoint.go @@ -237,6 +237,7 @@ func (c *Client) requestHttpViaNats(data model.CommunicationRequestHttp, res int httputil.HeaderKeyContentType: httputil.HeaderValueApplicationJSON, } data.Payload.Query = map[string]string{} + data.Payload.URL = u.String() return ec.Request(subject.Communication.RequestHTTP, data, res) } -- 2.34.1