docxTemplater/amo/api.go
Danil Solovyov 5ddc6b166e Init
2022-07-28 20:00:43 +05:00

225 lines
4.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)
}
}