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

     1  package lite
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"net/http"
     7  	"net/url"
     8  
     9  	"github.com/grokify/goauth"
    10  	"github.com/grokify/goauth/authutil"
    11  	"github.com/grokify/mogo/encoding/jsonutil"
    12  	"github.com/grokify/mogo/errors/errorsutil"
    13  )
    14  
    15  type EngageCredentials struct {
    16  	Credentials goauth.Credentials
    17  	EngageToken EngageToken
    18  }
    19  
    20  func NewEngageCredentialsJSON(rcCredentialsJSON []byte) (EngageCredentials, error) {
    21  	ec := EngageCredentials{}
    22  	rcCredentials, err := goauth.NewCredentialsJSON(rcCredentialsJSON, nil)
    23  	if err != nil {
    24  		return ec, errorsutil.Wrap(err, "NewEngageCredentialsJSON>>ringcentral.NewCredentialsJSON")
    25  	}
    26  	ec.Credentials = rcCredentials
    27  	return ec, nil
    28  }
    29  
    30  func (ec *EngageCredentials) LoadNewTokens(ctx context.Context) error {
    31  	rcToken, err := ec.Credentials.NewToken(ctx)
    32  	if err != nil {
    33  		return errorsutil.Wrap(err, "EngageCredentials>>ec.Credentials.NewToken()")
    34  	}
    35  	evToken, err := RcToEvToken(rcToken.AccessToken)
    36  	if err != nil {
    37  		return err
    38  	}
    39  	ec.EngageToken = evToken
    40  	return nil
    41  }
    42  
    43  func (ec *EngageCredentials) NewClient(ctx context.Context) (*http.Client, error) {
    44  	err := ec.LoadNewTokens(ctx)
    45  	if err != nil {
    46  		return nil, err
    47  	}
    48  	engageClient := authutil.NewClientToken(
    49  		authutil.TokenBearer, ec.EngageToken.AccessToken, false)
    50  	return engageClient, nil
    51  }
    52  
    53  type EngageToken struct {
    54  	AccessToken string `json:"accessToken"`
    55  	TokenType   string `json:"tokenType"`
    56  }
    57  
    58  func RcToEvToken(rctoken string) (EngageToken, error) {
    59  	evToken := EngageToken{}
    60  
    61  	res, err := http.PostForm(
    62  		"https://engage.ringcentral.com/api/auth/login/rc/accesstoken",
    63  		url.Values{"rcAccessToken": {rctoken}, "rcTokenType": {"Bearer"}})
    64  	if err != nil {
    65  		return evToken, errorsutil.Wrap(err, "RcToEvToken.PostForm")
    66  	}
    67  	if res.StatusCode >= 300 {
    68  		return evToken, fmt.Errorf("RcToEvToken.ApiResponse.StatusCode [%v]", res.StatusCode)
    69  	}
    70  
    71  	_, err = jsonutil.UnmarshalReader(res.Body, &evToken)
    72  	if err != nil {
    73  		err = errorsutil.Wrap(err, "RcToEvToken.jsonutil.UnmarshalIoReader")
    74  	}
    75  	return evToken, err
    76  }