package client import ( "encoding/json" "errors" "fmt" "github.com/gofiber/fiber/v2" "go.uber.org/zap" "gitea.pena/SQuiz/shutterstock/internal/model" "strings" ) type Deps struct { ShutterStockUrl string ShutterStockApiToken string Logger *zap.Logger } type ShutterStockClient struct { shutterStockUrl string shutterStockApiToken string fiberClient *fiber.Client logger *zap.Logger } func NewShutterStockClient(deps Deps) *ShutterStockClient { fiberClient := fiber.AcquireClient() return &ShutterStockClient{ shutterStockUrl: deps.ShutterStockUrl, shutterStockApiToken: deps.ShutterStockApiToken, fiberClient: fiberClient, logger: deps.Logger, } } func (s *ShutterStockClient) ImgSearch(params map[model.ShutterStockParams]string) (*model.ImgSearchResp, error) { url := fmt.Sprintf("%s/v2/images/search", s.shutterStockUrl) if len(params) > 0 { queryParams := make([]string, 0, len(params)) for key, value := range params { queryParams = append(queryParams, fmt.Sprintf("%s=%s", key, value)) } url = fmt.Sprintf("%s?%s", url, strings.Join(queryParams, "&")) } fmt.Println(url) agent := s.fiberClient.Get(url) agent.Set("Authorization", fmt.Sprintf("Bearer %s", s.shutterStockApiToken)) agent.Set("Accept", "application/json") statusCode, resBody, errs := agent.Bytes() if len(errs) > 0 { for _, err := range errs { s.logger.Error("Error Img Search Shutter Stock", zap.Error(err)) } return nil, fmt.Errorf("request failed: %v", errs) } if statusCode != fiber.StatusOK { errorMessage := fmt.Sprintf("received an incorrect response from Img Search Shutter Stock: %d", statusCode) s.logger.Error(errorMessage, zap.Int("status", statusCode), zap.String("respBody", string(resBody))) return nil, errors.New(errorMessage) } resp := new(model.ImgSearchResp) if err := json.Unmarshal(resBody, resp); err != nil { s.logger.Error("failed to unmarshal Img Search Shutter Stock response", zap.Error(err)) return nil, err } return resp, nil }