shutterstock/internal/client/shutterstock.go
2025-02-25 11:24:41 +03:00

75 lines
2.0 KiB
Go

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
}