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 }