package bitrixClient import ( "encoding/json" "fmt" "github.com/gofiber/fiber/v2" "go.uber.org/zap" "penahub.gitlab.yandexcloud.net/backend/quiz/bitrix/internal/models" "penahub.gitlab.yandexcloud.net/backend/quiz/bitrix/internal/workers/limiter" "sync" "time" ) type Bitrix struct { fiberClient *fiber.Client logger *zap.Logger redirectionURL string integrationID string integrationSecret string rateLimiter *limiter.RateLimiter fileMutex sync.Mutex } type BitrixDeps struct { FiberClient *fiber.Client Logger *zap.Logger RedirectionURL string IntegrationID string IntegrationSecret string RateLimiter *limiter.RateLimiter } func NewBitrixClient(deps BitrixDeps) *Bitrix { if deps.FiberClient == nil { deps.FiberClient = fiber.AcquireClient() } return &Bitrix{ fiberClient: deps.FiberClient, logger: deps.Logger, redirectionURL: deps.RedirectionURL, integrationSecret: deps.IntegrationSecret, integrationID: deps.IntegrationID, rateLimiter: deps.RateLimiter, } } func (b *Bitrix) GetUserList(accesToken string, domain string) (*models.ResponseGetListUsers, error) { for { if b.rateLimiter.Check() { uri := fmt.Sprintf("https://%s/rest/user.search", domain) agent := b.fiberClient.Get(uri) agent.Set("Authorization", "Bearer "+accesToken) statusCode, resBody, errs := agent.Bytes() if len(errs) > 0 { for _, err := range errs { b.logger.Error("error sending request in GetUserList", zap.Error(err)) } return nil, fmt.Errorf("request GetUserList failed: %v", errs[0]) } if statusCode != fiber.StatusOK { errorMessage := fmt.Sprintf("error GetUserList statusCode - %d, respBody - %s", statusCode, string(resBody)) b.logger.Error(errorMessage, zap.Int("status", statusCode)) return nil, fmt.Errorf(errorMessage) } var userListResponse models.ResponseGetListUsers err := json.Unmarshal(resBody, &userListResponse) if err != nil { b.logger.Error("error unmarshal ResponseGetListUsers:", zap.Error(err)) return nil, err } return &userListResponse, nil } time.Sleep(b.rateLimiter.Interval) } }