docxTemplater/amo/api.go

225 lines
4.5 KiB
Go
Raw Normal View History

2022-07-28 15:00:43 +00:00
package amo
import (
"bytes"
"encoding/json"
"fmt"
"golang.org/x/oauth2"
"net/http"
"net/url"
"time"
)
const (
OAUTH_URL = "https://www.amocrm.ru/oauth"
)
type Client struct {
App *ClientApp
HTTPClient *http.Client
Subdomain string // Субдомен с которым работаем
Code string // Код авторизации
Token *oauth2.Token
}
type ClientApp struct {
Secret string // Секретка интеграции
ClientID string // Айди интеграции
RedirectUri string // Страница перенаправления
}
func NewClientApp(secret string, ClientID string, redirectUri string) *ClientApp {
return &ClientApp{Secret: secret, ClientID: ClientID, RedirectUri: redirectUri}
}
func (ca *ClientApp) GenerateOAuthUrl() string {
val := make(url.Values)
//val.Set("state", "myState123")
val.Set("client_id", ca.ClientID)
val.Set("redirect_uri", ca.RedirectUri)
val.Set("mode", "popup")
return OAUTH_URL + "?" + val.Encode()
}
func (ca *ClientApp) NewClient(subdomain, code string) *Client {
return &Client{
App: ca,
HTTPClient: &http.Client{},
Subdomain: "https://" + subdomain,
Code: code,
}
}
// AuthCode - обменивает код авторизации на токен
func (c *Client) AuthCode() (*oauth2.Token, error) {
body := map[string]string{
"client_id": c.App.ClientID,
"client_secret": c.App.Secret,
"grant_type": "authorization_code",
"code": c.Code,
"redirect_uri": c.App.RedirectUri,
}
bytesBody, err := json.Marshal(body)
if err != nil {
return nil, err
}
req, err := http.NewRequest("POST", c.Subdomain+"/oauth2/access_token", bytes.NewBuffer(bytesBody))
if err != nil {
fmt.Println("1")
return nil, err
}
c.setHeaders(req)
resp, err := c.HTTPClient.Do(req)
if err != nil {
fmt.Println("2")
return nil, err
}
var response RespAuthCode
err = json.NewDecoder(resp.Body).Decode(&response)
if err != nil {
return nil, err
}
c.Token = &oauth2.Token{
AccessToken: response.AccessToken,
TokenType: response.TokenType,
RefreshToken: response.RefreshToken,
Expiry: time.Now().Add(time.Duration(response.ExpiresIn) * time.Second),
}
return c.Token, nil
}
func (c *Client) SetToken(token *oauth2.Token) {
c.Token = token
}
func (c *Client) GetAccount() (*Account, error) {
req, err := http.NewRequest("GET", c.Subdomain+"/api/v4/account", nil)
if err != nil {
fmt.Println("1")
return nil, err
}
c.setHeaders(req)
resp, err := c.HTTPClient.Do(req)
if err != nil {
fmt.Println("2")
return nil, err
}
var response Account
err = json.NewDecoder(resp.Body).Decode(&response)
if err != nil {
fmt.Println("3")
return nil, err
}
return &response, nil
}
func (c *Client) GetLeadById(id string) (*Lead, error) {
req, err := http.NewRequest("GET",
fmt.Sprintf("%v/api/v4/leads/%v?with=contacts,catalog_elements,is_price_modified_by_robot,loss_reason",
c.Subdomain, id),
nil,
)
if err != nil {
fmt.Println("1")
return nil, err
}
c.setHeaders(req)
resp, err := c.HTTPClient.Do(req)
if err != nil {
fmt.Println("2")
return nil, err
}
var response Lead
err = json.NewDecoder(resp.Body).Decode(&response)
if err != nil {
return nil, err
}
return &response, nil
}
func (c *Client) GetContactById(id string) (*Contact, error) {
req, err := http.NewRequest("GET",
fmt.Sprintf("%v/api/v4/contacts/%v?with=catalog_elements,leads,customers",
c.Subdomain, id),
nil,
)
if err != nil {
fmt.Println("1")
return nil, err
}
c.setHeaders(req)
resp, err := c.HTTPClient.Do(req)
if err != nil {
fmt.Println("2")
return nil, err
}
var response Contact
err = json.NewDecoder(resp.Body).Decode(&response)
if err != nil {
return nil, err
}
return &response, nil
}
func (c *Client) GetCompanyById(id string) (*Company, error) {
req, err := http.NewRequest("GET",
fmt.Sprintf("%v/api/v4/companies/%v?with=contacts,leads,catalog_elements,customers",
c.Subdomain, id),
nil,
)
if err != nil {
fmt.Println("1")
return nil, err
}
c.setHeaders(req)
resp, err := c.HTTPClient.Do(req)
if err != nil {
fmt.Println("2")
return nil, err
}
var response Company
err = json.NewDecoder(resp.Body).Decode(&response)
if err != nil {
return nil, err
}
return &response, nil
}
func (c *Client) setHeaders(req *http.Request) {
req.Header.Set("User-Agent", "amoCRM-oAuth-client/1.0")
req.Header.Set("Content-Type", "application/json")
if c.Token != nil {
c.Token.SetAuthHeader(req)
}
}