feat(onpoint): get inventories #17
			
				
			
		
		
		
	| 
						 | 
					@ -21,13 +21,14 @@ const (
 | 
				
			||||||
	apiPathUpdateDelivery = "/v1/orders/update_delivery"
 | 
						apiPathUpdateDelivery = "/v1/orders/update_delivery"
 | 
				
			||||||
	apiPathCancelOrder    = "/v1/orders/cancel"
 | 
						apiPathCancelOrder    = "/v1/orders/cancel"
 | 
				
			||||||
	apiPathGetChannels    = "/v1/channels"
 | 
						apiPathGetChannels    = "/v1/channels"
 | 
				
			||||||
 | 
						apiPathGetInventories = "/v1/inventories"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	headerXAPIKey    = "x-api-key"
 | 
						headerXAPIKey    = "x-api-key"
 | 
				
			||||||
	headerXTimestamp = "x-timestamp"
 | 
						headerXTimestamp = "x-timestamp"
 | 
				
			||||||
	headerXSignature = "x-signature"
 | 
						headerXSignature = "x-signature"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	webhookEventUpdateOrderStatus = "UPDATE_ORDER_STATUS"
 | 
						webhookEventUpdateOrderStatus = "UPDATE_ORDER_STATUS"
 | 
				
			||||||
	webhookEventUpdateInventory   = "update_inventory"
 | 
						webhookEventUpdateInventory   = "UPDATE_INVENTORY"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -50,19 +50,24 @@ type CancelOrderRequest struct {
 | 
				
			||||||
	OrderNo string `json:"order_code"`
 | 
						OrderNo string `json:"order_code"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type ListInventoriesReq struct {
 | 
				
			||||||
 | 
						UpdatedFrom time.Time
 | 
				
			||||||
 | 
						UpdatedTo   time.Time
 | 
				
			||||||
 | 
						SKUList     []string
 | 
				
			||||||
 | 
						Size        int
 | 
				
			||||||
 | 
						Page        int
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * WEBHOOK ONPOINT
 | 
					 * WEBHOOK ONPOINT
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// WebhookDataUpdateInventory ...
 | 
					// WebhookDataUpdateInventory ...
 | 
				
			||||||
type WebhookDataUpdateInventory struct {
 | 
					type WebhookDataUpdateInventory struct {
 | 
				
			||||||
	Sku               string `json:"sku"`
 | 
						Sku                string    `json:"sku"`
 | 
				
			||||||
	PartnerSku        string `json:"partner_sku"`
 | 
						AvailableQuantity  int       `json:"available_quantity"`
 | 
				
			||||||
	WarehouseCode     string `json:"warehouse_code"`
 | 
						PickupLocationCode string    `json:"pickup_location_code"`
 | 
				
			||||||
	AvailableQuantity int    `json:"available_quantity"`
 | 
						UpdatedAt          time.Time `json:"updated_at"`
 | 
				
			||||||
	CommittedQuantity int    `json:"committed_quantity"`
 | 
					 | 
				
			||||||
	TotalQuantity     int    `json:"total_quantity"`
 | 
					 | 
				
			||||||
	UpdatedAt         string `json:"updated_at"`
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// WebhookDataUpdateOrderStatus ...
 | 
					// WebhookDataUpdateOrderStatus ...
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,5 +1,7 @@
 | 
				
			||||||
package onpoint
 | 
					package onpoint
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import "time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// CreateOrderResponse ...
 | 
					// CreateOrderResponse ...
 | 
				
			||||||
type CreateOrderResponse struct {
 | 
					type CreateOrderResponse struct {
 | 
				
			||||||
	OrderCode        string      `json:"order_code"`
 | 
						OrderCode        string      `json:"order_code"`
 | 
				
			||||||
| 
						 | 
					@ -34,3 +36,34 @@ type ChannelResponse struct {
 | 
				
			||||||
	Code string `json:"code"`
 | 
						Code string `json:"code"`
 | 
				
			||||||
	Name string `json:"name"`
 | 
						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"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,6 +4,7 @@ import (
 | 
				
			||||||
	"errors"
 | 
						"errors"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"net/http"
 | 
						"net/http"
 | 
				
			||||||
 | 
						"net/url"
 | 
				
			||||||
	"strconv"
 | 
						"strconv"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
| 
						 | 
					@ -152,19 +153,77 @@ func (c *Client) CancelOrder(p CancelOrderRequest) (*CancelOrderResponse, error)
 | 
				
			||||||
	return &dataRes.Data, nil
 | 
						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.MethodGet,
 | 
				
			||||||
 | 
								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 {
 | 
					func (c *Client) requestHttpViaNats(data model.CommunicationRequestHttp, res interface{}) error {
 | 
				
			||||||
	ec, err := c.natsClient.NewJSONEncodedConn()
 | 
						ec, err := c.natsClient.NewJSONEncodedConn()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return fmt.Errorf("onpoint: request via nats %v", err)
 | 
							return fmt.Errorf("onpoint: request via nats %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	qs := ""
 | 
						u, err := url.ParseRequestURI(data.Payload.URL)
 | 
				
			||||||
	for k, v := range data.Payload.Query {
 | 
						if err != nil {
 | 
				
			||||||
		qs += k + "=" + v
 | 
							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()
 | 
						now := time.Now().Unix()
 | 
				
			||||||
	ts := strconv.FormatInt(now, 10)
 | 
						ts := strconv.FormatInt(now, 10)
 | 
				
			||||||
	arr := []string{
 | 
						arr := []string{
 | 
				
			||||||
		qs,
 | 
							u.RawQuery,
 | 
				
			||||||
		data.Payload.Data,
 | 
							data.Payload.Data,
 | 
				
			||||||
		ts,
 | 
							ts,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -177,6 +236,8 @@ func (c *Client) requestHttpViaNats(data model.CommunicationRequestHttp, res int
 | 
				
			||||||
		headerXTimestamp:              ts,
 | 
							headerXTimestamp:              ts,
 | 
				
			||||||
		httputil.HeaderKeyContentType: httputil.HeaderValueApplicationJSON,
 | 
							httputil.HeaderKeyContentType: httputil.HeaderValueApplicationJSON,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						data.Payload.Query = map[string]string{}
 | 
				
			||||||
 | 
						data.Payload.URL = u.String()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return ec.Request(subject.Communication.RequestHTTP, data, res)
 | 
						return ec.Request(subject.Communication.RequestHTTP, data, res)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue