Skip to content

Commit

Permalink
Merge pull request #1 from thomazfeitoza/error_handling
Browse files Browse the repository at this point in the history
Improve error descriptions of Optimizely API calls
  • Loading branch information
pffreitas committed Feb 16, 2022
2 parents 3d1f0d5 + 009de98 commit 740cfa5
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 225 deletions.
82 changes: 8 additions & 74 deletions optimizely/client/audience.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@ import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"

"github.com/pffreitas/optimizely-terraform-provider/optimizely/audience"
)
Expand All @@ -16,58 +14,26 @@ func (c OptimizelyClient) CreateAudience(aud audience.Audience) (audience.Audien
return aud, err
}

req, err := c.newHttpRequest("POST", "v2/audiences", bytes.NewBuffer(postBody))
if err != nil {
return aud, err
}

httpClient := http.Client{}
resp, err := httpClient.Do(req)
if err != nil {
return aud, err
}

if !c.isOk(resp.StatusCode) {
return audience.Audience{}, fmt.Errorf("failed to create audience in optimizely: %s", aud.Name)
}

defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
respBody, err := c.sendHttpRequest("POST", "v2/audiences", bytes.NewBuffer(postBody))
if err != nil {
return aud, err
}

var audienceResp audience.Audience
json.Unmarshal(body, &audienceResp)
json.Unmarshal(respBody, &audienceResp)

return audienceResp, nil
}

func (c OptimizelyClient) GetAudience(audId string) (audience.Audience, error) {

req, err := c.newHttpRequest("GET", fmt.Sprintf("v2/audiences/%s", audId), nil)
if err != nil {
return audience.Audience{}, err
}

httpClient := http.Client{}
resp, err := httpClient.Do(req)
if err != nil {
return audience.Audience{}, err
}

if !c.isOk(resp.StatusCode) {
return audience.Audience{}, fmt.Errorf("failed to get audience from optimizely: %s", audId)
}

defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
respBody, err := c.sendHttpRequest("GET", fmt.Sprintf("v2/audiences/%s", audId), nil)
if err != nil {
return audience.Audience{}, err
}

var audienceResp audience.Audience
json.Unmarshal(body, &audienceResp)
json.Unmarshal(respBody, &audienceResp)

return audienceResp, nil
}
Expand All @@ -80,29 +46,13 @@ func (c OptimizelyClient) ArchiveAudience(audId string) (audience.Audience, erro
return audience.Audience{}, err
}

req, err := c.newHttpRequest("PATCH", fmt.Sprintf("v2/audiences/%s", audId), bytes.NewBuffer(postBody))
if err != nil {
return audience.Audience{}, err
}

httpClient := http.Client{}
resp, err := httpClient.Do(req)
if err != nil {
return audience.Audience{}, err
}

if !c.isOk(resp.StatusCode) {
return audience.Audience{}, fmt.Errorf("failed to archive audience in optimizely: %s", audId)
}

defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
respBody, err := c.sendHttpRequest("PATCH", fmt.Sprintf("v2/audiences/%s", audId), bytes.NewBuffer(postBody))
if err != nil {
return audience.Audience{}, err
}

var audienceResp audience.Audience
json.Unmarshal(body, &audienceResp)
json.Unmarshal(respBody, &audienceResp)

return audienceResp, nil
}
Expand All @@ -113,29 +63,13 @@ func (c OptimizelyClient) UpdateAudience(aud audience.Audience) (audience.Audien
return audience.Audience{}, err
}

req, err := c.newHttpRequest("PATCH", fmt.Sprintf("v2/audiences/%d", aud.ID), bytes.NewBuffer(postBody))
if err != nil {
return audience.Audience{}, err
}

httpClient := http.Client{}
resp, err := httpClient.Do(req)
if err != nil {
return audience.Audience{}, err
}

if !c.isOk(resp.StatusCode) {
return audience.Audience{}, fmt.Errorf("failed to update audience in optimizely: %s", aud.Name)
}

defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
respBody, err := c.sendHttpRequest("PATCH", fmt.Sprintf("v2/audiences/%d", aud.ID), bytes.NewBuffer(postBody))
if err != nil {
return audience.Audience{}, err
}

var audienceResp audience.Audience
json.Unmarshal(body, &audienceResp)
json.Unmarshal(respBody, &audienceResp)

return audienceResp, nil
}
39 changes: 24 additions & 15 deletions optimizely/client/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package client
import (
"fmt"
"io"
"io/ioutil"
"net/http"
)

Expand All @@ -11,25 +12,33 @@ type OptimizelyClient struct {
Token string
}

func (c OptimizelyClient) newHttpRequest(method, url string, body io.Reader) (*http.Request, error) {
func (c OptimizelyClient) sendHttpRequest(method, url string, body io.Reader) ([]byte, error) {
req, err := http.NewRequest(method, fmt.Sprintf("%s/%s", c.Address, url), body)
req.Header.Set("Content-type", "application/json")
c.configureToken(req)
if err != nil {
return nil, err
}

return req, err
}

func (c OptimizelyClient) configureToken(req *http.Request) {
req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", c.Token))
}

func (c OptimizelyClient) newEmptyRequest(method, url string) (*http.Request, error) {
req, err := http.NewRequest(method, fmt.Sprintf("%s/%s", c.Address, url), nil)
c.configureToken(req)
if body != nil {
req.Header.Set("Content-type", "application/json")
}

return req, err
}
httpClient := http.Client{}
resp, err := httpClient.Do(req)
if err != nil {
return nil, err
}

defer resp.Body.Close()
respBody, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, err
}

if resp.StatusCode >= 400 {
return nil, fmt.Errorf("HTTP status %d\n\n%s", resp.StatusCode, respBody)
}

func (c OptimizelyClient) isOk(statusCode int) bool {
return statusCode >= 200 && statusCode < 300
return respBody, nil
}
50 changes: 5 additions & 45 deletions optimizely/client/flags.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@ import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"

"github.com/pffreitas/optimizely-terraform-provider/optimizely/flag"
)
Expand Down Expand Up @@ -48,68 +46,30 @@ func (c OptimizelyClient) CreateFlag(feat flag.Flag) (flag.Flag, error) {
return feat, err
}

req, err := c.newHttpRequest("POST", fmt.Sprintf("flags/v1/projects/%d/flags", feat.ProjectId), bytes.NewBuffer(postBody))
if err != nil {
return feat, err
}

httpClient := http.Client{}
resp, err := httpClient.Do(req)
if err != nil {
return feat, err
}

defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
respBody, err := c.sendHttpRequest("POST", fmt.Sprintf("flags/v1/projects/%d/flags", feat.ProjectId), bytes.NewBuffer(postBody))
if err != nil {
return feat, err
}

var featureResp flag.Flag
json.Unmarshal(body, &featureResp)
json.Unmarshal(respBody, &featureResp)

return featureResp, nil
}

func (c OptimizelyClient) GetFlag(projectId int, flagKey string) (flag.Flag, error) {
req, err := c.newHttpRequest("GET", fmt.Sprintf("flags/v1/projects/%d/flags/%s", projectId, flagKey), nil)
if err != nil {
return flag.Flag{}, err
}

httpClient := http.Client{}
resp, err := httpClient.Do(req)
if err != nil {
return flag.Flag{}, err
}

defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
respBody, err := c.sendHttpRequest("GET", fmt.Sprintf("flags/v1/projects/%d/flags/%s", projectId, flagKey), nil)
if err != nil {
return flag.Flag{}, err
}

var flagResp flag.Flag
json.Unmarshal(body, &flagResp)
json.Unmarshal(respBody, &flagResp)

return flagResp, nil
}

func (c OptimizelyClient) DeleteFlag(projectId int, flagKey string) error {

req, err := c.newEmptyRequest("DELETE", fmt.Sprintf("flags/v1/projects/%d/flags/%s", projectId, flagKey))
if err != nil {
return err
}

httpClient := http.Client{}
resp, err := httpClient.Do(req)
if err != nil {
return err
}

defer resp.Body.Close()
_, err = ioutil.ReadAll(resp.Body)

_, err := c.sendHttpRequest("DELETE", fmt.Sprintf("flags/v1/projects/%d/flags/%s", projectId, flagKey), nil)
return err
}
61 changes: 4 additions & 57 deletions optimizely/client/ruleset.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@ import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"

"github.com/pffreitas/optimizely-terraform-provider/optimizely/flag"
)
Expand Down Expand Up @@ -91,23 +89,10 @@ func (c OptimizelyClient) CreateRuleset(flag flag.Flag) error {
return err
}

req, err := c.newHttpRequest("PATCH", fmt.Sprintf("flags/v1/projects/%d/flags/%s/environments/%s/ruleset", flag.ProjectId, flag.Key, env), bytes.NewBuffer(postBody))
_, err = c.sendHttpRequest("PATCH", fmt.Sprintf("flags/v1/projects/%d/flags/%s/environments/%s/ruleset", flag.ProjectId, flag.Key, env), bytes.NewBuffer(postBody))
if err != nil {
return err
}

httpClient := http.Client{}
resp, err := httpClient.Do(req)
if err != nil {
return err
}

defer resp.Body.Close()
_, err = ioutil.ReadAll(resp.Body)
if err != nil {
return err
}

}
return nil
}
Expand All @@ -122,19 +107,7 @@ func (c OptimizelyClient) GetRuleset(flg flag.Flag) (map[string]flag.FeatureEnvi
for env := range flg.Environments {
flagEnv := flag.FeatureEnvironment{}

req, err := c.newEmptyRequest("GET", fmt.Sprintf("flags/v1/projects/%d/flags/%s/environments/%s/ruleset", flg.ProjectId, flg.Key, env))
if err != nil {
return flagEnvs, err
}

httpClient := http.Client{}
resp, err := httpClient.Do(req)
if err != nil {
return flagEnvs, err
}

defer resp.Body.Close()
rulesetResponseBodyStr, err := ioutil.ReadAll(resp.Body)
rulesetResponseBodyStr, err := c.sendHttpRequest("GET", fmt.Sprintf("flags/v1/projects/%d/flags/%s/environments/%s/ruleset", flg.ProjectId, flg.Key, env), nil)
if err != nil {
return flagEnvs, err
}
Expand Down Expand Up @@ -181,23 +154,10 @@ func (c OptimizelyClient) GetRuleset(flg flag.Flag) (map[string]flag.FeatureEnvi
func (c OptimizelyClient) EnableRuleset(flag flag.Flag) error {

for env := range flag.Environments {
req, err := c.newEmptyRequest("POST", fmt.Sprintf("flags/v1/projects/%d/flags/%s/environments/%s/ruleset/enabled", flag.ProjectId, flag.Key, env))
_, err := c.sendHttpRequest("POST", fmt.Sprintf("flags/v1/projects/%d/flags/%s/environments/%s/ruleset/enabled", flag.ProjectId, flag.Key, env), nil)
if err != nil {
return err
}

httpClient := http.Client{}
resp, err := httpClient.Do(req)
if err != nil {
return err
}

defer resp.Body.Close()
_, err = ioutil.ReadAll(resp.Body)
if err != nil {
return err
}

}

return nil
Expand All @@ -206,23 +166,10 @@ func (c OptimizelyClient) EnableRuleset(flag flag.Flag) error {
func (c OptimizelyClient) DisableRuleset(flag flag.Flag) error {

for env := range flag.Environments {
req, err := c.newEmptyRequest("POST", fmt.Sprintf("flags/v1/projects/%d/flags/%s/environments/%s/ruleset/disabled", flag.ProjectId, flag.Key, env))
_, err := c.sendHttpRequest("POST", fmt.Sprintf("flags/v1/projects/%d/flags/%s/environments/%s/ruleset/disabled", flag.ProjectId, flag.Key, env), nil)
if err != nil {
return err
}

httpClient := http.Client{}
resp, err := httpClient.Do(req)
if err != nil {
return err
}

defer resp.Body.Close()
_, err = ioutil.ReadAll(resp.Body)
if err != nil {
return err
}

}

return nil
Expand Down

0 comments on commit 740cfa5

Please sign in to comment.