diff --git a/amoClients/amo.go b/amoClients/amo.go index 78ffc24..38bf511 100644 --- a/amoClients/amo.go +++ b/amoClients/amo.go @@ -3,7 +3,6 @@ package amoClients import ( "amocrm/models/amo" "encoding/json" - "errors" "fmt" "github.com/gofiber/fiber/v2" "go.uber.org/zap" @@ -52,33 +51,35 @@ func NewAmoClient(deps AmoDeps) *Amo { func (a *Amo) GetUserList(req amo.RequestGetListUsers) (*amo.ResponseGetListUsers, error) { url := fmt.Sprintf("%s?page=%d&limit=%d&with=%s", a.urlUserList, req.Page, req.Limit, req.With) - resp := a.fiberClient.Get(url) + agent := a.fiberClient.Get(url) - statusCode, response, errs := resp.Bytes() - if errs != nil { - a.logger.Error("error GetUserList:", zap.Error(errs[0])) - return nil, errs[0] + statusCode, resBody, errs := agent.Bytes() + if len(errs) > 0 { + for _, err := range errs { + a.logger.Error("error sending request in GetUserList", zap.Error(err)) + } + return nil, fmt.Errorf("request GetUserList failed: %v", errs[0]) } if statusCode != fiber.StatusOK { switch statusCode { case fiber.StatusForbidden: - err := errors.New("error GetUserList StatusForbidden - 403") - a.logger.Error("error GetUserList:", zap.Error(err)) - return nil, err + errorMessage := fmt.Sprintf("error GetUserList StatusForbidden - %d", statusCode) + a.logger.Error(errorMessage, zap.Int("status", statusCode)) + return nil, fmt.Errorf(errorMessage) case fiber.StatusUnauthorized: - err := errors.New("error GetUserList StatusUnauthorized - 401") - a.logger.Error("error GetUserList:", zap.Error(err)) - return nil, err + errorMessage := fmt.Sprintf("error GetUserList StatusUnauthorized - %d", statusCode) + a.logger.Error(errorMessage, zap.Int("status", statusCode)) + return nil, fmt.Errorf(errorMessage) default: - err := errors.New(fmt.Sprintf("error GetUserList statusCode- %d", statusCode)) - a.logger.Error("error GetUserList:", zap.Error(err)) - return nil, err + errorMessage := fmt.Sprintf("error GetUserList statusCode - %d", statusCode) + a.logger.Error(errorMessage, zap.Int("status", statusCode)) + return nil, fmt.Errorf(errorMessage) } } var userListResponse amo.ResponseGetListUsers - err := json.Unmarshal(response, &userListResponse) + err := json.Unmarshal(resBody, &userListResponse) if err != nil { a.logger.Error("error marshal ResponseGetListUsers:", zap.Error(err)) return nil, err @@ -88,8 +89,40 @@ func (a *Amo) GetUserList(req amo.RequestGetListUsers) (*amo.ResponseGetListUser } // https://www.amocrm.ru/developers/content/oauth/step-by-step -func (a *Amo) CreateWebHook() { +// POST /oauth2/access_token +// тут и создание по коду и обновление по рефрешу в этом клиенте +func (a *Amo) CreateWebHook(req amo.WebHookRequest) (*amo.CreateWebHookResp, error) { + bodyBytes, err := json.Marshal(req) + if err != nil { + a.logger.Error("error marshal req in CreateWebHook:", zap.Error(err)) + return nil, err + } + agent := a.fiberClient.Post(a.urlCreateWebHook) + agent.Set("Content-Type", "application/json").Body(bodyBytes) + + statusCode, resBody, errs := agent.Bytes() + if len(errs) > 0 { + for _, err = range errs { + a.logger.Error("error sending request in CreateWebHook for create or update tokens", zap.Error(err)) + } + return nil, fmt.Errorf("request failed: %v", errs[0]) + } + + if statusCode != fiber.StatusOK { + errorMessage := fmt.Sprintf("received an incorrect response from CreateWebHook: %d", statusCode) + a.logger.Error(errorMessage, zap.Int("status", statusCode)) + return nil, fmt.Errorf(errorMessage) + } + + var tokens amo.CreateWebHookResp + err = json.Unmarshal(resBody, &tokens) + if err != nil { + a.logger.Error("error marshal CreateWebHookResp:", zap.Error(err)) + return nil, err + } + + return &tokens, nil } // https://www.amocrm.ru/developers/content/oauth/step-by-step#%D0%A5%D1%83%D0%BA-%D0%BE%D0%B1-%D0%BE%D1%82%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B8-%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B0%D1%86%D0%B8%D0%B8 diff --git a/models/amo/createWebHook.go b/models/amo/createWebHook.go new file mode 100644 index 0000000..ecc0346 --- /dev/null +++ b/models/amo/createWebHook.go @@ -0,0 +1,72 @@ +package amo + +type CreateWebHookReq struct { + ClientID string `json:"client_id"` // id интеграции + ClientSecret string `json:"client_secret"` // Секрет интеграции + GrantType string `json:"grant_type"` // Тип авторизационных данных (для кода авторизации – authorization_code) + Code string `json:"code"` // Полученный код авторизации + RedirectUrl string `json:"redirect_uri"` // Redirect URI указанный в настройках интеграции. Должен четко совпадать с тем, что указан в настройках +} + +type CreateWebHookResp struct { + TokenType string `json:"token_type"` // Тип токена + ExpiresIn int `json:"expires_in"` // ttl в секундах + AccessToken string `json:"access_token"` // Access Token в формате JWT + RefreshToken string `json:"refresh_token"` +} + +type UpdateWebHookReq struct { + ClientID string `json:"client_id"` // id интеграции + ClientSecret string `json:"client_secret"` // Секрет интеграции + GrantType string `json:"grant_type"` // Тип авторизационных данных (для кода авторизации – authorization_code) + RefreshToken string `json:"refresh_token"` // Refresh токен + RedirectUrl string `json:"redirect_uri"` // Redirect URI указанный в настройках интеграции. Должен четко совпадать с тем, что указан в настройках +} + +type WebHookRequest interface { + GetClientID() string + GetClientSecret() string + GetGrantType() string + GetRedirectURL() string + GetToken() string +} + +func (req CreateWebHookReq) GetClientID() string { + return req.ClientID +} + +func (req CreateWebHookReq) GetClientSecret() string { + return req.ClientSecret +} + +func (req CreateWebHookReq) GetGrantType() string { + return req.GrantType +} + +func (req CreateWebHookReq) GetRedirectURL() string { + return req.RedirectUrl +} + +func (req CreateWebHookReq) GetToken() string { + return req.Code +} + +func (req UpdateWebHookReq) GetClientID() string { + return req.ClientID +} + +func (req UpdateWebHookReq) GetClientSecret() string { + return req.ClientSecret +} + +func (req UpdateWebHookReq) GetGrantType() string { + return req.GrantType +} + +func (req UpdateWebHookReq) GetRedirectURL() string { + return req.RedirectUrl +} + +func (req UpdateWebHookReq) GetToken() string { + return req.RefreshToken +}