feat(onpoint): get inventories #17
			
				
			
		
		
		
	| 
						 | 
				
			
			@ -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"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
 */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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"`
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue