Add Wildberries product fetching and rate limiting functionality
This commit is contained in:
59
internal/wb/common.go
Normal file
59
internal/wb/common.go
Normal file
@@ -0,0 +1,59 @@
|
||||
package wb
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"github.com/golang-jwt/jwt/v5"
|
||||
"net/http"
|
||||
"sipro-mps/internal/marketplace"
|
||||
wbclient "sipro-mps/pkg/api/wb/client"
|
||||
"time"
|
||||
)
|
||||
|
||||
type WbAuthData struct {
|
||||
Token string `json:"token"`
|
||||
}
|
||||
|
||||
func NewWbAuthData(token string) WbAuthData {
|
||||
return WbAuthData{
|
||||
Token: token,
|
||||
}
|
||||
}
|
||||
|
||||
func DecodeWildberriesJwt(token []byte) (WbAuthData, jwt.MapClaims, error) {
|
||||
var authData WbAuthData
|
||||
err := json.Unmarshal(token, &authData)
|
||||
if err != nil {
|
||||
return authData, nil, fmt.Errorf("failed to unmarshal JWT: %w", err)
|
||||
}
|
||||
claims := jwt.MapClaims{}
|
||||
_, _, err = jwt.NewParser().ParseUnverified(authData.Token, claims)
|
||||
if err != nil {
|
||||
return authData, nil, fmt.Errorf("invalid JWT: %w", err)
|
||||
}
|
||||
|
||||
return authData, claims, nil
|
||||
}
|
||||
|
||||
func GetClientFromMarketplace(mp *marketplace.Marketplace) (*wbclient.Client, error) {
|
||||
|
||||
authData, claims, err := DecodeWildberriesJwt(mp.AuthDataJson)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to decode Wildberries JWT")
|
||||
}
|
||||
exp := claims["exp"].(float64)
|
||||
// chec if token is expired, for now unix date
|
||||
now := float64(time.Now().Unix())
|
||||
if exp < now {
|
||||
return nil, fmt.Errorf("token is expired")
|
||||
}
|
||||
securityHandler := NewWildberriesSecurityHandler(authData.Token)
|
||||
httpClient := &http.Client{
|
||||
Transport: NewRateLimitTransport(),
|
||||
}
|
||||
client, err := wbclient.NewClient("https://content-api.wildberries.ru", securityHandler, wbclient.WithClient(httpClient))
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to create Wildberries client: %w", err)
|
||||
}
|
||||
return client, nil
|
||||
}
|
||||
Reference in New Issue
Block a user