first commit
commit
faaae240fa
@ -0,0 +1,96 @@
|
|||||||
|
package api
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"git.cheetah.cat/chee-erp/go-flink-inator/common"
|
||||||
|
"github.com/go-resty/resty/v2"
|
||||||
|
)
|
||||||
|
|
||||||
|
type (
|
||||||
|
APIClient struct {
|
||||||
|
apiClient *resty.Client
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
func NewAPIClient() (apiClient *APIClient) {
|
||||||
|
return &APIClient{
|
||||||
|
apiClient: resty.New().
|
||||||
|
SetJSONMarshaler(json.Marshal).
|
||||||
|
SetJSONUnmarshaler(json.Unmarshal),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ac *APIClient) GetHub(lat, lng float64) (res HubResult, err error) {
|
||||||
|
resp, err := ac.apiClient.R().
|
||||||
|
SetResult(&res).
|
||||||
|
SetQueryParams(map[string]string{
|
||||||
|
"lat": fmt.Sprint(lat),
|
||||||
|
"long": fmt.Sprint(lng),
|
||||||
|
}).
|
||||||
|
SetHeader("Accept", "application/json").
|
||||||
|
//SetAuthToken("BC594900518B4F7EAC75BD37F019E08FBC594900518B4F7EAC75BD37F019E08F").
|
||||||
|
Get(common.UrlLocationsHubV1)
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if resp.IsSuccess() {
|
||||||
|
res = *(resp.Result().(*HubResult))
|
||||||
|
}
|
||||||
|
return res, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ac *APIClient) DiscoverCategories(hubSlug string) (res DiscoverCategoriesResult, err error) {
|
||||||
|
resp, err := ac.apiClient.R().
|
||||||
|
SetResult(&res).
|
||||||
|
SetHeader("Hub-Slug", hubSlug).
|
||||||
|
SetHeader("Accept", "application/json").
|
||||||
|
Get(common.UrlDiscoverV2)
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
if resp.IsSuccess() {
|
||||||
|
res = *(resp.Result().(*DiscoverCategoriesResult))
|
||||||
|
} else {
|
||||||
|
return res, errors.New(string(resp.Body()))
|
||||||
|
}
|
||||||
|
return res, nil
|
||||||
|
}
|
||||||
|
func (ac *APIClient) DiscoverCategoriesSpecific(hubSlug string, catSlug string) (res DiscoverCategorySubEntry, err error) {
|
||||||
|
resp, err := ac.apiClient.R().
|
||||||
|
SetResult(&res).
|
||||||
|
SetHeader("Hub-Slug", hubSlug).
|
||||||
|
SetHeader("Accept", "application/json").
|
||||||
|
Get(fmt.Sprintf(common.UrlDiscoverV2Specific, catSlug))
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
if resp.IsSuccess() {
|
||||||
|
res = *(resp.Result().(*DiscoverCategorySubEntry))
|
||||||
|
} else {
|
||||||
|
return res, errors.New(string(resp.Body()))
|
||||||
|
}
|
||||||
|
return res, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ac *APIClient) DiscoverProduct(hubSlug string, skus []string) (res DiscoverSubProductList, err error) {
|
||||||
|
//
|
||||||
|
resp, err := ac.apiClient.R().
|
||||||
|
SetResult(&res).
|
||||||
|
SetBody(map[string][]string{
|
||||||
|
"skus": skus,
|
||||||
|
}).
|
||||||
|
SetHeader("Hub-Slug", hubSlug).
|
||||||
|
SetHeader("Accept", "application/json").
|
||||||
|
Get(common.UrlDiscoverV3Product)
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
if resp.IsSuccess() {
|
||||||
|
res = *(resp.Result().(*DiscoverSubProductList))
|
||||||
|
}
|
||||||
|
return res, nil
|
||||||
|
}
|
@ -0,0 +1,78 @@
|
|||||||
|
package api
|
||||||
|
|
||||||
|
type (
|
||||||
|
SlugIdBase struct {
|
||||||
|
Slug *string `json:"slug,omitempty"`
|
||||||
|
Id *string `json:"id,omitempty"`
|
||||||
|
}
|
||||||
|
MonetaryValue struct {
|
||||||
|
Currency string `json:"currency"`
|
||||||
|
Amount float64 `json:"amount"`
|
||||||
|
}
|
||||||
|
UnitAmount struct {
|
||||||
|
Unit string `json:"currency"`
|
||||||
|
Amount float64 `json:"amount"`
|
||||||
|
}
|
||||||
|
HubResult struct {
|
||||||
|
SlugIdBase
|
||||||
|
Address string `json:"address"`
|
||||||
|
City string `json:"city"`
|
||||||
|
|
||||||
|
Details HubDetails `json:"details"`
|
||||||
|
|
||||||
|
Country string `json:"country"`
|
||||||
|
DeliversToRequestedLocation bool `json:"delivers_to_requested_location"`
|
||||||
|
}
|
||||||
|
HubClosure struct {
|
||||||
|
Message string
|
||||||
|
Title string
|
||||||
|
Case string
|
||||||
|
}
|
||||||
|
HubDetails struct {
|
||||||
|
Closure HubClosure `json:"closure"`
|
||||||
|
MinimumorderValue MonetaryValue `json:"minimum_order_value"`
|
||||||
|
ShippingFee MonetaryValue `json:"shipping_fee"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// ConsumerBackend Discovery API v2
|
||||||
|
DiscoverCategoriesResult struct {
|
||||||
|
SlugIdBase
|
||||||
|
Categories DiscoverCategoriesList `json:"categories"`
|
||||||
|
Title *string `json:"title,omitempty"`
|
||||||
|
}
|
||||||
|
DiscoverCategoriesList struct {
|
||||||
|
Categories []DiscoverCategoryEntry `json:"categories"`
|
||||||
|
}
|
||||||
|
DiscoverCategoryEntry struct {
|
||||||
|
SlugIdBase
|
||||||
|
BackgroundImage *string `json:"backgroundImage,omitempty"`
|
||||||
|
Icon *string `json:"icon,omitempty"`
|
||||||
|
HREF *string `json:"href,omitempty"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
SubCategories *[]DiscoverCategorySubEntry `json:"subCategories,omitempty"`
|
||||||
|
Products *DiscoverSubProductList `json:"products,omitempty"`
|
||||||
|
}
|
||||||
|
// first layer
|
||||||
|
DiscoverCategorySubEntry struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
Categories []DiscoverCategoryEntry `json:"categories"`
|
||||||
|
Title *string `json:"title,omitempty"`
|
||||||
|
SlugIdBase
|
||||||
|
}
|
||||||
|
//second layer with products
|
||||||
|
DiscoverSubProductList struct {
|
||||||
|
Products *[]DiscoverSubProductEntry `json:"products"`
|
||||||
|
}
|
||||||
|
DiscoverSubProductEntry struct {
|
||||||
|
SlugIdBase
|
||||||
|
BasePrice MonetaryValue `json:"base_price"`
|
||||||
|
BaseUnit UnitAmount `json:"base_unit"`
|
||||||
|
MaxSingleOrderquantity int64 `json:"max_single_order_quantity"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
Price MonetaryValue `json:"price"`
|
||||||
|
Quantity float64 `json:"quantity"`
|
||||||
|
SKU string `json:"sku"`
|
||||||
|
Thumbnail string `json:"thumbnail"`
|
||||||
|
}
|
||||||
|
//
|
||||||
|
)
|
@ -0,0 +1,10 @@
|
|||||||
|
package common
|
||||||
|
|
||||||
|
const (
|
||||||
|
UrlLocationsHubV1 = "https://consumer-api.goflink.com/v1/locations/hub" // locations/hub?lat=52.1303067&long=11.6097666
|
||||||
|
|
||||||
|
ConsumerDiscoveryBackendUrl = "https://api.goflink.com/consumer-backend/discovery/v2/"
|
||||||
|
UrlDiscoverV2 = "https://api.goflink.com/consumer-backend/discovery/v2/categories"
|
||||||
|
UrlDiscoverV2Specific = "https://api.goflink.com/consumer-backend/discovery/v2/categories/%s"
|
||||||
|
UrlDiscoverV3Product = "https://api.goflink.com/consumer-backend/discovery/v3/products"
|
||||||
|
)
|
@ -0,0 +1,8 @@
|
|||||||
|
module git.cheetah.cat/chee-erp/go-flink-inator
|
||||||
|
|
||||||
|
go 1.21.4
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/go-resty/resty/v2 v2.13.1 // indirect
|
||||||
|
golang.org/x/net v0.25.0 // indirect
|
||||||
|
)
|
@ -0,0 +1,48 @@
|
|||||||
|
github.com/go-resty/resty/v2 v2.13.1 h1:x+LHXBI2nMB1vqndymf26quycC4aggYJ7DECYbiz03g=
|
||||||
|
github.com/go-resty/resty/v2 v2.13.1/go.mod h1:GznXlLxkq6Nh4sU59rPmUw3VtgpO3aS96ORAI6Q7d+0=
|
||||||
|
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
||||||
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
|
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||||
|
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
|
||||||
|
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
|
||||||
|
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||||
|
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||||
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||||
|
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
||||||
|
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
||||||
|
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
|
||||||
|
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
|
||||||
|
golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac=
|
||||||
|
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
|
||||||
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
|
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
|
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||||
|
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
|
||||||
|
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
|
||||||
|
golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
|
||||||
|
golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
|
||||||
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
|
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
|
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||||
|
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||||
|
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
||||||
|
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
||||||
|
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
||||||
|
golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
|
||||||
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
|
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
||||||
|
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
|
||||||
|
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,40 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"git.cheetah.cat/chee-erp/go-flink-inator/api"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
apiClient := api.NewAPIClient()
|
||||||
|
|
||||||
|
magdeburgHub, err := apiClient.GetHub(52.1303067, 11.6097666)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
fmt.Println(magdeburgHub)
|
||||||
|
|
||||||
|
categories, err := apiClient.DiscoverCategories(*magdeburgHub.Slug)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
for _, cat := range categories.Categories.Categories {
|
||||||
|
fmt.Println(*cat.Id, *cat.Slug, cat.Name)
|
||||||
|
if cat.SubCategories != nil {
|
||||||
|
productCats, err := api.NewAPIClient().DiscoverCategoriesSpecific(*magdeburgHub.Slug, *cat.Slug)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
for _, subcat := range productCats.Categories {
|
||||||
|
fmt.Println("\t", *subcat.Id, *subcat.Slug, subcat.Name)
|
||||||
|
for _, product := range *subcat.Products.Products {
|
||||||
|
|
||||||
|
fmt.Println("\t\t", *product.Id, product.Name, product.Price, product.Quantity, product.BasePrice, product.SKU, product.Thumbnail)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue