github.com/grokify/go-ringcentral-client@v0.3.31/office/v1/examples/simple/main.go (about)

     1  package main
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"log"
     7  	"net/http"
     8  	"net/url"
     9  	"os"
    10  
    11  	"github.com/grokify/goauth"
    12  	"github.com/grokify/goauth/authutil"
    13  	"github.com/grokify/goauth/ringcentral"
    14  	"github.com/grokify/mogo/config"
    15  	"github.com/grokify/mogo/errors/errorsutil"
    16  	"github.com/grokify/mogo/fmt/fmtutil"
    17  	"github.com/grokify/mogo/mime/multipartutil"
    18  	"github.com/grokify/mogo/net/http/httputilmore"
    19  	"github.com/grokify/mogo/net/urlutil"
    20  	"github.com/jessevdk/go-flags"
    21  	"golang.org/x/oauth2"
    22  )
    23  
    24  type Options struct {
    25  	EnvPath string `short:"e" long:"envPath" description:"Environment File Path"`
    26  	EnvVar  string `short:"v" long:"envVar" description:"Environment Variable Name"`
    27  	Token   string `short:"t" long:"token" description:"Token"`
    28  }
    29  
    30  func loadEnv() (Options, error) {
    31  	opts := Options{}
    32  	_, err := flags.Parse(&opts)
    33  	if err != nil {
    34  		return opts, err
    35  	}
    36  
    37  	_, err = config.LoadDotEnv([]string{opts.EnvPath, os.Getenv("ENV_PATH"), "./.env"}, 1)
    38  	if err != nil {
    39  		return opts, errorsutil.Wrap(err, "E_LOAD_DOT_ENV")
    40  	}
    41  	return opts, nil
    42  }
    43  
    44  func getApplicationConfig(cfg []byte) (goauth.Credentials, error) {
    45  	ac := goauth.Credentials{}
    46  	err := json.Unmarshal(cfg, &ac)
    47  	if err != nil {
    48  		return ac, errorsutil.Wrap(
    49  			err, fmt.Sprintf("E_JSON_UNMARSHAL [%v]", string(cfg)))
    50  	}
    51  	return ac, nil
    52  }
    53  
    54  func getTokenFromApplicationConfig(ac goauth.Credentials) (*oauth2.Token, error) {
    55  	token, err := ringcentral.NewTokenPassword(*ac.OAuth2)
    56  	if err != nil {
    57  		return nil, err
    58  	}
    59  	token.Expiry = token.Expiry.UTC()
    60  
    61  	fmtutil.PrintJSON(token)
    62  	return token, nil
    63  }
    64  
    65  const (
    66  	ExtensionAnsweringRuleURL = "/restapi/v1.0/account/~/extension/~/answering-rule"
    67  	ExtensionGreetingURL      = "/restapi/v1.0/account/~/extension/~/greeting"
    68  )
    69  
    70  func main() {
    71  	opts, err := loadEnv()
    72  	if err != nil {
    73  		log.Fatal(err)
    74  	}
    75  
    76  	cfgJSON := ""
    77  
    78  	if len(opts.EnvVar) > 0 {
    79  		cfgJSON = os.Getenv(opts.EnvVar)
    80  	}
    81  	if len(cfgJSON) == 0 {
    82  		log.Fatal("E_NO_APP_CONFIG")
    83  	}
    84  
    85  	ac, err := getApplicationConfig([]byte(cfgJSON))
    86  	if err != nil {
    87  		log.Fatal(err)
    88  	}
    89  	token, err := getTokenFromApplicationConfig(ac)
    90  	if err != nil {
    91  		log.Fatal(err)
    92  	}
    93  	client := authutil.NewClientTokenOAuth2(token)
    94  
    95  	resp, err := client.Get(urlutil.JoinAbsolute(ac.OAuth2.ServerURL, ExtensionAnsweringRuleURL))
    96  	if err != nil {
    97  		log.Fatal(err)
    98  	}
    99  	err = httputilmore.PrintResponse(resp, true)
   100  	if err != nil {
   101  		log.Fatal(err)
   102  	}
   103  
   104  	params := url.Values{}
   105  	params.Set("type", "HoldMusic")
   106  	params.Set("answeringRuleId", "business-hours-rule")
   107  
   108  	req, err := multipartutil.NewHTTPRequest(
   109  		http.MethodPost,
   110  		urlutil.JoinAbsolute(ac.OAuth2.ServerURL, ExtensionGreetingURL),
   111  		params,
   112  		[]multipartutil.FileInfo{
   113  			{
   114  				MIMEPartName: "binary",
   115  				Filepath:     "star-wars_decoded.wav",
   116  			},
   117  		},
   118  	)
   119  	if err != nil {
   120  		log.Fatal(err)
   121  	}
   122  	if 1 == 0 {
   123  		err = httputilmore.PrintRequestOut(req, true)
   124  		if err != nil {
   125  			log.Fatal(err)
   126  		}
   127  	}
   128  	resp, err = client.Do(req)
   129  	if err != nil {
   130  		log.Fatal(err)
   131  	}
   132  	err = httputilmore.PrintResponse(resp, true)
   133  	if err != nil {
   134  		log.Fatal(err)
   135  	}
   136  
   137  	fmt.Println("DONE")
   138  }