github.com/grokify/go-ringcentral-client@v0.3.31/engagevoice/v1/util/lite/api_token.go (about)

     1  package lite
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"io/ioutil"
     7  	"log"
     8  	"net/http"
     9  	"net/url"
    10  	"strings"
    11  	"time"
    12  
    13  	"github.com/grokify/mogo/encoding/jsonutil"
    14  	"github.com/grokify/mogo/errors/errorsutil"
    15  	"github.com/grokify/mogo/net/http/httputilmore"
    16  )
    17  
    18  // portal.vacd.biz:8081
    19  
    20  const (
    21  	EngageVoiceServerURL    string = "https://portal.vacd.biz"
    22  	EngageVoiceLoginURL     string = "https://portal.vacd.biz/api/v1/auth/login"
    23  	EngageVoiceTokenURL     string = "https://portal.vacd.biz/api/v1/admin/token"
    24  	EngageVoiceTokenURLPath string = "/api/v1/admin/token"
    25  	HeaderEngageVoiceToken  string = "x-auth-token"
    26  )
    27  
    28  type LoginSuccess struct {
    29  	AuthToken    string    `json:"authToken"`
    30  	PlatformHost string    `json:"platformHost"`
    31  	Accounts     []Account `json:"accounts"`
    32  }
    33  
    34  type User struct {
    35  	UserID       int64     `json:"userId"`
    36  	UserName     string    `json:"userName"`
    37  	FirstName    string    `json:"firstName"`
    38  	LastName     string    `json:"lastName"`
    39  	FullName     string    `json:"fullName"`
    40  	CreationDate time.Time `json:"creationDate"`
    41  	Enabled      bool      `json:"enabled"`
    42  	ParentPath   string    `json:"parentPath"`
    43  	RcUserID     string    `json:"rcUserId"`
    44  	Roles        []Role    `json:"roles"`
    45  	RootUser     bool      `json:"rootUser"`
    46  	// PhoneNumber  string    `json:"phoneNumber"`
    47  	// Children []Children `json:"children"`
    48  }
    49  
    50  type Role struct {
    51  	RoleType    string `json:"roleType"`
    52  	Description string `json:"description"`
    53  }
    54  
    55  type Account struct {
    56  	MainAccountID               string `json:"mainAccountId"`
    57  	AccountID                   string `json:"accountId"`
    58  	AccountName                 string `json:"accountName"`
    59  	EnableMultiUser             bool   `json:"enableMultiUser"`
    60  	EnableSoftphones            bool   `json:"enableSoftphones"`
    61  	TcpaSafeMode                bool   `json:"tcpaSafeMode"`
    62  	EnableVoiceBroadcast        bool   `json:"enableVoiceBroadcast"`
    63  	OutboundPrepay              bool   `json:"outboundPrepay"`
    64  	Enable247Dialing            bool   `json:"enable247Dialing"`
    65  	EnableFifo                  bool   `json:"enableFifo"`
    66  	EnableChat                  bool   `json:"enableChat"`
    67  	EnableInbound               bool   `json:"enableInbound"`
    68  	EnableOutbound              bool   `json:"enableOutbound"`
    69  	EnableVisualIvr             bool   `json:"enableVisualIvr"`
    70  	EnableTracking              bool   `json:"enableTracking"`
    71  	EnableCloudRouting          bool   `json:"enableCloudRouting"`
    72  	UsePowerBy                  bool   `json:"usePowerBy"`
    73  	EnableAgentRankRouting      bool   `json:"enableAgentRankRouting"`
    74  	EnableHciDialer             bool   `json:"enableHciDialer"`
    75  	EnableTcpaSafeMachineDetect bool   `json:"enableTcpaSafeMachineDetect"`
    76  	EmailFromAddress            string `json:"emailFromAddress"`
    77  	DatabaseShardID             string `json:"databaseShardId"`
    78  	DefaultOutdialServerGroupID int64  `json:"defaultOutdialServerGroupId"`
    79  	DefaultIntellidialServerID  int64  `json:"defaultIntellidialServerId"`
    80  	RcAccountAccess             string `json:"rcAccountAccess"`
    81  	EnableGoodData              bool   `json:"enableGoodData"`
    82  	MainAccountName             string `json:"mainAccountName"`
    83  }
    84  
    85  type LoginError struct {
    86  	GeneralMessage string `json:"generalMessage"`
    87  	Details        string `json:"details"`
    88  	RequestURI     string `json:"requestUri"`
    89  	Timestamp      int64  `json:"timestamp"`
    90  }
    91  
    92  func GenerateAPIToken(username, password string) (string, *LoginSuccess, error) {
    93  	respSucc, _, resp, err := RequestAuthToken(username, password)
    94  	if err != nil {
    95  		return "", nil, err
    96  	} else if resp.StatusCode != 200 {
    97  		return "", nil, fmt.Errorf("E_AUTH_RESPONSE_STATUS_CODE_NOT_200 [%v]", resp.StatusCode)
    98  	}
    99  
   100  	if len(strings.TrimSpace(respSucc.AuthToken)) == 0 {
   101  		return "", nil, errors.New("E_EMPTY_AUTH_TOKEN")
   102  	}
   103  
   104  	apiToken, err := ExchangeAPIToken(respSucc.AuthToken)
   105  	if err != nil {
   106  		return "", respSucc, err
   107  	}
   108  	return apiToken, respSucc, nil
   109  }
   110  
   111  func ExchangeAPIToken(authToken string) (string, error) {
   112  	req, err := http.NewRequest(http.MethodPost, EngageVoiceTokenURL, nil)
   113  	if err != nil {
   114  		return "", err
   115  	}
   116  	req.Header.Add(HeaderEngageVoiceToken, authToken)
   117  	client := &http.Client{}
   118  	resp, err := client.Do(req)
   119  	if err != nil {
   120  		return "", errorsutil.Wrap(err, "ExchangeAPIToken.client.Do()")
   121  	} else if resp.StatusCode != 200 {
   122  		return "", fmt.Errorf("TOKEN_RESP_STATUS_CODE_NOT_200 [%v]", resp.StatusCode)
   123  	}
   124  	body, err := ioutil.ReadAll(resp.Body)
   125  	if err != nil {
   126  		return "", err
   127  	}
   128  	token := strings.TrimSpace(string(body))
   129  	if len(token) == 0 {
   130  		return "", fmt.Errorf("E_EMPTY_API_TOKEN")
   131  	}
   132  	return token, nil
   133  }
   134  
   135  func RequestAuthToken(username, password string) (*LoginSuccess, *LoginError, *http.Response, error) {
   136  	data := url.Values{}
   137  	data.Set("username", username)
   138  	data.Set("password", password)
   139  
   140  	resp, err := httputilmore.SendWWWFormURLEncodedSimple(http.MethodPost, EngageVoiceLoginURL, data)
   141  	if err != nil {
   142  		return nil, nil, resp, err
   143  	}
   144  	bytes, err := ioutil.ReadAll(resp.Body)
   145  	if err != nil {
   146  		log.Fatal(err)
   147  	}
   148  	fmt.Println(string(bytes))
   149  	if resp.StatusCode != 200 {
   150  		respData := LoginError{}
   151  		_, err := jsonutil.UnmarshalReader(resp.Body, &respData)
   152  		if err != nil {
   153  			return nil, &respData, resp, err
   154  		}
   155  		return nil, &respData, resp, fmt.Errorf("AuthUrl Status != 200 [%v]", resp.StatusCode)
   156  	}
   157  	authData := LoginSuccess{}
   158  	_, err = jsonutil.UnmarshalReader(resp.Body, &authData)
   159  	if err != nil {
   160  		return nil, nil, resp, err
   161  	}
   162  	return &authData, nil, resp, nil
   163  }
   164  
   165  func ListTokens(serverURL, authOrApiToken string) ([]string, error) {
   166  	tokens := []string{}
   167  	headers, apiURL, err := APIInfo(
   168  		serverURL, EngageVoiceTokenURLPath, authOrApiToken)
   169  	if err != nil {
   170  		return tokens, err
   171  	}
   172  
   173  	resp, err := httputilmore.GetJSONSimple(apiURL, headers, &tokens)
   174  	if err != nil {
   175  		return tokens, err
   176  	} else if resp.StatusCode >= 300 {
   177  		return tokens, errors.New("E_RESPONSE_STATUS_CODE_NOT_2XX")
   178  	}
   179  	return tokens, nil
   180  }